Réaliser une Macro de Tri

clement_a - Modifié par clement_a le 23/07/2014 à 09:08
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 29 juil. 2014 à 14:36
Bonjour à tous,

Je suis à la recherche d'aide pour réaliser un macro Excel, effectivement, voici le classeur sur lequel je suis en train de travailler, je voudrai que ma macro puisse comparer la première ligne de la colonne G à la première ligne de la colonne X, si ces deux cellules sont les mêmes je voudrai que la plage de la première ligne A:K soit collé sur un autre onglet avec la plage M:X de la ligne correspondante, si il n'y a pas de correspondance entre G2 et X2, je voudrai comparer G2 et X3 et de la même façon coller les plages de cellules correspondant aux lignes qui sont les mêmes. Une fois arrivé en bas de la colonne X je souhaiterai incrémenter la valeur de la colonne G pour comparer G3 à X2 puis G3 à X3 etc... avec chaque fois un collage lorsqu'il y a correspondance entre G et X.

J'espère que c'est clair,
j'ai commencé le VBA en début de semaine donc ne soyez pas trop dur en terme de syntaxe s'il vous plait :/

Voici mon fichier :http://cjoint.com/?DGxjgqscSMm

Et sinon voici ma macro :

Sub MacroTri3()

Dim NbLig As Long, VAR1 As Integer, Cible As String, firstAddress As String, Adress As String, Y As String, VAR2 As Integer

Set Sql = Sheets("SQL-Results")
Set Sheet = Sheets("Feuil1")

Sql.Range("G2").Select
For VAR1 = 2 To Range("G2").End(xlUp).Row
For VAR2 = 2 To Range("X2").End(xlUp).Row
If ActiveCell.Value = Range("X" & VAR2 & "").Value Then
Sheet.Range("AVAR1:KVAR1") = Sql.Range("AVAR1:KVAR1").Value
Sheet.Range("MVAR2:KVAR2") = Sql.Range("MVAR1:KVAR1").Value
Else
VAR2 = VAR2 + 1

End If
Next VAR2
Next VAR1

End Sub

Merci d'avance pour votre aide !

8 réponses

jordane45 Messages postés 38142 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
23 juil. 2014 à 10:08
Bonjour,

Je ne lis "aucune" question .......

Pourrais tu expliquer quel est le souci rencontré ?


Je suppose que tu as un Pb avec ces lignes :
Sheet.Range("AVAR1:KVAR1") = Sql.Range("AVAR1:KVAR1").Value
Sheet.Range("MVAR2:KVAR2") = Sql.Range("MVAR1:KVAR1").Value



Je pense que ton Excel ne comprend pas à quoi correspondent ces plages :
 Range("AVAR1:KVAR1")


Ce qui est étonnant...
c'est que tu as pourtant bien écrit la ligne précédente (en utilisant la concaténation). :
Range("X" & VAR2 & "")







0
ClaudeMimoun Messages postés 4 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 24 juillet 2014
Modifié par ClaudeMimoun le 23/07/2014 à 10:21
Ma question, c'est vrai, c'est qu'en fait ça ne fonctionne pas... je ne sais pas si je suis sur la bonne route, pour le moment ma macro ne fait que sélectionner la cellule G2, mais ensuite rien ne se passe.
je modifie ma macro au fur et à mesure que j'apprend à utiliser VBA donc du coup il est vrai qu'il y a des choses un peu surprenantes qui changent d'une ligne à l'autre... il y aurait donc un soucis quand à la lecture de
Range("AVAR1:KVAR1")
Je pensais que ça venait plus du
If ActiveCell.Value = Range("X" & VAR2 & "").Value Then

En fait je ne sais pas comment sélectionner une plage de cellule avec des variables... je crois que c'est ça le soucis.

(oui je me suis créé un compte mais c'est toujours moi !)
0
jordane45 Messages postés 38142 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
23 juil. 2014 à 10:33
je ne sais pas comment sélectionner une plage de cellule avec des variables.
Range("A" & VAR1 & ":K" & VAR1).select


0
ClaudeMimoun Messages postés 4 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 24 juillet 2014
23 juil. 2014 à 10:40
D'accord je vois, cependant je ne comprends toujours pas mon erreur, outre cette faute de syntaxe, j'ai l'impression que ma macro ne rentre pas dans ma boucle For, qu'en pensez vous ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38142 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
23 juil. 2014 à 11:02
Déjà...
Pour obtenir la dernière ligne d'une feuille tu peux utiliser :
Derniere_Ligne = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row


Ensuite....
dans ton programme actuelle tu lui demande de regarder la valeur de la cellule active.... activeCell..... hors... tu n'actives aucune cellule..... donc ton programme ne change jamais de ligne.....

Tu n'as pas besoin non plus de ton "ELSE" ...

Et pour finir... tu n'as pas besoin d'incrémenter ta variable VAR2... vu que tu es dans une boucle...



If ActiveCell.Value = Range("X" & VAR2 & "").Value Then


A remplacer plutot par :
If cells(VAR1,"G").Value = cells(VAR2,"X").Value Then
   ' ICI LE CODE POUR COPIER
End if



Ce qui donne :
Sub MacroTri3()

Dim NbLig As Long, VAR1 As Integer, Cible As String, firstAddress As String, Adress As String, Y As String, VAR2 As Integer

Dim FeuilleDesti  as worksheet
Dim Sql  as worksheet
Set Sql = Sheets("SQL-Results")
Set FeuilleDesti =  Sheets("Feuil1")

For VAR1 = 2 To  Cells.Find("*", Range("G2"), , , xlByRows, xlPrevious).Row
 For VAR2 = 2 To  Cells.Find("*", Range("X2"), , , xlByRows, xlPrevious).Row
  If cells(VAR1,"G").Value = cells(VAR2,"X").Value Then
    FeuilleDesti .Range("A" & VAR1 &":K" & VAR1) = Sql.Range("A" & VAR1 & ":K" & VAR1).Value
    FeuilleDesti .Range("M" & VAR2 & ":K" & VAR2) = Sql.Range("M" & VAR1 & ":K" & VAR1).Value
  End If
 Next VAR2
Next VAR1

End Sub


0
ClaudeMimoun Messages postés 4 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 24 juillet 2014
23 juil. 2014 à 11:45
Merci beaucoup, ça ne marche pas encore car je pense qu'il faut regarder la condition Endif (oui parce que je veux que ça compare tout la colonne X en fonction d'une cellule de la G...) au niveau du test ça ne marche que lorsque les deux valeurs à comparer sont sur la même ligne... je vais voir ce qu'il peut être améliorer.
Si vous avez d'autres idées elles sont les bienvenues mais en tous les cas merci beaucoup pour votre aide !
0
ClaudeMimoun Messages postés 4 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 24 juillet 2014
24 juil. 2014 à 14:18
Pas d'autre idée j'imagine ?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
29 juil. 2014 à 14:36
Essaie ceci
Sub MacroTri3()

Dim NbLig As Long, I As Long, J As Long
Dim LigneDest As Long

Dim FeuilleDesti As Worksheet
Dim Sql As Worksheet
Set Sql = Sheets("SQL-Results")
Set FeuilleDesti = Sheets("Feuil1")

LigneDest = 2
NbLig = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row

For I = 2 To NbLig
For J = 2 To NbLig
If Cells(I, "G").Value = Cells(J, "X").Value Then
FeuilleDesti.Range("A" & LigneDest & ":K" & LigneDest) = Sql.Range("A" & I & ":K" & I).Value
FeuilleDesti.Range("M" & LigneDest & ":X" & LigneDest) = Sql.Range("M" & J & ":X" & J).Value
LigneDest = LigneDest + 1
End If
Next
Next

End Sub

0
Rejoignez-nous