Association Recherche/Copier excel VBA

Résolu/Fermé
Signaler
-
 Prevan -
Bonjour,

voici mon code :

Sub copiercoller()
    
    Dim derCol As Long
    Dim i As Long

    derCol = Sheets("macro").Range("IV1").End(xlToLeft).Column
    For i = 1 To derCol
    
    Sheets("Données brutes").Select
        
        Cells.Find(What:=Cells(1, i).Value, After:=ActiveCell, LookIn _
        :=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False, SearchFormat:=False).Activate
    
    Cells(2, i).Select
    Range(selection, selection.End(xlDown)).Select
    Application.CutCopyMode = False
    selection.Copy
    Sheets("Macro").Select
    Cells(2, i).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    
    Next i

End Sub


Si vous voulez le tester, créer des libellés, dans une feuille notée "Données brutes" sur un nombre aléatoire de colonne, en commençant par la case A1, puis B1, etc. Mettez des données sous ces libellés, n'importe quoi. Créez ensuite une deuxième feuille nommée "macro", puis dans la case A1, mettez le nom d'un des libéllés, dans la A2, un autre, et ainsi de suite, autant que vous voulez et dans l'ordre que vous voulez. N'inventez pas de nouveau libellés bien sur. Telles sont les hypothèses de mon problème.

Mon code est censé rechercher le nom du libellé A1 de la feuille "macro" dans la première ligne de la feuille "données brutes", copier les données sous ce libellé de la feuille "données brutes", et coller ces données dans la case A2 sous le libellé du même nom MAIS de la feuille "macro".

Les données sous les libellés ont un nombre indéfini de ligne bien sur. Tout le code doit donc présenter un caractère relatif.

Je pense n'être vraiment pas loin... par exemple, au lieu de mettre "Cells(2, i).Select" il faut peut être que je choisisse de manière relative la case juste d'au dessous de la recherche... malheureusement, je ne m'en sors pas avec le code !
ou alors c'est au niveau de la fonction recherche que j'ai un problème... Je cale !

Je vous remercie d'avance de votre aide, j'espère avoir été clair :)

N'hésitez pas sinon.

1 réponse

Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 190
Re bonjour,

Je n'étais pas dispo cet aprem.

Pour en revenir à ton problème, c'est tout simplement 2 boucles imbriquées qu'il faut utiliser:
'Déclaration des variables
Dim wsMacro As Worksheet       'Objet worksheet pour la feuille "macro"
Dim wsDonnee As Worksheet    'Objet worksheet pour la feuille "Données brutes"
Dim DerLigMacro As Long
Dim DerLigDonnee As Long
Dim i As Long
Dim j As Long

     Set wsMacro = Worksheets("macro")          'Instance de la feuille "macro"
     Set wsDonnee = Worksheets("Données brutes")  'Instance de la feuille "Données brutes"

     DerLigMacro = wsMacro.Range("IV1").End(xlToLeft).Column
     DerLigDonnee = wsDonnee.Range("IV1").End(xlToLeft).Column

     'Pour chaque cellule de la feuille macro de la ligne 1
     For i = 1 To DerLigMacro
           'Pour chaque cellule de la feuille Données brutes de la ligne 1
           For j = 1 To DerLigDonnee
                'Si le contenu de la cellule wsMacro.Cells(1,i) = le contenu de la cellule wsDonnee.Cells(1,j)
                If wsMacro.Cells(1,i).Value = wsDonnee.Cells(1,j).Value Then
                        'Alors je copie le contenu de la ligne 2 de la feuille donnée vers la feuille macro
                        wsMacro.Cells(2,i).Value = wsDonnee.Cells(2,j).Value
                End If
           Next j  'Incrémentation de j pour passer à la colonne suivante
    Next i    'Incrémentation de i pour passer à la colonne suivante

    'Libération des objets et de la mémoire
    Set wsMacro = Nothing
    Set wsDonnee = Nothing


Cette méthode n'est surement pas la meilleure et pas la plus rapide mais elle fonctionne.
Je pense qu'en utilisant 2 collections (une pour chaque feuille) et en les comparant, l'exécution serait plus rapide.

;o)
2
J'ai modifié un petit truc, mais ça m'a donné quelques sueurs ! En effet, j'avais besoin que TOUTES les valeurs sous le libellé soit copiées... j'ai donc imbriqué une troisième boucle ; c'était pas grand chose à faire, mais j'en suis très fier ! AHAH :)

Encore une fois merci beaucoup ! j'y serais pas arrivé sinon.

Voilà donc mon code final :

'Déclaration des variables
Dim wsMacro As Worksheet       'Objet worksheet pour la feuille "macro"
Dim wsDonnee As Worksheet    'Objet worksheet pour la feuille "Données brutes"
Dim DerLigMacro As Long
Dim DerLigDonnee As Long
Dim i As Long
Dim j As Long
Dim k As Long


     Set wsMacro = Worksheets("macro")          'Instance de la feuille "macro"
     Set wsDonnee = Worksheets("Données brutes")  'Instance de la feuille "Données brutes"

     DerLigMacro = wsMacro.Range("IV1").End(xlToLeft).Column
     DerLigDonnee = wsDonnee.Range("IV1").End(xlToLeft).Column
    
     'Pour chaque cellule de la feuille macro de la ligne 1
     For i = 1 To DerLigMacro
     
      
           'Pour chaque cellule de la feuille Données brutes de la ligne 1
           For j = 1 To DerLigDonnee
                'Si le contenu de la cellule wsMacro.Cells(1,i) = le contenu de la cellule wsDonnee.Cells(1,j)
               If wsMacro.Cells(1, i).Value = wsDonnee.Cells(1, j).Value Then
               
                        'Je veux copier le contenu de la colonne Cell(1, j) sous Cell(1, i)
                        For k = 2 To DerLigDonnee
                                wsMacro.Cells(k, i).Value = wsDonnee.Cells(k, j).Value
                        Next k
                        
                   End If
           Next j
    Next i

    'Libération des objets et de la mémoire
    Set wsMacro = Nothing
    Set wsDonnee = Nothing



Une petite question subsidiaire. Je pense avoir compris à quoi sert le End(xlToLeft) : j'imagine que c'est pour être sur de ne pas oublier de valeur si par exemple la ligne présente un "trou" et que les données reprennent la case d'après. On part donc de l'extrême droite de la feuille, et on trouvera bien la dernière valeur.

Si maintenant je veux faire le même raisonnement sur les colonnes, je dois écrire

DerColMacro = wsMacro.Range("A1").End(xlUp).Row
?

Peux tu me corriger s'il te plait.

Encore merci.
0
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 190
Bonjour,

Bravo pour ta modification.

Pour ce qui concerne la recherche de la dernière ligne ou colonne renseignée, voilà un lien utile : https://excel.developpez.com/faq/index.php?page=Cellule#DerniereLigneNonVide.

Bon courage

;o)
0
Merci de tes encouragements, ça me donne l'impression que ma première dent vient de pousser !

Je vais regarder le lien, à plus tard pour une autre session d'aide peut être :)
0