œil expert - évaluer une macro

Bonjour à tous,

J'ai créé une macro (avec de l'aide évidemment) dont je tente d'améliorer le code.

En fait, je n'ai que changé l'ordre du code croyant ainsi améliorer la vitesse d'exécution.

J'ai fait un test pour comparer la macro MF_Liste_vendredi_GR1 (Module 1) et MF_Liste_vendredi_GR1_V (Module 5)

Voilà que la macro MF_Liste_vendredi_GR1_V laisse dans la colonne D à partir de la ligne 26 des formules...et, je ne comprends pas pourquoi.

Aussi, si jamais voyez des trucs qui cloquent dans le code..., et bien je vous remercie d'avance pour votre contribution.

A+

Bonjour Michel,

Voilà que la macro MF_Liste_vendredi_GR1_V laisse dans la colonne D à partir de la ligne 26 des formules...et, je ne comprends pas pourquoi.

Il fais défiler des formules de la ligne 1 à la ligne 79

La variable qui est égal à 79 est celle ci-dessous :

For i = ActiveSheet.UsedRange.Rows.Count To 2 Step -1
  If Cells(i, 5).Value > 1 Then
      Rows(i).Delete
  End If
Next i

Remplace ce code par celui ci :

Sub DellRow()
Cells(2, 5).AutoFilter Field:=5, Criteria1:="<>1"
Rows("2:" & Range("A" & Rows.Count).End(xlUp).Row).Delete
ActiveSheet.ShowAllData
End Sub

Avec celui-ci tu supprime toutes les lignes qui n'ont pas "1" en colonne E, et qui est plus rapide que la boucle

A dispo

Bonjour Juice,

Merci pour la suggestion. Effectivement, c'est plus rapide. Mais, j'ai encore le même phénomène.

La macro laisse toujours des formules dans la colonne D à partir de la ligne 26 !

Il semble que le défilement jusqu'à la ligne 79 se produit malgré tout.

A+

Re Michel,

Possibilité de nous fournir une feuille de donnée avant traitement de la macro ?

++

Bonjour Juice,

oui, bien sûr. Attention, votre code n'est pas intégré.

Onglet Sheet1.

Merci beaucoup.

Ok maintenant que je vois le fichier brut (avant traitement de la macro) je comprend d'où viens l'anomalie :

Tu donne une valeur à ta variable Dlig dès le début de ta macro : Donc aucune ligne de supprimer

Or ton fichier avant macro fait 79 lignes

Donc quand tu arrive à la lignes de code :

Range("D2").AutoFill Destination:=Range("D2:D" & Dlig), Type:=xlFillDefault

Tu dit de faire défiler ta formule de D2 à D79 car tu n'a pas remis à jour ta variable après suppression des lignes.

A dispo

Bonjour Juice,

Merci pour ton analyse. Ça me permet de mieux comprendre.

Il y a une partie de ce code qui me vient d'un autre projet, et comme je ne maîtrise à fond VBA, je me retrouve avec ce genre d'anomalie.

Comment fait-on pour mettre la variable à jour rendu à la ligne que tu indiques ?

Ou il vaut peut-être mieux mettre la variable ailleurs dans la séquence du code ou simplement la supprimer si elle n'est pas utile ?

Mais pour ça, j'ai besoin de votre aide.

Merci encore.

Re Michel,

Comment fait-on pour mettre la variable à jour rendu à la ligne que tu indiques ?

Alors pour ma part, quand il s'agit de trouver le nbr de ligne, je ne déclare pas de variable : je met directement le code

Ta version :

Range("A" & Dligne).Select

Ma version :

Range("A" & Range("A" & Rows.Count).End(xlUp).Row).Select

Comme sa, j'ai toujours le vrai nombre de ligne au moment où j'en ai besoin, sans avoir à mettre à jour ma variable.

Du coup j'ai revu ton code dans son ensemble et j'ai essayé de le condenser un peu :

Sub MF_Liste_Vendredi_GR1_V()
Dim x As Long
'Remplacer par vide pour conserver seulement #
For x = 4 To 6
    With Columns(x)
        .Replace What:="Division", Replacement:=""
        .Replace What:="-", Replacement:=""
    End With
