Aide pour comprendre une macro (Application.Max // .Find)
Bonjour,
J'ai trouvé cette macro datant de 2012 : Comparer deux listes et ajouter la ligne manquante (excel-pratique.com)
J'ai réussi a l'adapter pour qu'elle fonctionne mais j'aimerai de l'aide pour la comprendre afin de progresser pas a pas un peu comme avec F8
lg = Application.Max( _
f1.Cells.Find("*", , , , xlByRows, xlPrevious).Row, _
f2.Cells.Find("*", , , , xlByRows, xlPrevious).Row)Ici je ne comprend pas trop la valeur attribuée a lg.
Que calcul Application.Max ?
Comment fonctionne Find ici pour comparer ? A quoi correspond "*" et comment le .find "sait" qu'il doit commencer a partir de la dernière ligne ?
Ma deuxieme question est sur le fonctionnement de cette ligne :
Range("a2:e2" & lg).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("r1:r2"), CopyToRange:=Range("g2:k2"), Unique:=FalseNe comprenant pas trop a quoi correspond lg, je ne comprend pas la Range. Je comprend que si le critère est "FAUX" alors la copie va s'effectué depuis ? vers G2:k2
A partir de la, j'aimerai dire combien de lignes ont été ajouté et combien de lignes n'étaient pas présente sur f1 (tout en faisant passer en rouge les lignes sur f2 qui ne figure pas sur f1)
Merci d'avance pour votre aide
Hello,
Que calcul Application.Max ?
Que nous dit l'aide en ligne ?
Renvoie la plus grande valeur d'un ensemble de valeur
Quésako ? Donne la + grande valeur
f1.Cells.Find("*", , , , xlByRows, xlPrevious).RowQuésako ? Cherche dans toutes les cellules de la feuille "f1" la derniere et renvoie la ligne
f2.Cells.Find("*", , , , xlByRows, xlPrevious).RowQuésako ? Cherche dans toutes les cellules de la feuille "f2" la derniere et renvoie la ligne
lg = Application.Max( _
f1.Cells.Find("*", , , , xlByRows, xlPrevious).Row, _
f2.Cells.Find("*", , , , xlByRows, xlPrevious).Row)Quésako ?? Retourne moi la + grande ligne entre les 2 feuilles
"*"Quésako ? Renvoie tout
"toto*"Quésako ? Renvoie tout ce qui commence par "toto"
Range("a2:e2" & lg)Je n'utilise pas cette technique mais pour moi si lg = 25 par exemple alors cela signifie range(A2:E225)
Merci beaucoup :)
je commence a comprendre.
Donc finalement, si je comprend bien, dans le code suivant :
lg = Application.Max( _
f1.Cells.Find("*", , , , xlByRows, xlPrevious).Row, _
f2.Cells.Find("*", , , , xlByRows, xlPrevious).Row)
Range("o2") = "=COUNTIF(Ordonnancer!a2:a" & lg & ",a2)=0"
Range("a1:d" & lg).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("o1:o2"), CopyToRange:=Range("g1:j1"), Unique:=Falsele lg calcul le maximum de cellule afin afin de s'assurer que le filtre avancé soit appliqué sur toute les cellules.
le COUNTIF calcule les critères : Lorsque qu'aucune cellule de la deuxième feuille (colonne a a partir de a2) n'a la valeur de la première feuille (colonne a a partir de a2)
le Advancefilter xlfiltercopy copie toutes lignes qui ne serait pas présente sur la première feuille.
J'aimerai ajouter une range de nom que je ne souhaite pas copier même si ils ne sont pas sur la première feuille.
Range de nom : M12:Q20
Colonne a comparer : N12:N20
J'ai essayé comme cela :
Range("r2") = "=COUNTIF(n12:n" & "Feuil1!b3:b" & lg & ",b3)=0"Mais ca ne fonctionne pas... En fait, cette commende m'ouvre le gestionnaire de fichier et me demande de mettre a jour mes valeurs...
Voici mon code complet : (il ajoute les noms manquant sur la Feuil1 et sur cette même feuille, il surligne en rouge ceux absents de la Feuil2)
Tout ca marche parfaitement, mais moi, j'aimerai que les noms présents en M12:Q20 ne soient pas copié.
Option Explicit
Sub Complète()
Dim lg&, f1 As Worksheet, f2 As Worksheet
Dim RedRange As Range
Dim i, y, x, z As Integer
x = 0
z = 0
Application.ScreenUpdating = False
Set f1 = Sheets("Feuil2")
Set f2 = Sheets("Feuil1")
f1.Activate
lg = Application.Max( _
f1.Cells.Find("*", , , , xlByRows, xlPrevious).Row, _
f2.Cells.Find("*", , , , xlByRows, xlPrevious).Row)
Range("r2") = "=COUNTIF(n12:n" & "Feuil1!b3:b" & lg & ",b3)=0"
Range("a2:e2" & lg).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("r1:r2"), CopyToRange:=Range("g2:k2"), Unique:=True
Range("g3:j" & [g65000].End(xlUp).Row) _
.Copy Destination:=f2.Range("a" & Rows.Count).End(xlUp)(2)
Set RedRange = Range("g3:j" & [g65000].End(xlUp).Row)
x = RedRange.Rows.Count
Columns("g:k").Clear
Columns("R").Clear
lg = Application.Max( _
f2.Cells.Find("*", , , , xlByRows, xlPrevious).Row, _
f1.Cells.Find("*", , , , xlByRows, xlPrevious).Row)
Range("r2") = "=COUNTIF(Feuil2!b3:b" & lg & ",b3)=0"
f2.Range("a2:e2" & lg).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
f1.Range("r1:r2"), CopyToRange:=Range("g2:k2"), Unique:=False
Set RedRange = Range("g3:j" & [g65000].End(xlUp).Row)
z = RedRange.Rows.Count
For i = 1 To RedRange.Rows.Count
For y = 3 To lg
If RedRange(i, 1) = f2.Cells(y, 1) Then
f2.Cells(y, 1).Interior.Color = RGB(250, 0, 0)
f2.Cells(y, 2).Interior.Color = RGB(250, 0, 0)
f2.Cells(y, 3).Interior.Color = RGB(250, 0, 0)
f2.Cells(y, 4).Interior.Color = RGB(250, 0, 0)
f2.Cells(y, 5).Interior.Color = RGB(250, 0, 0)
End If
Next y
Next i
MsgBox x & "Employé(s) ajouté(s) et " & z & "Employé(s) absent de la nouvelle liste"
Columns("g:k").Clear
Columns("R").Clear
f2.Activate
End SubMerci d'avance
Hello,
il manque la feuille :
Range("r2") = "=COUNTIF(Nomdelafeuile!n12:n" & "Feuil1!b3:b" & lg & ",b3)=0"Merci pour ton aide.
Malheureusement j'avais déja fait un f1.activate plus haut.
Mais même en rajoutant la feuille, je me retrouve avec l'explorateur de fichier qui s'ouvre avec l'intitulé : "Mettre a jour les valeurs : nFeuil1"