Association Recherche/Copier excel VBA
Résolu
Prevan
-
Prevan -
Prevan -
Bonjour,
voici mon code :
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.
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.
A voir également:
- Association Recherche/Copier excel VBA
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Comment copier une vidéo youtube - Guide
- Déplacer colonne excel - Guide
1 réponse
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:
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)
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)
Encore une fois merci beaucoup ! j'y serais pas arrivé sinon.
Voilà donc mon code final :
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
?
Peux tu me corriger s'il te plait.
Encore merci.
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)
Je vais regarder le lien, à plus tard pour une autre session d'aide peut être :)