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 :

Boucle sur 2 colonnes [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut Boucle sur 2 colonnes
    Bonjour,

    J'ai une colonne A et B, je souhaite copier en colonne C la valeur de la colonne A si la valeur de la colonne A est présente dans la colonne B.

    J'ai fais une double boucle mais n'arrive pas à rappatrier en colonne C

    Merci d'avance
    COLONNE A COLONNE B COLONNE C
    19-----------------------RECUP VALEUR 17
    17---------------19

    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
    Sub TRAVAIL()
     
    Dim a As Long
    Dim b As Long
    Dim ColoneCompte
     
    '=========================
    Worksheets("base").Activate
     
    'Boucle COLONNE A
     
    For a = 2 To 999999
        If Range("A" & a).Value = "" Then
            Exit For
        End If
     
        If Range("A" & a).Value <> "" Then
            ColoneCompte = "A"
     
            Else
     
            ColoneCompte = ""
        End If
     
        If ColoneCompte <> "" Then
     
    'Boucle COLONNE B
     
            For b = 2 To 999999
                 If Sheets("base").Range("A" & b).Value = "" Then
                    Exit For
                 End If
     
     
        '===============================================================
     
                    If Worksheets("base").Range("A" & b).Value = Range(ColoneCompte & a).Value Then
     
     
                            Range("C" & a).Value = Range("B" & a).Offset(b, -1).Value
     
     
     
                    'End Select
                   'Debug.Print a, b
                End If
     
     
            Next b
     
        End If
    Next a
    End Sub

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    essayes comme ça :
    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
    Sub travail()
    Dim DerLg As Long, a As Long, i As Long, x As Long
    x = 2
    With Sheets("base")
       DerLg = .Range("a" & .Rows.Count).End(xlUp).Row
       For a = 2 To DerLg
          For i = 2 To DerLg
             If .Range("B" & i) = .Range("A" & a) Then
                .Range("C" & x) = .Range("A" & a)
                x = x + 1
             End If
          Next i
       Next a
    End With
     
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Sans faire de boucle (si j'ai bien saisie ce que tu veux ?) :
    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
     
    Sub Recup()
     
        Dim DL As Long
     
        'recherhe de la dernière ligne en colonne A
        DL = Range("A" & Rows.Count).End(xlUp).Row
     
        'défini la formule de recherche et la tire jusqu'au bas de la plage
        Range("C2").Formula = "=if(CountIf($A$2:$A$" & DL & ",B2)<>0,B2,"""")"
        Range("C2").AutoFill Range("C2:C" & DL)
     
        'copie la plage et n'en récupère que les valeurs
        '(les formules utilisées sont supprimées)
        Range("C2:C" & DL).Copy
        Range("C2:C" & DL).PasteSpecial xlPasteValues
     
        'vide le presse papier
        Application.CutCopyMode = False
     
    End Sub
    Hervé.

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Bonjour Theze,

    Ton code correspond presque à ce que j'attends, je me suis peut être mal exprimé, voir tableau ci-dessous:

    Si une valeur de colonne A correspond à une valeur de la colonne B, alors écrit dans la colonne C, la valeur de la colonne A par rapport à la colonne B, si pas de correspondance alors récopie la colonne B.

    En tout cas merci pour votre aide, je suis débutante en VBA

    RefDocNo--------Rvrsl ref.--------boucle theze-------résultat attendu
    1900000025-------vide--------------vide--------------- 1700000205
    1900000025-------vide--------------vide--------------- 1700000205
    1700000205------1900000025-----1900000025--------- 1900000025
    5201784992------5201784992-------vide--------------- 5201784992
    5201785033----oui/janvier2010------vide--------------- oui/janvier2010
    1900080878-------vide--------------vide--------------- 1700000017
    1700000017------1900080878-----1900080878--------- 1900080878

    Bonjour casefayere,

    Merci de votre réponse, votre code ne rappatri pas les éléments souhaités, je me suis surement mal exprimée, voir le message posté à Theze pour de plus amples informations.

    En tout cas merci de votre aide

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour eva_77, Hervé, re le forum
    toujours avec ma 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
    Sub travail()
    Dim DerLg As Long, a As Long, b As Long
     
    With Sheets("base")
       DerLg = .Range("a" & .Rows.Count).End(xlUp).Row
       For a = 2 To DerLg
          For b = 2 To DerLg
             If .Range("A" & a) = .Range("B" & b) Then
                .Range("C" & a) = .Range("A" & b)
             End If
          Next b
          If .Range("C" & b) = "" Then .Range("C" & b) = .Range("B" & b)
       Next a
    End With
     
    End Sub
    dis-moi tout
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Une variante qui devrait s'exécuter plus rapidement, surtout s'il y a un grand nombre de lignes
    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
    ub Eva()
    Dim vA As Variant, vB As Variant, vC As Variant
    Dim oSh As Excel.Worksheet, lDerlig As Long
    Dim i As Long, k As Long
     
    Set oSh = ThisWorkbook.Worksheets("base")
    lDerlig = oSh.Range("A" & Application.Rows.Count).End(xlUp).Row
     
    vA = oSh.Range("A1:A" & lDerlig + 1).Value
    vB = oSh.Range("B1:B" & lDerlig).Value
    vC = oSh.Range("C1:C" & lDerlig).Value
     
    For i = 2 To lDerlig
        For k = 2 To lDerlig
            If vB(k, 1) = vA(i, 1) Then Exit For
        Next k
        vC(i, 1) = IIf(k <= lDerlig, vA(k, 1), vB(i, 1))
    Next i
     
    oSh.Range("C1:C" & lDerlig).Value = vC
     
    vA = Empty
    vB = Empty
    vC = Empty
    Set oSh = Nothing
    End Sub
    Cordialement,

    PGZ

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour Pierre,
    eh oui j'ai vu ton prénom, c'est ça les nouvelles dispositions
    Que tu as raison, je viens de tester les deux codes sur 500 lignes et le mien a ramé, le tien s'est réalisé en deux coups de cuillère à pot
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Merci à tous les 2,

    Vos codes fonctionnent, d'ailleurs je vais étudier le code de pgz à la métode Louis XVI (à tête reposée) car j'ai pas tout compris.

    En tout cas c'est du boulot de PRO

    Ci-dessous autre problèmatique :

    Si la colonne B contient le mot oui, alors recopie moi cette valeur en colonne C en lieu et place de la valeur trouvée.

    Si aucune valeur commune entre colonne A et B et que la colonne B est vide, alors recopie moi en colonne C la colonne A.

    nb / je n'ai pas eu vos messages en instantané, j'étais pourtant connectée, c'est normal ?

    Merci de vous être consacrés à mon problème

  9. #9
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    C'est l'enquiquineuse de service,

    J'enlève la 2ème contrainte du message précedent :

    Si aucune valeur commune entre colonne A et B et que la colonne B est vide, alors recopie moi en colonne C la colonne A.

    Désolée et merci encore

  10. #10
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    je pense qu'avec le code de Pierre, quand tu l'aura décortiqué et compris, tu pourras adapter tes nouvelles contraintes, ça aurait été plus lisible sur le mien mais il n'est pas performant, en effet, déjà avec les conditions existantes, comme je l'ai dit plus haut, mon code rame si on agit sur beaucoup de lignes, 500 dans mon essai (une dizaine de secondes sur mon PC)

    Bonne lecture, bonne analyse et bonne fin de Weed-end.

    PS :
    nb / je n'ai pas eu vos messages en instantané, j'étais pourtant connectée, c'est normal ?
    Cliques régulièrement sur l'icone du dossier "Macros et VBA Excel"
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  11. #11
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir

    Citation Envoyé par eva_77 Voir le message
    Si la colonne B contient le mot oui, alors recopie moi cette valeur en colonne C en lieu et place de la valeur trouvée.
    Si j'ai bien compris :
    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 Eva()
    Dim vA As Variant, vB As Variant, vC As Variant
    Dim oSh As Excel.Worksheet, lDerlig As Long
    Dim i As Long, k As Long
     
    Set oSh = ThisWorkbook.Worksheets("base")
    lDerlig = oSh.Range("A" & Application.Rows.Count).End(xlUp).Row
     
    vA = oSh.Range("A1:A" & lDerlig + 1).Value
    vB = oSh.Range("B1:B" & lDerlig).Value
    vC = oSh.Range("C1:C" & lDerlig).Value
     
    For i = 2 To lDerlig
        If InStr(1, StrConv(vB(i, 1), vbUpperCase), "OUI") > 0 Then
            vC(i, 1) = vB(i, 1)
        Else
            For k = 2 To lDerlig
                If vB(k, 1) = vA(i, 1) Then Exit For
            Next k
            vC(i, 1) = IIf(k <= lDerlig, vA(k, 1), vB(i, 1))
        End If
    Next i
     
    oSh.Range("C1:C" & lDerlig).Value = vC
     
    vA = Empty
    vB = Empty
    vC = Empty
    End Sub
    J'ai rajouté le StrConv pour trouver un oui, quelque soit la casse : Oui, oui, OUI, ...

    Cordialement,

    PGZ

  12. #12
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Merci Pierre & dominique,

    C'est du travail d'orfevrevrie, que vous dire de plus !!!

    Desireuse de comprendre de ce qu'on me transmet, pourriez vous pgz m'expliquer votre code ligne par ligne.

    En tout cas c'est génial et le but du jeu en ce qui me concerne c'est de savoir ce qu'il se passe afin de me débrouiller par moi- même aussi novice que je sois.

    En tout cas j'admire votre travail et si vous donnez des cours, je suis preneuse.

    VBE c'est un gain de temps et d'énergie même si cela ne remplace pas l'intelligence.

    Un grand Merci à tous les deux

    Je tiens à remercier Pierre & Dominique,

    J'habite dans le 77 et si vous n'êtes pas trop loin,je pourrais vous payer un ptit resto (pas un trop gros j'ai pas les moyens!!!) car vous le meritez bien, vous m'avez plus que bien aidez et surtout vous avez été très réactif dans la mesure où je suis une nouvelle abonnée et ai eu des réponses à mon problème en un temps record.

    Vous êtes geniaux et aimerais vous rendre l'appareil.

    Merci encore quel TALENT !!!

  13. #13
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    Et merci pour tes remerciements chaleureux, pas très fréquents finalement.
    Citation Envoyé par eva_77 Voir le message
    Desireuse de comprendre de ce qu'on me transmet, pourriez vous pgz m'expliquer votre code ligne par ligne.
    En premier il y a un choix à faire :
    • travailler avec les cellules de la feuille Excel
    • travailler avec des tableaux de données contenus dans des variables.


    J'ai choisi la deuxième parce que l'exécution est beaucoup plus rapide dès que le nombre de ligne devient important : VBA travaille vite mais toutes les opérations d'échange avec des objets comme la feuille Excel sont longues : des µs d'un côté, des ms de l'autre pour fixer un ordre de grandeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim vA As Variant, vB As Variant, vC As Variant
    Dim oSh As Excel.Worksheet, lDerlig As Long
    Dim i As Long, k As Long
    déclaration des variables : on déclare toutes les variables utilisées, avec un type le plus précis pour bénéficier:
    • de l'intellisense de l'éditeur VB (fenêtre qui s'ouvre pour proposer les méthodes et propriétés des objets dès qu'on tape un "."
    • pour bénéficier de la pleine capacité du compilateur à détecter des erreurs de syntaxes.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set oSh = ThisWorkbook.Worksheets("base")
    lDerlig = oSh.Range("A" & Application.Rows.Count).End(xlUp).Row
    • On dépose une référence de la feuille concernée dans la variable oSh, ce qui nous permettra d'écrire des références précise comme "oSh.Range(...)", plutôt que "Range(...)" doit la signification dépend de la feuille sélectionnée.
    • On cherche le numéro de la dernière ligne utilisée dans la colonne A et on range dans lDerLig


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vA = oSh.Range("A1:A" & lDerlig + 1).Value
    vB = oSh.Range("B1:B" & lDerlig).Value
    vC = oSh.Range("C1:C" & lDerlig).Value
    On charge dans 3 variables de type variant, chacune des colonnes A, B et C de la ligne 2 à lDerLig. Pour A, on charge 1 ligne de plus, on verra pourquoi plus loin.
    vA et vB contiennent les données d'entrée et vC recevra le résultat.

    Quand on charge une zone dans un variant, on obtient toujours un tableau à 2 dimensions, même quand la zone n'a qu'une ligne ou qu'une colonne. Si la zone ne contient qu'une cellule ce n'est plus un tableau mais une donnée simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 2 To lDerlig
        ...
    Next i
    On scrute les différentes lignes une part une. Pour chaque i, on veut calculer vC(i,1).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If InStr(1, StrConv(vB(i, 1), vbUpperCase), "OUI") > 0 Then
            vC(i, 1) = vB(i, 1)
        Else
           ...
        End If
    Si en vB (et donc au départ en colonne B) la valeur contient "oui" et quelle que soit la casse, alors en C =B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i = 2 To lDerlig
        If ... Then
            vC(i, 1) = vB(i, 1)
        Else
            For k = 2 To lDerlig
                If vB(k, 1) = vA(i, 1) Then Exit For
            Next k
            vC(i, 1) = IIf(k <= lDerlig, vA(k, 1), vB(i, 1))
        End If
    Next i
    Sinon, avec la boucle For k ... Next, on cherche en B s'il y a une valeur = à celle de la ligne i en colonne A.
    Si on netrouve pas, on sort de la boucle avec k = lDerLig+1. Si on trouve, on sort avec un k indiquant la ligne de la colonne B qui contient la valeur recherchée et k <= lDerlig, puisque lDerLig est la fin de la colonne B.

    Il suffit alors de regarder si k est > lderlig on fait C(i) = B(i); et sinon (on a trouvé A(i) en B(k)) on fait C(i) = A(k), ce qui était demandé.

    Pour faire ce test, j'aurais pu utiliser un If Then Else. Comme j'ai utilisé un IIF, les 2 termes vA(k,1), vB(i,1) sont toujours évalués même si seulement 1 est utilisé. Or quand la valeur A(i) n'existe pas en B, on ressort comme on l'a vu avec k = lderlig +1. Il faut donc, même si on ne s'en sert pas que vA(lDerlIg+1,1) existe, ce qui explique le chargement particulier de vA signalé plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    oSh.Range("C1:C" & lDerlig).Value = vC
     
    vA = Empty
    vB = Empty
    vC = Empty
    On écrit le tableau vC dans la colonne C de la feuille Excel. Et on libère les variables. Je vois d'ailleurs qu'il manque Ce qui n'est pas bien du tout.

    EN espérant que cela t'aide et cordialement,

    PGZ

  14. #14
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour le forum, Pierre, Eva

    Oh ! combien je regrette de ne pas habiter dans le 77, juste pour etre avec toi, autour d'un repas Eva (j'amène le champagne), mais comme nous ne sommes pas sur un site de rencontre , je vais rester sérieux, en tout cas merci, comme dit Pierre, il y a quelques réactions sympahiques et chaleureuses mais la tienne m'a fait vraiement plaisir. Je veux bien expliquer mon code (plus rudimentaire que celui de Pierre) mais si tu l'as essayé, tu as du te rendre compte qu'il est beaucoup moins rapide si de nombreuses lignes sont à utiliser (comme je l'avais déjà stipulé).
    Sub travail()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim DerLg As Long, a As Long, b As Long
    peuvent être déclarées en integer plus limité en capacité mais plus rapide, tu trouveras facilement la différence sur le net

    évite de répêter le nom de la feuille, tout ce qui fait référence à cette feuille sera précédé d'un "." comme ci-dessous .Range("a" & .Rows.Count" remplace "sheets("base").range("a" & sheets("base").Rows.Count"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLg = .Range("a" & .Rows.Count).End(xlUp).Row
    on donne à la variable le nombre de ligne utilisées en partant du bas, perso je préfère cette syntaxe travaillant sur excel 2007 qui possède beaucoup plus de lignes
    une première boucle dont la variable"a" garde la valeur tant que la 2eme boucle n'est pas terminé
    la seconde boucle qui, quand elle atteindra la valeur de Derlg permettra d'incrémenter la première boucle et reviendra à 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If .Range("A" & a) = .Range("B" & b) Then
    'donc au départ => si range("A2") = range("B2")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("C" & a) = .Range("A" & b)
    'meme principe
    fin de la condition

    on incrémente la deuxième boucle (boucle intérieure) jusque derlg(derniere ligne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If .Range("C" & b) = "" Then .Range("C" & b) = .Range("B" & b)
    avant d'incrémenter la variable "a", on verifie que => si C2 est vide, C2 = B2
    on incrémente la première boucle jusque derlg(derniere ligne)
    fin de référence à feuille "base"
    End Sub

    Voilà, bonne journée, bon courage
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  15. #15
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Bonsoir Pierre, Dominique,

    Je vous remercie pour les explications, j'ai plus qu'a étudier.

    En tout cas merci pour tout, je pense que l'on sera amené à se revoir "si je puis dire", car je débute en VBA et la route est longue.

    Voilà, je vous souhaite une bonne soirée à tous les deux et vous dis à bientôt

  16. #16
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Bonjour me revoilà,

    J'ai rajoutée 2 boucles for a et for b seulement, les boucles suivantes ne s'exécutent pas, j'ai beau bouger des éléments rien n'y fait, pourriez vous m'expliquer pourquoi la boucle for i ne s'enclenche pas.

    Un grand merci à vous
    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
     
    Sub Reversal_essai()
     
    Dim vA As Variant, vB As Variant, vC As Variant
    Dim oSh As Excel.Worksheet, lDerlig As Long, lDerligconca As Long
    Dim i As Long, k As Long
    Dim a As Long, b As Long
     
    Set oSh = ThisWorkbook.Worksheets("base")
    lDerlig = oSh.Range("A" & Application.Rows.Count).End(xlUp).Row
    lDerligconca = oSh.Range("E" & Application.Rows.Count).End(xlUp).Row
     
    vA = oSh.Range("A1:A" & lDerlig + 1).Value
    vB = oSh.Range("B1:B" & lDerlig).Value
    vC = oSh.Range("C1:C" & lDerlig).Value
     
    For a = 2 To lDerligconca
        Cells(a, "A").Value = Cells(a, "E").Value & Cells(a, "D").Value & Cells(a, "AO").Value
    Next a
     
     
    For b = 2 To lDerligconca
        Cells(b, "B").Value = IIf(Cells(b, "F").Value <> "", Cells(b, "F").Value & Cells(b, "D").Value & Cells(b, "AO").Value, "")
    Next b
     
    '--------------------------------------------------------------
     
    For i = 2 To lDerlig
        If InStr(1, StrConv(vB(i, 1), vbUpperCase), "OUI") > 0 Then
            vC(i, 1) = vB(i, 1)
        Else
            For k = 2 To lDerlig
                If vB(k, 1) = vA(i, 1) Then Exit For
            Next k
            vC(i, 1) = IIf(k <= lDerlig, vA(k, 1), vB(i, 1))
        End If
    Next i
     
     
    oSh.Range("C1:C" & lDerlig).Value = vC
     
    Set oSh = Nothing
    vA = Empty
    vB = Empty
    vC = Empty
    ' J'ai rajouté le StrConv pour trouver un oui, quelque soit la casse : Oui
     
    End Sub

  17. #17
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Je pense que la boucle For ... Next doit bien s'exécuter (si tu mets un point d'arrêt, tu devrais le voir). Par contre tu modifies le contenu des colonnes A et B APRES avoir chargé leurs valeurs dans vA et vB. DOnc cela ne sert à rien.
    En plus cette façon de modifier les valeurs casse l'esprit du codage d'origine qui prenait bien soin de ne pas travailler avec les cellules de la feuille.

    Je vois que tu as ajouté une variable lDerLigConca. Cela veut dire que la colonne E peut être de longueur différente de celle de A? Finalement, il faut chercher la derligne à traiter dans quelle(s) colonne(s)?
    Si tu éclaircis ce point, il deviendra facile de corriger ton code.

    COrdialement,

    PGZ

  18. #18
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Bonjour,

    En fait la colonne E est celle qui était en A, je m'explique, j'ai inserer des nouvelles colonnes et en colonne A et B.

    Par rapport au code précedent ma colonne A est maintenant la colonne E, ce que j'ai voulu faire c'est remplir les colonnes A et B avec un concatener boucle for a et for b et une fois celle-ci rempli, fait tourner les boucles for i et for k car elles s'appuie sur ces 2 colonnes.

    J'ai rajouter une variable lDerLigConca comme colonne d'appuie (colonne E) pour les boucles for a et for b, car les colonnes A et B sont vides c'est les boucles for a et b qui remplissent ces colonnes.

    Ce que je ne comprend pas c'est que le code s'arrête à la boucle b et le reste ne s'éxécute pas, faut'il une instruction entre la boucle b et la boucle i.

    J'espère que ce n'est pas trop brouillon, en tout cas merci encore

  19. #19
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Hello.

    Si la colonne A est vide, après exécution de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lDerlig = oSh.Range("A" & Application.Rows.Count).End(xlUp).Row
    lDerlig contient 1.

    Et est fini avant d'avoir commencé.

    Si j'ai bien compris, ce code devrait fonctionner.
    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
    Sub Reversal_essai()
     
    Dim vA As Variant, vB As Variant, vC As Variant, vD As Variant, vE As Variant, vF As Variant, vAO As Variant
    Dim oSh As Excel.Worksheet, lDerlig As Long
    Dim i As Long, k As Long
     
    Set oSh = ThisWorkbook.Worksheets("base")
    lDerlig = oSh.Range("E" & Application.Rows.Count).End(xlUp).Row
     
    vA = oSh.Range("A1:A" & lDerlig + 1).Value
    vB = oSh.Range("B1:B" & lDerlig).Value
    vC = oSh.Range("C1:C" & lDerlig).Value
    vD = oSh.Range("D1:D" & lDerlig).Value
    vE = oSh.Range("E1:E" & lDerlig).Value
    vF = oSh.Range("F1:F" & lDerlig).Value
    vAO = oSh.Range("AO1:AO" & lDerlig).Value
     
    'renseignement col A et B
    For i = 2 To lDerlig
        vA(i, 1) = vE(i, 1) & vD(i, 1) & vAO(i, 1)
        vB(i, 1) = IIf(vF(i, 1) <> "", vF(i, 1), vD(i, 1) & vAO(i, 1))
    Next i
     
    'renseignement col C
    For i = 2 To lDerlig
        If InStr(1, StrConv(vB(i, 1), vbUpperCase), "OUI") > 0 Then
            vC(i, 1) = vB(i, 1)
        Else
            For k = 2 To lDerlig
                If vB(k, 1) = vA(i, 1) Then Exit For
            Next k
            vC(i, 1) = IIf(k <= lDerlig, vA(k, 1), vB(i, 1))
        End If
    Next i
     
     
    oSh.Range("C1:C" & lDerlig).Value = vC
     
    Set oSh = Nothing
    vA = Empty
    vB = Empty
    vC = Empty
    vD = Empty
    vE = Empty
    vF = Empty
    vAO = Empty
     
    End Sub
    Tu n'as pas besoin de créer une variable pour chaque boucle For ... Next quand elles ne sont pas imbriquées.

    Cordialement,

    PGZ

  20. #20
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Par défaut
    Bonsoir Pierre,

    Déja merci pour ton retour, désolée de t'enquiquiner encore.

    Le code disfonctionne, seul la colonne C se remplie, dans cette colonne est ramenée :

    * le code à concatener la colone D et AO,même si F est vide ( n'a concatener que les lignes vides)

    *les valeurs de la colonne F et n'a pas concatener

    A et B ne sont pas remplies.

    Je cherche de mon coté, dur dur VBA, mais je suis tétue et entétée

    En tout cas merci encore

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2003] Macro avec boucle sur une colonne et condition sur une autre
    Par Isabelle86 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/10/2010, 10h31
  2. Boucle sur plusieurs colonnes définies à l'avance
    Par fuyo2004 dans le forum Excel
    Réponses: 5
    Dernier message: 28/04/2010, 11h26
  3. boucle sur les colonne bloquée
    Par laurai dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/09/2008, 15h41
  4. [phpBB][2] Faire une boucle sur plusieurs colonnes
    Par Vinuto dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 28/09/2007, 10h45
  5. [FPDF] une boucle sur trois colonnes
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/05/2007, 14h33

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