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 :

[VBA E] Problème de boucles - Structure de code


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [VBA E] Problème de boucles - Structure de code
    Bonjour,

    Je cherche à automatiser le traitement d'information sous Excel grâce au VBA.
    Je m'y suis donc mis pour l'occasion, et j'ai créé le code ci-dessous. Celui-ci doit être totalement "non optimisé", voire aberrant pour des habitués de la programmation. Soyez donc indulgent avec moi !
    Ma priorité est que ce code marche. Je le retravaillerai ensuite pour qu’il soit optimisé. Je suis donc ouvert à toutes remarques/suggestions pour ce dernier point.

    Mais j'ai un problème avec le code que j'ai créé :

    Ce morceau de code utilise les onglets "NEW_AD", "REFEX" et "Liste E". Le but est d'insérer dans l'onglet "Liste E" certaines lignes. J'ai fait des boucles dans des boucles, j'avoue que me suis un peu perdu. Le traitement se lance bien, mais j'ai l'impression que l'incrémentation ne se fait pas, qu'il traite toujours la même ligne.

    Pouvez-vous m'aider ?
    Je joins le fichier excel avec le code complet si ça peut vous aider.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Private Sub CommandButton5_Click()
     
    Dim colonneADVid
    Dim ligneADVid
    Dim colonneRefVid
    Dim ligneRefVid
    Dim ligneAD
    Dim ligneADNew
    Dim ligneRef
    Dim idAD
    Dim idADE
    Dim idCompl
    Dim idRefex
    Dim idNew
     
     
    '''''''' Repère la fin des données de la feuille NEW_AD
    Sheets("NEW_AD").Select
    ActiveSheet.Range("C2").Select
    While IsEmpty(ActiveCell) = False
        ActiveCell.Offset(1, 0).Activate
        colonneADVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
        ligneADVid = ActiveCell.Row
    Wend
     
    '''''''' Repère la fin des données de la feuille REFEX
    Sheets("REFEX").Select
    ActiveSheet.Range("B2").Select
    While IsEmpty(ActiveCell) = False
        ActiveCell.Offset(1, 0).Activate
        colonneRefVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
        ligneRefVid = ActiveCell.Row
    Wend
     
    '''''''' Place les valeurs correspondantes dans la feuille Liste E
    ligneAD = 2
    ligneADNew = 2
    ligneRef = 2
    '''''''' Tant qu'on arrive pas à la fin des données de la feuille NEW_AD
    While ligneAD < ligneADVid
       Sheets("NEW_AD").Select
       idAD = ActiveSheet.Range("C" & ligneAD).Value
       idADE = Left(idAD, 1)
    '''''''' Vérifie si le premier caractère est un chiffre
       If IsNumeric(idADE) Then
    '''''''' Boucle tant qu'on arrive pas à la fin des données de l'onglet REFEX
            Do Until ligneRef = ligneRefVid + 1
                Sheets("NEW_AD").Select
                idCompl = ActiveSheet.Range("D" & ligneAD).Value
                Sheets("REFEX").Select
                idRefex = ActiveSheet.Range("C" & ligneAD).Value
                If idCompl = idRefex Then
                   Sheets("NEW_AD").Select    
                   ActiveSheet.Range("A" & ligneAD).Select
                    Selection.Copy
                    Sheets("Liste Echus").Select
                    ActiveSheet.Range("A" & ligneADNew).PasteSpecial
                    Sheets("NEW_AD").Select
     
                    ActiveSheet.Range("B" & ligneAD).Select
                    Selection.Copy
                    Sheets("Liste Echus").Select
                    ActiveSheet.Range("B" & ligneADNew).PasteSpecial
                    Sheets("NEW_AD").Select
     
                    ActiveSheet.Range("C" & ligneAD).Select
                    Selection.Copy
                    Sheets("Liste Echus").Select
                    ActiveSheet.Range("C" & ligneADNew).PasteSpecial
                    Sheets("NEW_AD").Select
     
                    ligneADNew = ligneADNew + 1
                    ligneRef = 2
                    Exit Do
                End If
            ligneRef = ligneRef + 1
            Loop
       End If
       ligneAD = ligneAD + 1
    Wend
     
    End Sub
    Même combat pour ce bout de code :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    Private Sub CommandButton3_Click()
     
    Dim colonneADVid
    Dim ligneADVid
    Dim colonneHierVid
    Dim ligneHierVid
    Dim colonneLocVid
    Dim ligneLocVid
    Dim tableauChaine() As String
    Dim finTableau
    Dim ligneM
    Dim ligneHier
    Dim ligneHierTemp
    Dim ligneLoc
    Dim ligneAD
    Dim nompreAD
    Dim nomAD
    Dim preAD
    Dim nomHier
    Dim preHier
    Dim nomLocal
     
     
    Sheets("AD").Select
    ActiveSheet.Range("B2").Select
     
    ' Repère la première cellule vide de la feuille AD
    While IsEmpty(ActiveCell) = False
        ActiveCell.Offset(1, 0).Activate
        colonneADVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
        ligneADVid = ActiveCell.Row
    Wend
     
    ' Repère la première cellule vide de la feuille A_HIERAR
     Sheets("A_HIERAR").Select
     ActiveSheet.Range("B2").Select
     While IsEmpty(ActiveCell) = False
         ActiveCell.Offset(1, 0).Activate
         colonneHierVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
         ligneHierVid = ActiveCell.Row
     Wend
     
    ' Repère la première cellule vide de la feuille A_LOCAL
     Sheets("A_LOCAL").Select
     ActiveSheet.Range("B2").Select
     While IsEmpty(ActiveCell) = False
        ActiveCell.Offset(1, 0).Activate
        colonneLocVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
        ligneLocVid = ActiveCell.Row
     Wend
     
     
    ' Place les valeurs correspondantes dans la feuille Liste M en fonction des données de la feuille A_HIERAR
    ligneAD = 2
    ligneM = 2
    ligneHier = 2
    ligneLoc = 2
     
    While ligneAD < ligneADVid
       Sheets("AD").Select
       nompreAD = ActiveSheet.Range("C" & ligneAD).Value
     
       If nompreAD = "" Then
            ActiveSheet.Range("C" & ligneAD).Value = "Case1 Case2 Case3"
            nompreAD = ActiveSheet.Range("C" & ligneAD).Value
       End If
     
       tableauChaine = Split(nompreAD, " ")
       nomAD = tableauChaine(0)
       preAD = tableauChaine(1)
       If UBound(tableauChaine) > 1 Then
            Do Until ligneHier = ligneHierVid
                Sheets("A_HIERAR").Select
                nomHier = ActiveSheet.Range("B" & ligneHier).Value
                preHier = ActiveSheet.Range("C" & ligneHier).Value
                If nomAD = nomHier Then
                    If preAD = preHier Then
                          Sheets("AD").Select
     
                          ActiveSheet.Range("B" & ligneAD).Select
                          Selection.Copy
                          Sheets("Liste M").Select
                          ActiveSheet.Range("A" & ligneM).PasteSpecial
                          Sheets("AD").Select
     
                          ActiveSheet.Range("C" & ligneAD).Select
                          Selection.Copy
                          Sheets("Liste M").Select
                          ActiveSheet.Range("B" & ligneM).PasteSpecial
                          Sheets("AD").Select
     
                          ActiveSheet.Range("D" & ligneAD).Select
                          Selection.Copy
                          Sheets("Liste M").Select
                          ActiveSheet.Range("C" & ligneM).PasteSpecial
                          Sheets("AD").Select
     
                          ActiveSheet.Rows(ActiveCell.Row).EntireRow.Delete
                          ligneHier = 2
                          ligneM = ligneM + 1
                    End If
                    Else
                    ligneHier = ligneHier + 1
                End If
            Loop
            ligneAD = ligneAD + 1
        Else
            ligneAD = ligneAD + 1
       End If
    Wend
     
    ' Repère la première cellule vide de la feuille AD
    Sheets("AD").Select
    ActiveSheet.Range("C2").Select
     
    While IsEmpty(ActiveCell) = False
        ActiveCell.Offset(1, 0).Activate
        colonneADVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
        ligneADVid = ActiveCell.Row
    Wend
     
    ' Place les valeurs correspondantes dans la feuille Liste M en fonction des données de la feuille A_LOCAL
    ligneAD = 2
    ligneM = 2
    ligneHier = 2
    ligneLoc = 2
     
    While ligneAD < ligneADVid
       Sheets("AD").Select
       nompreAD = ActiveSheet.Range("C" & ligneAD).Value
       tableauChaine = Split(nompreAD, " ")
       nomAD = tableauChaine(0)
       preAD = tableauChaine(1)
       If UBound(tableauChaine) > 1 Then
            Do Until ligneHier = ligneHierVid
                Sheets("A_LOCAL").Select
                nomHier = ActiveSheet.Range("A" & ligneHier).Value
                preHier = ActiveSheet.Range("B" & ligneHier).Value
                If nomAD = nomHier Then
                    If preAD = preHier Then
                          Sheets("AD").Select
     
                          ActiveSheet.Range("B" & ligneAD).Select
                          Selection.Copy
                          Sheets("Liste M").Select
                          ActiveSheet.Range("A" & ligneM).PasteSpecial
                          Sheets("AD").Select
     
                          ActiveSheet.Range("C" & ligneAD).Select
                          Selection.Copy
                          Sheets("Liste M").Select
                          ActiveSheet.Range("B" & ligneM).PasteSpecial
                          Sheets("AD").Select
     
                          ActiveSheet.Range("D" & ligneAD).Select
                          Selection.Copy
                          Sheets("Liste M").Select
                          ActiveSheet.Range("C" & ligneM).PasteSpecial
                          Sheets("AD").Select
     
                          ActiveSheet.Rows(ActiveCell.Row).EntireRow.Delete
                          ligneHier = 2
                          ligneM = ligneM + 1
                    Else
                        ligneHier = ligneHier + 1
                    End If
                Else
                ligneHier = ligneHier + 1
                End If
            Loop
            ligneAD = ligneAD + 1
       Else
            ligneAD = ligneAD + 1
       End If
    Wend
     
    End Sub
    Merci par avance.
    Bruno.
    Fichiers attachés Fichiers attachés

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    somebody have an idea?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je donne une dernière chance à ce topic.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    cool man
    c'est pas qu'on veuille pas t'aider. faut le temps de mettre le nez dedans. si tu nous aidais en disant par exemple, j'ai déroulé mon code avec F8 et c'est a cette ligne que ça va pas, ça serais bien, mais la, là seule solution pour nous pour voir ou ça déconne serait de reconstituer ton programme, ce qui n'est pas forcement tres aisé, et de plus c'est parfois difficile de comprendre la logique des autres

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Pour ma part, j'éviterai les Select et les Activate, sauf si c'est pour montrer à l'utilisateur l'avancement de la macro. Mais par exemple dans ce bout de code ou tu recherches la 1ere cellule non vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sheets("NEW_AD").Select
    ActiveSheet.Range("C2").Select
    While IsEmpty(ActiveCell) = False
        ActiveCell.Offset(1, 0).Activate
        colonneADVid = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
        ligneADVid = ActiveCell.Row
    Wend
    ...pas besoin de Select à chaque fois... Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim rg as Range
    Sheets("NEW_AD").Select ' Facultatif
    set rg= Sheets("NEW_AD").Range("C2")
    Do While IsEmpty(rg) = False ' Attention si la cellule contient un chaine de caractere de longueur nulle ie. "", ça sautera la ligne...
        set rg = rg.Offset(1,0)
        colonneADVid = Left$(rg.Address(0, 0), (rg.Column < 27) + 2)
        ligneADVid = rg.Row
        If rg.row = 65536 Then Exit Do
    Loop
    De meme pour les autres boucles.
    Ensuite dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Do Until ligneRef = ligneRefVid + 1
                Sheets("NEW_AD").Select
                idCompl = ActiveSheet.Range("D" & ligneAD).Value
                Sheets("REFEX").Select
                idRefex = ActiveSheet.Range("C" & ligneAD).Value
    2 variables sont utilisées ligneRef et ligneAD, chacune devant servir à parcourir leur feuille respective. Mais ligneRef n'est utilisé que pour boucler, et pas pour parcourir la feuille "REFEX". Donc s'il n'y a pas le meme nbre de ligne dans les 2 feuilles (RFEX et NEW_AD) ca risque de ne pas bien fonctionner... Je pense que tu voulais mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idRefex = ActiveSheet.Range("C" & ligneRef).Value
    Je n'ai pas encore regardé le 2eme code ni le fichier xls, mais le 1er peut deja etre retravaillé...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Je vois que pendant que j'essayais de comprendre, dadavyvy t'a répondu.
    Je te mets quand même ce que j'ai cogité dans mon coin.
    Je ne comprends pas ton "Pastespecial" mais bon.
    Si tu instancies tes feuilles de calculs, tu peux réduire ta première boucle
    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
    '''''''' Tant qu'on arrive pas à la fin des données de la feuille NEW_AD
    Set SN_A = Worksheets("NEW_AD")
    Set SL_E = Worksheets("Liste Echus")
    While ligneAD < ligneADVid
       If IsNumeric(Left(SN_A.Range("C" & ligneAD).Value, 1)) Then
            Do Until ligneRef = ligneRefVid + 1
                If SN_A.Range("D" & ligneAD).Value = _
                   SRefec.Range("C" & ligneAD).Value Then
                    SN_A.Range("A" & ligneAD & ":" & "C" & ligneAD).Copy _
                         destination:=SL_E.Range("A" & ligneADNew)
                    ligneADNew = ligneADNew + 1
                    ligneRef = 2
                    Exit Do
                End If
            ligneRef = ligneRef + 1
            Loop
       End If
       ligneAD = ligneAD + 1
    Wend
    De mon point de vue, tu utilises un grand nombre de variables qui ne sont pas forcément utiles.
    Ensuite, comme tu copies de la colonne A à la colonne C, tu peux le faire en une fois.
    Enfin, je confirme ce que te dit dadavyvy, inutile de sélectionner une feuille, puis l'autre.
    Je vous laisse entre vous.
    Bonne journée

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Merci ousk'. Donc je reprends sur la 2e partie. Comme ce serait trop long d'expliquer bout de code par bout de code. J'ai repris le code entier, allege le code en evitant les Select, Activate, Selection.Copy et PasteSpecial en 2 temps. Et en gros voila les erreurs :
    - melange lors de copier-coller : quand on travaille sur la feuille A_Local, il faut utiliser les variables ligneLoc et autres 'Loc' et non pas les Hier, car elles n'ont pas forcément le même nbre de lignes...
    - quand on supprime une ligne, il faut penser a decrementer le compteur de ligne, sinon on rate des lignes
    En general, il y a 2 boucles, et s'il y a les memes erreurs dans les 2 boucles, j'ai mis les commentaires sur la 1ere. Outre l'allegement du code, les erreurs sont ceux ou il y a un commentaire avec des "***".
    Pour comprendre reellement les erreurs commises il ne faut pas prendre le code tel quel, mais compare avec le code originel et voir les differences, bien sur.
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    Private Sub CommandButton3_Click()
     
    Dim colonneADVid, ligneADVid, colonneHierVid, ligneHierVid, colonneLocVid, ligneLocVid
    Dim tableauChaine() As String
    Dim finTableau
    Dim ligneM, ligneHier, ligneHierTemp, ligneLoc, ligneAD
    Dim nompreAD, nomAD, preAD, nomHier, preHier, nomLocal, nomLoc, preLoc
     
    ' *** Pour alleger le code
    Dim shAD As Worksheet, shHier As Worksheet, shLoc As Worksheet, shM As Worksheet, rg As Range
    Set shAD = Worksheets("AD")
    Set shHier = Worksheet("A_HIERAR")
    Set shLoc = Worksheet("A_LOCAL")
    Set shM = Worksheet("Liste M")
     
    Set rg = shAD.Range("B2")
    ' Repère la première cellule vide de la feuille AD
    Do While IsEmpty(rg) = False
        Set rg = rg.Offset(1, 0)
        colonneADVid = Left$(rg.Address(0, 0), (rg.Column < 27) + 2)
        ligneADVid = rg.Row
    Loop
     
    ' Repère la première cellule vide de la feuille A_HIERAR
    Set rg = shHier.Range("B2")
    Do While IsEmpty(rg) = False
        Set rg = rg.Offset(1, 0)
        colonneHierVid = Left$(rg.Address(0, 0), (rg.Column < 27) + 2)
        ligneHierVid = rg.Row
    Loop
     
    ' Repère la première cellule vide de la feuille A_LOCAL
    Set rg = shLoc.Range("B2")
    While IsEmpty(rg) = False
        Set rg = rg.Offset(1, 0)
        colonneLocVid = Left$(rg.Address(0, 0), (rg.Column < 27) + 2)
        ligneLocVid = rg.Row
    Wend
     
    ' *** Repère la première ligne vide de la feuille M
    ligneM = shM.UsedRange.Rows.Count + 1
     
    ' Place les valeurs correspondantes dans la feuille Liste M en fonction des données de la feuille A_HIERAR
    ligneAD = 2
    ' ligneM = 2 -> *** repartir sur la 1ere ligne vide de M
    ligneHier = 2
     
    While ligneAD < ligneADVid
     
        ' *** code allégé
        If nompreAD = "" Then
             shAD.Range("C" & ligneAD).Value = "Case1 Case2 Case3"
        End If
        nompreAD = shAD.Range("C" & ligneAD).Value
     
        tableauChaine = Split(nompreAD, " ")
        If UBound(tableauChaine) > 1 Then
            ' *** changement de place des 2 lignes suivantes
            nomAD = tableauChaine(0)
            preAD = tableauChaine(1)
            Do Until ligneHier = ligneHierVid
                nomHier = shHier.Range("B" & ligneHier).Value
                preHier = shHier.Range("C" & ligneHier).Value
     
                If nomAD = nomHier And preAD = preHier Then  ' *** Verifier le nom et prenom sinon que faire si le prenom n'est pas bon? (-> l'erreur n'a pas ete commise avec le 2eme boucle)
                    shAD.Range("B" & ligneAD & ":D" & ligneAD).Copy shM.Range("A" & ligneM)
                    ' *** allegement du code de copie des donnees...
                    shAD.Rows(ligneAD).EntireRow.Delete
                    ligneHier = 2
                    ligneM = ligneM + 1
                    ligneAD = ligneAD - 1 ' *** comme on supprime une ligne, et qu'on incremente apres, il faut faire -1
                    Exit Do ' *** sinon on repart depuis le debut sur le feuille Hier
                            ' *** et ca ne sert a rien puisque on supprime la ligne AD
                Else
                    ligneHier = ligneHier + 1
                End If
            Loop
            ligneAD = ligneAD + 1
        Else
            ligneAD = ligneAD + 1
        End If
    Wend
     
    ' Repère la première cellule vide de la feuille AD
    Set rg = shAD.Range("B2")
     
    ' Repère la première cellule vide de la feuille AD
    Do While IsEmpty(rg) = False
        Set rg = rg.Offset(1, 0)
        colonneADVid = Left$(rg.Address(0, 0), (rg.Column < 27) + 2)
        ligneADVid = rg.Row
    Loop
     
    ' Place les valeurs correspondantes dans la feuille Liste M en fonction des données de la feuille A_LOCAL
    ligneAD = 2
    'ligneM = 2 *** Si on repart à 2 on écrase toutes les données de l'extraction d'avant par rapport à la feuille A_HIERAR
    ligneLoc = 2
     
    While ligneAD < ligneADVid
       nompreAD = shAD.Range("C" & ligneAD).Value
       tableauChaine = Split(nompreAD, " ")
       If UBound(tableauChaine) > 1 Then
            nomAD = tableauChaine(0)
            preAD = tableauChaine(1)
            Do Until ligneLoc = ligneLocVid ' *** travaille sur la feuille A_Local => Loc
            ' *** Ai remplacé tous les "Hier" par des "Loc"
                nomLoc = shLoc.Range("A" & ligneLoc).Value
                preLoc = shLoc.Range("B" & ligneLoc).Value
                If nomAD = nomLoc And preAD = preLoc Then
                    shAD.Range("B" & ligneAD & ":D" & ligneAD).Copy shM.Range("A" & ligneM)
                    shAD.Rows(ligneAD).EntireRow.Delete
                    ligneLoc = 2
                    ligneM = ligneM + 1
                    ligneAD = ligneAD - 1
                    Exit Do
                Else
                    ligneLoc = ligneLoc + 1
                End If
            Loop
            ligneAD = ligneAD + 1
       Else
            ligneAD = ligneAD + 1
       End If
    Wend
     
    End Sub

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci à vous pour ces réponses. Je teste tout ça demain, et je vous donne le résultat.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci à vous, j'ai pu optimiser mon code, et surtout le rendre fonctionnel grâce à vos conseils.

    Merci encore, et @+.

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

Discussions similaires

  1. [VBA-E]Problème de code
    Par dado91400 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/03/2007, 21h51
  2. [VBA][Excel] Comment bien structurer son code?
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2007, 19h39
  3. [VBA-E] Problème pour coder une boucle
    Par lord-asriel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/03/2007, 10h10
  4. [VBA-E]Problème de triet effacement de doublon sur boucle
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/09/2006, 11h06
  5. Réponses: 2
    Dernier message: 05/06/2006, 16h53

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