Next
'Supprimer ligne qui ne contient pas 1 dans colonne E, sauf en-tête
Cells(2, 5).AutoFilter Field:=5, Criteria1:="<>*1*"
Rows("2:" & Range("A" & Rows.Count).End(xlUp).Row).Delete
ActiveSheet.ShowAllData
'Insérer nouvelle colonne et formule pour le # chef
Columns("D:D").Insert
Range("D2").FormulaLocal = "=RECHERCHEV(G2;Feuil1!$G$5:$I$70;3;0)"
Range("D2").AutoFill Destination:=Range("D2:D" & Range("B" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault
'Insérer colonnes, puis convertir colonne I en 3 distinctes
Columns("J:K").Insert Shift:=xlToRight
Range("I2:I" & Range("B" & Rows.Count).End(xlUp).Row).TextToColumns Destination:=Range("I2"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
'Convertir colonne A, H et L
With Range("A2:A" & Range("B" & Rows.Count).End(xlUp).Row, "H2:H" & Range("B" & Rows.Count).End(xlUp).Row)
    .NumberFormat = "0"
    .Value = .Value
End With
Range("L2:L" & Range("B" & Rows.Count).End(xlUp).Row).NumberFormat = "mmm-yy"
'En-tête
Rows("2:2").Select
ActiveWindow.FreezePanes = True ' Figer les volets ligne 2
Range("A1:H1").ClearContents
[A1] = "Matricule."
[B1] = "Nom,Prénom."
[C1] = "Grade."
[D1] = "C/O"
[E1] = "Div."
[F1] = "Gr."
[G1] = "Cas."
[H1] = "BIP"
[I1] = "TYPEITEM"
[J1] = "MARQUE"
[K1] = "ANNÉEITEM"
[L1] = "Datedemandé"
Range("A1:L1").Font.Bold = True
Range("A1:G1").Interior.ColorIndex = 6
With Range("H1:L1")
    .Font.ColorIndex = 2
    .Interior.ColorIndex = 5
End With
'Trie croissant: colonnes H, B, G et D
Range("A1:M" & Range("B" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("H1,B1,G1,D1"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Cells.EntireColumn.AutoFit 'Dimensionner colonnes
Range("A2").Select
ActiveWorkbook.Save
End Sub

Restant à dispo

Bonjour Juice,

wow, quel beau travail! Merci beaucoup.

Merci aussi pour les explications, c'est fort enrichissant.

Juste une petite chose, la portion du code pour conserver uniquement les # des colonnes 4 To 6 est incomplet. J'ai besoin qu'il soit effectif également pour les colonnes Groupe et Caserne. J'ai essayé par moi même de l'ajouter au code, mais je ne parviens à aucun résultat.

'Remplacer par vide pour conserver seulement #
For x = 4 To 6
    With Columns(x)
        .Replace What:="Division", Replacement:=""
        .Replace What:="-", Replacement:=""
    End With

Merci encore

Bonjour Juice,

ok, j'y suis parvenu. Ce qui boguait, c'était les * du 1 dans cette ligne

Cells(2, 5).AutoFilter Field:=5, Criteria1:="<>1"
'Remplacer par vide pour conserver seulement #
For x = 4 To 6
    With Columns(x)
        .Replace What:="Division", Replacement:=""
        .Replace What:="Groupe", Replacement:=""
        .Replace What:="Caserne", Replacement:=""
        .Replace What:="-", Replacement:=""
    End With
Next

Re-Bonjour Juice,

Je me questionne sur le résultat du tri à la fin du code. Nous n'obtenons pas le même résultat.

La séquence du tri doit se faire en 4 temps. La colonne H en premier, la colonne B en second, la colonne G ensuite, et la colonne D en dernier.

Si je compare le résultat de votre code (feuil9) et du mien (feuil8), le résultat n'est vraiment pas le même.

Merci

Re Michel !

En effet, on a pas le même tri :p

Soit tu remet ton ancien code pour traiter ce tri, soit je te fais une Boucle qui fera les colonnes une par une (Comme pour le Replace)

A dispo!

Bonjour Juice,

Ce fut naturellement mon réflexe de reprendre mon code. J'aurais été curieux de savoir comment intégrer la boucle!

Sans quoi, je vous remercie pour votre précieuse aide, et enrichissantes explications.

Au plaisir et bonne semaine.

Rechercher des sujets similaires à "expert evaluer macro"