IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Parcourir les cellules et gerer leur contenu vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Points : 50
    Points
    50
    Par défaut Parcourir les cellules et gerer leur contenu vba
    Bonjour,
    je me permets de vous écrire pour solliciter votre aide.
    je m'explique:

    j'ai un fichier (echantillon pour test) avec en colonne A la ident,colonne B la date ,colonne C immat,colonne D corporel(o/n),colonne E statut et en colonne F le %tage de resp
    ce que je veux faire c'est ça.
    - si j'ai la meme ident en A à la meme date en B avec la meme immat en C alors si en colonne D j'ai du O et N alors je mets tout en "O" sinon je laisse tel quel.
    et si en colonne E , j'ai le statut OPEN et Close alors je mets tout en OPEN sinon je laisse tel quel.
    ET si en colonne F, j'ai 2 resp qui sont differents je prend le plus grand partout.

    je fais ça pour toutes les lignes où j'ai une meme ident,meme date et meme immat.

    j'ai commencé à ecrire un code mais ça marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub test()
    Dim Plage As Range, C As Range, Teste
    Dim Offset As Long
    Dim derlign, i, j, k As Integer
     
    derlign = Range("a65536").End(xlUp).Row
    'Plage = .Range(.[A1].Offset(i, 1), .Cells(.Rows.Count, 1 + i).End(xlUp))
    'With Sheets("New")
     
    For j = 2 To derlign + 1
     
    If Cells(j - 1, 1) = Cells(j, 1) And Cells(j - 1, 2) = Cells(j, 2) And Cells(j - 1, 3) = Cells(j, 3) Then
     
      If Cells(j - 1, 4).Value <> Cells(j, 4).Value Then Range("d" & j - 1).Value = "O" And Range("d" & j) = "O"
     
        End If
     
      If Cells(j - 1, 5).Value <> Cells(j, 5).Value Then Range("e" & j - 1).Value = "OPEN" And Range("e" & j).Value = "OPEN"
     
     
     
    If Cells(j - 1, 6).Value <> Cells(j, 6).Value Then Cells(j - 1, 6).Value = 100 And Cells(j, 4).Value = O
     
    End
     
    Next
     
     
    End Sub
    je vous joint le fichier pour plus d'explication
    merci de votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Je n'ouvre pas les fichiers avec macros...

    Ici
    If Cells(j - 1, 1) = Cells(j, 1) And Cells(j - 1, 2) = Cells(j, 2) And Cells(j - 1, 3) = Cells(j, 3) Then
    If Cells(j - 1, 4).Value <> Cells(j, 4).Value Then Range("d" & j - 1).Value = "O" And Range("d" & j) = "O" End If
    Tu ne peux pas mettre ce AND
    Essaie plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Cells(j - 1, 1) = Cells(j, 1) And Cells(j - 1, 2) = Cells(j, 2) And Cells(j - 1, 3) = Cells(j, 3) Then
      If Cells(j - 1, 4).Value <> Cells(j, 4).Value Then 
          Range("d" & j - 1).Value = "O" 
          Range("d" & j) = "O"
      End If
    End If
    MPi²

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Merci parmi pour l'intervention.
    pour info j'ai enlever les macro dans le fichier
    pour vérifier la 2 eme et la 3 eme condition c'est la ou je bloque.
    je renvoi le fichier sans macro
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Tu n'as qu'à utiliser la même méthode que je t'ai mise pour la 1ere condition.
    Enlève le AND et mets tes résultats sur plusieurs lignes.
    MPi²

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Bonsoir
    j ai fait comme tu as dit mais sa l fait que pour la colonne D mais rien en E et F.
    en plus il ne fait rien sur les suivantes.
    merci de votre aide

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bon, essaie comme ceci et essaie de comprendre ce que ça fait.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub test()
        Dim derlign As Long, j As Long
        Dim Valeur
     
        derlign = Range("a65536").End(xlUp).Row
     
        For j = 2 To derlign + 1
            If Cells(j - 1, 1) = Cells(j, 1) And Cells(j - 1, 2) = Cells(j, 2) And Cells(j - 1, 3) = Cells(j, 3) Then
                If Cells(j - 1, 4).Value <> Cells(j, 4).Value Then
                    Range("d" & j - 1).Value = "O"
                    Range("d" & j) = "O"
                End If
                If Cells(j - 1, 5).Value <> Cells(j, 5).Value Then
                    Range("e" & j - 1).Value = "OPEN"
                    Range("e" & j).Value = "OPEN"
                End If
                If Cells(j - 1, 6).Value <> Cells(j, 6).Value Then
                    Valeur = Application.WorksheetFunction.Max(Cells(j - 1, 6).Value, Cells(j, 6).Value)
                    Range("f" & j - 1).Value = Valeur
                    Range("f" & j).Value = Valeur
                End If
            End If
        Next
    End Sub
    MPi²

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 108
    Points : 9 917
    Points
    9 917
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une autre approche, pour éviter la multiplication des AND et des If
    Bien sûr, je suis (comme probablement parmi) parti du principe qu'il les données sont triées vu la façon dont tu les parcours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub test()
    Dim j As Long, i As Long, Valeur
        For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
            If Join(Application.Transpose(Application.Transpose(Cells(j, 1).Resize(1, 3).Offset(-1, 0).Value))) = _
               Join(Application.Transpose(Application.Transpose(Cells(j, 1).Resize(1, 3).Value))) Then
                For i = 4 To 6
                    If Cells(j - 1, i).Value <> Cells(j, i).Value Then
                        Select Case i
                            Case 4: Valeur = "O"
                            Case 5: Valeur = "OPEN"
                            Case 6: Valeur = Application.WorksheetFunction.Max(Cells(j - 1, i).Value, Cells(j, i).Value)
                        End Select
     
                        Cells(j - 1, i).Resize(2, 1).Value = Valeur
                    End If
                Next i
            End If
        Next j
    End Sub

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Intéressant comme méthode Joe.Levrai
    MPi²

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Merci beaucoup Joe.Levrai et Parmi.
    j'y suis presque.
    je viens de me rendre compte la 3eme condition n'est pas la bonne.
    En effet au lieu de prendre le max en colonne F, je veux prendre le resp de la ligne qui etait initialement à OPEN en colonne E.
    Merci de votre aide
    cdt

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 108
    Points : 9 917
    Points
    9 917
    Billets dans le blog
    5
    Par défaut
    Bonjour,
    en inversant l'ordre de traitement des colonnes (on commence par la 6 et on fini par la 4)
    et en testant la cellule qui contient OPEN

    ça devrait être ce que tu souhaites ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub test()
    Dim j As Long, i As Long, Valeur
        For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
            If Join(Application.Transpose(Application.Transpose(Cells(j, 1).Resize(1, 3).Offset(-1, 0).Value))) = _
               Join(Application.Transpose(Application.Transpose(Cells(j, 1).Resize(1, 3).Value))) Then
                For i = 6 To 4 Step -1
                    If Cells(j - 1, i).Value <> Cells(j, i).Value Then
                        Select Case i
                            Case 4: Valeur = "O"
                            Case 5: Valeur = "OPEN"
                            Case 6
                                Valeur = IIf(Cells(j - 1, 5).Value = "OPEN", Cells(j - 1, i).Value, Cells(j, i).Value)
                        End Select
     
                        Cells(j - 1, i).Resize(2, 1).Value = Valeur
                    End If
                Next i
            End If
        Next j
    End Sub

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    c'est exactement ce que je veux.
    Mille merci joe.levrai.
    merci egalement à parmi.

    parcontre je n'ai bien compri ce que fait ces 2 lignes de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Join(Application.Transpose(Application.Transpose(Cells(j, 1).Resize(1, 3).Offset(-1, 0).Value))) = _
               Join(Application.Transpose(Application.Transpose(Cells(j, 1).Resize(1, 3).Value))) Then
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIf(Cells(j - 1, 5).Value = "OPEN", Cells(j - 1, i).Value, Cells(j, i).Value)

  12. #12
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 108
    Points : 9 917
    Points
    9 917
    Billets dans le blog
    5
    Par défaut
    Join est une méthode qui va prendre tous les éléments d'un tableau unidimensionnel, et les concaténer en une seule chaine.
    On peut spécifier un séparateur entre chaque élément, là on en a pas besoin

    Etant donné qu'une plage de cellule est toujours en deux dimensions, si on est sur une seule ligne, on doit transposer deux fois de suite :

    - première transposition : la ligne devient une colonne mais le tableau est toujours en 2D
    - seconde transposition : la colonne revient en ligne .... et miracle, le tableau repasse en 1D

    (si on était sur une seule colonne, seule la seconde transposition est nécessaire)

    On obtient donc une chaine de caractère composée de la réunion des trois cellules, pour tes deux lignes.
    On regarde si les chaines sont identiques et on sait si les lignes sont identiques comme ça.


    Iif est un traitement conditionnel (comme un traitement If/End If), à la différence qu'on lui demande de vérifier une condition et de faire Action1 si c'est vrai et Action2 si c'est faux

    Iif(MaCondition, Traitement si Vrai, Traitement si Faux)
    Ca evite le If/Else/End If .... mais attention quand on utilise ça car les deux Action sont évaluées lors du traitement. Donc il faut obligatoirement que les 2 actions sont possibles :

    - Iif(i = 1, j = 2, j =3) ==> aucun souci
    - Iif(i <> 0, j = 1 / i, j = 25) ==> ça va planter si i = 0 ... car VBA va évaluer quand même l'Action1 et faire 1/0 dans son test (division par 0)

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    mille merci
    je suis impressioné .
    je passe beaucoup de temp pour comprendre les lignes de code.
    manque de methodologie je crois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] masquer les colonnes dont toutes les cellules VISIBLES ont leur valeur="N"
    Par sylvaine dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 04/03/2011, 11h57
  2. Parcourir les cellules....
    Par nexusflame dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/04/2010, 11h44
  3. [XL-2007] parcourir les cellules d'une colonne à l'aide d'un index
    Par jolinon dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/04/2009, 17h55
  4. Réponses: 5
    Dernier message: 28/02/2008, 08h44
  5. Regrouper les cellules qui ont un contenu identique
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/01/2008, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo