Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Bonjour à tous,
Je ne suis pas très doué en excel et encore moins en elaboration de macro. Cependant, j'ai un classeur qui contient 2 feuilles, je voudrais faire une recherche des éléments de la colonne C de la feuille1 dans les éléments de la colonne B de la feuille 2. et une fois la correspondance faite je voudrais copier une plage etant sur la même ligne que cette derniere et la coller sur celle qui est en feuille1.
J'ai essayé de faire une macro mais elle ne marche pas. Voilà le script:
Sub Macro1()
Dim i As Long, j As Long
Dim test As Integer
Sheets("Feuil1").Select
For i = 7 To 1000
test = 0
If Cells(i, 3) <> Cells(i + 1, 3) Then
Sheets("Rapport 1").Select
For j = 7 To 1000
If Cells(j, 2) = Cells(i, 3) Then
Range(Cells(j, 7), Cells(j, 150)).Select
Selection.Copy
Sheets("Feuil1").Select
ActiveWindow.SmallScroll ToRight:=9
Range(Cells(j, 23), Cells(j, 167)).Select
ActiveSheet.Paste
ActiveWindow.SmallScroll ToRight:=-9
End If
Next
End If
Next
End Sub
Salut away123 et le forum
feuil1 :
des élément colonne C
S'ils se retrouvent en B de feuille 2, copier les colonne de B à ET à partir de C de feuille 1
Une proposition :
Code:
Sub test()
'Déclaration =====================================
Dim FS As Worksheet, FD As Worksheet
Dim Cel As Range, X As Long
'MEI =============================================
Set FD = Sheets("Feuil1") ' feuille destination
Set FS = Sheets("Feuil2") ' feuille source
'Traitement ======================================
For X = 1 To FD.Cells(Rows.Count, "C").End(xlUp).Row
'pour X=1 à dernière ligne en C de FD
Set Cel = FS.Columns(2).Find(FD.Cells(X, "C"))
'cel= cellule de FS colonne B = FD Cx
If Not (Cel Is Nothing) Then _
FS.Range(Cel, FS.Cells(Cel.Row, "ET")).Copy FD.Range("C" & X)
'si cel existe, copier de cel à la colonne 150 sur Cx
Next X
End Sub
Slt Gorfael,
Merci pour ton aide...c vrai que je n'ai as été très précis dans la description de mon probleme. Je vais donc essayer de faire mieux maintenant.
En fait j'ai un classeur avec deux feuilles.
la premiere feuille qu'on appellera feuille A contient un tableau croisé dont l'information importante est dans la colonne B.
Il se trouve que toutes les cellules de la colonnes B n'ont pas forcement des correspondances dans la colonne B de la feuille B.
Mais on va commencer par un balayage des cellules de la colonne B de la feuille B et essayer de trouver des correspondances avec les cellules de la Colonne B de la feuille B à la condition que la cellule que nos cherchons ne soit pas en doublet.
La recherche consistera à trouver des correspondances entre la cellule de la feuille A (colonne B) en passant en revu les cellules de la feuille B (colonne B).
Une fois la correspondance faite, on a une plage de remplissage qui se trouve etre le croisement des entrées du tableau croisé que l'on va copier pour le coller dans celui de la feuille A. Voilà l'information que nous recherchons au final:
selection et copie de la plage correspondant à la feuille B:
Range(Cells(j, 7), Cells(j, 150)).Select
Selection.Copy
Que l'on colle sur la plage de la feuille A que l'on sélectionne et sur laquelle on colle la plage précédemment copiée:
Range(Cells(j, 23), Cells(j, 167)).Select
ActiveSheet.Paste
Slt Gorfael,
Merci pour ton aide...c vrai que je n'ai as été très précis dans la description de mon probleme. Je vais donc essayer de faire mieux maintenant.
En fait j'ai un classeur avec deux feuilles.
la premiere feuille qu'on appellera feuille A contient un tableau croisé dont l'information importante est dans la colonne B.
Il se trouve que toutes les cellules de la colonnes B n'ont pas forcement des correspondances dans la colonne B de la feuille B.
Mais on va commencer par un balayage des cellules de la colonne B de la feuille B et essayer de trouver des correspondances avec les cellules de la Colonne B de la feuille B à la condition que la cellule que nos cherchons ne soit pas en doublet.
La recherche consistera à trouver des correspondances entre la cellule de la feuille A (colonne B) en passant en revu les cellules de la feuille B (colonne B).
Une fois la correspondance faite, on a une plage de remplissage qui se trouve etre le croisement des entrées du tableau croisé que l'on va copier pour le coller dans celui de la feuille A. Voilà l'information que nous recherchons au final:
selection et copie de la plage correspondant à la feuille B:
Range(Cells(j, 7), Cells(j, 150)).Select
Selection.Copy
Que l'on colle sur la plage de la feuille A que l'on sélectionne et sur laquelle on colle la plage précédemment copiée:
Range(Cells(j, 23), Cells(j, 167)).Select
ActiveSheet.Paste
Slt peux tu me guider...?
Merci d'avance
AWAY123
Salut away123 et le forum
feuil1 :
des élément colonne C
S'ils se retrouvent en B de feuille 2, copier les colonne de B à ET à partir de C de feuille 1
Une proposition :
Code:
Sub test()
'Déclaration =====================================
Dim FS As Worksheet, FD As Worksheet
Dim Cel As Range, X As Long
'MEI =============================================
Set FD = Sheets("Feuil1") ' feuille destination
Set FS = Sheets("Feuil2") ' feuille source
'Traitement ======================================
For X = 1 To FD.Cells(Rows.Count, "C").End(xlUp).Row
'pour X=1 à dernière ligne en C de FD
Set Cel = FS.Columns(2).Find(FD.Cells(X, "C"))
'cel= cellule de FS colonne B = FD Cx
If Not (Cel Is Nothing) Then _
FS.Range(Cel, FS.Cells(Cel.Row, "ET")).Copy FD.Range("C" & X)
'si cel existe, copier de cel à la colonne 150 sur Cx
Next X
End Sub
Salut away123 et le forum
Quand tu expliques, évite de nommer les choses différentes de manière similaire : c'est le meilleur moyen de rendre confus un message clair.
Ce que je crois comprendre :
Feuille X contient un TCD dont la colonne B contient des identifiants
Feuille Y contient une base de données dont la colonne B contient les identifiants
Seules les lignes répondant à B_X = B_Y sont à traiter
On doit regarder toutes les lignes de Y
Mais on va commencer par un balayage des cellules de la colonne B de la feuille B et essayer de trouver des correspondances avec les cellules de la Colonne B de la feuille B à la condition que la cellule que nos cherchons ne soit pas en doublet.
Là je ne suis pas sûr de comprendre.
Avant de continuer, il faut clarifier ce point :
- Soit il existe plusieurs B_Y correspondant à un seul B_X, et on s'arrête au premier B_Y trouvé ? Dans ce cas, pourquoi doit-on faire la boucle sur Y ? Il est préférable de la faire sur X, puisqu'on ne recherchera qu'une fois la correspondance !
- Soit (plus probable) je n'ai rien compris, alors expliques-toi plus clairement.
La recherche consistera à trouver des correspondances entre la cellule de la feuille A (colonne B) en passant en revu les cellules de la feuille B (colonne B).
Une fois la correspondance faite, on a une plage de remplissage qui se trouve être le croisement des entrées du tableau croisé que l'on va copier pour le coller dans celui de la feuille A.
??? Pareil, pas sûr de comprendre... ni que ça fonctionne : tu veux ajouter des champs au TDC ?
Voilà l'information que nous recherchons au final:
selection et copie de la plage correspondant à la feuille B:
Range(Cells(j, 7), Cells(j, 150)).Select
Selection.Copy
Que l'on colle sur la plage de la feuille A que l'on sélectionne et sur laquelle on colle la plage précédemment copiée:
Range(Cells(j, 23), Cells(j, 167)).Select
ActiveSheet.Paste
C'est une connerie !
Déjà, utiliser les Select ne sert qu'à ralentir un code
ensuite : 150-7 = 143 alors que 167-23 = 144 => Excel va te faire un KK nerveux 😛
Quand tu copies une plage, ne donnes que le point à partir duquel Excel devra coller l'information. Il est assez grand pour calculer la place qu'il lui faut.
Pour copier la plage, plutôt que d'utiliser une multitude de Select, qui rendent un code illisible et lent, contentes-toi de lui indiquer l'adresse réelle.
Ton code donne quelque chose dans ce style :
Je ne sais pas quelle est la feuille active, et je n'en ai pas besoin, elle est indifférente.
À moins de cas rares, les lignes à copier et celles à coller sont différentes : je dois utiliser 2 variables distinctes !
Je me fous du nombre de colonnes à coller : c'est celui du nombre de colonnes copiées, et Excel le sait, lui et il ne fera pas d'erreur !
Quand je lis ce code, je sais que je copies de la feuille B et que je colle dans la feuille A
Il faut juste que je détermine les deux variables de lignes.
Se trimballer des "Sheets("...")" rend vite un code imbuvable. C'est pour ça que j'utilise des variables feuille, en général, toujours les mêmes : F_S pour ma feuille source et F_D pour celle de destination.
De même, je n'utilise pas i et j, même si c'est un rappel des axes orthonormés, je trouve que 1 et i ou I se ressemblent trop... et vers 3h00 du matin, j'aime bien être sûr de ce que je vois 😀.
Je sais que c'est chiant et qu'on est à l'ère de l'informatique. Mais exécuter sur le papier un code permet de comprendre où l’algorithme ne fonctionne pas comme il devrait. Après, avec l'habitude, avec les aides de VBA (valeurs des variables en temps réel, point d'arrêt, mode pas-à-pas), on peut le faire de tête et contrôler que c'est bien ce qui doit ce passer qui se passe.
A+
Nota : avec un TCD, je ne sais pas si c'est possible de rajouter des données.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD