Réaliser une Macro de Tri

Signaler
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
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

Messages postés
33147
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 juillet 2021
351
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 & "")







Messages postés
4
Date d'inscription
mercredi 23 juillet 2014
Statut
Membre
Dernière intervention
24 juillet 2014

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 !)
Messages postés
33147
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 juillet 2021
351
je ne sais pas comment sélectionner une plage de cellule avec des variables.
Range("A" & VAR1 & ":K" & VAR1).select


Messages postés
4
Date d'inscription
mercredi 23 juillet 2014
Statut
Membre
Dernière intervention
24 juillet 2014

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 ?
Messages postés
33147
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 juillet 2021
351
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


Messages postés
4
Date d'inscription
mercredi 23 juillet 2014
Statut
Membre
Dernière intervention
24 juillet 2014

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 !
Messages postés
4
Date d'inscription
mercredi 23 juillet 2014
Statut
Membre
Dernière intervention
24 juillet 2014

Pas d'autre idée j'imagine ?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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