Suppression lignes et colonnes si condition - correction de macro
Bonjour,
Suite à ce topic,
http://www.developpez.net/forums/d15...s/#post8317611
Je reviens vous demander un peu d'aide, je pense être pas loin de la fin de mon problème.
J'ai un code qui lorsqu'il est exécuté, m'indique erreur d'exécution 13: incompatibilité de type
J'ai regardé sur le net, il pourrait s'agir très certainement d'une mauvaise déclaration de variable, mais je ne vois pas mon erreur.
Il peut s'agir de quelque chose de tout bête, étant donné que je suis novice en macro.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Sub supprimer_lignes_et_colonnes_vides()
Dim i As Long, Lig%
For i = Range("A65536").End(xlUp).Row To 2 Step -1
If Cells(i, 1) = 0 Then Rows(i).Delete
Next i
For Lig = [C65536].End(xlUp).Row To 2 Step -1
If Range("AR" & Lig).Value = 0 Then Rows(Lig).Delete
Next
For j = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column To 3 Step -1
If Application.WorksheetFunction.CountA(Range(Cells(1, j), Cells(110, j))) = 1 Then
Columns(j).Delete
End If
Next |
A savoir que mon code marchait à partir de "FOR LIG =...." jusqu'à la fin, le problème devrait donc provenir de
Code:
1 2 3
| For i = Range("A65536").End(xlUp).Row To 2 Step -1
If Cells(i, 1) = 0 Then Rows(i).Delete
Next i |
qui me permet de supprimer des lignes en plus dont je n'ai pas besoin.
Je remercie par avance quiconque pourra m'aider !
Cordialement,
Jon
Une autre version de codage
Bonjour,
j'ai vu que dans un des codes, tu testes la colonne "AR", (la colonne 44) pour détruire la ligne si cette colonne est vide. Mais dans ton ménage, tu supprimes les colonnes qui n'ont aucune valeur. Cela veut dire que la colonne "AR" ne reste pas colonne "AR".
Et tu de dis rien à propos de ce critère de destruction de ligne.
Au lieu de parcourir 3 fois les lignes et faire un test dans chaque boucle, parcours 1 fois les lignes et fais tes 3 tests dans la boucle. Si test tests sont simple, tu peux les combiner avec un OU ai lieu d'enchainer les ElseIf. C'est juste une question de lisibilité du code.
Par exemple :
Code:
If .Cells(Ligne, 1) = "" Or .Cells(Ligne, 44) = 0 Then
Voici un exemple de codage, bien que je ne sois pas persuadé que le test sur la colonne 44 soit pertinent. Ce code n'est pas mieux ou moins bien que les autres. C'est une autre version.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Sub Menage()
Dim DerniereLigne As Long, DerniereColonne As Long, Ligne As Long, Colonne As Long
With ActiveSheet
DerniereLigne = .Cells.SpecialCells(xlCellTypeLastCell).Row
DerniereColonne = .Cells.SpecialCells(xlCellTypeLastCell).Column
' Boucle sur les lignes
For Ligne = DerniereLigne To 2 Step -1
' Ligne dont la première colonne est vide
If .Cells(Ligne, 1) = "" Then
.Rows(Ligne).Delete
' Ligne n'ayant aucune valeur entre la colonne 3 et la fin
ElseIf WorksheetFunction.CountA(Range(.Cells(Ligne, 3), .Cells(Ligne, DerniereColonne))) = 0 Then
.Rows(Ligne).Delete
' Autre critère (colonne AR vide)
ElseIf .Cells(Ligne, 44) = 0 Then
.Rows(Ligne).Delete
End If
Next Ligne
' Boucle sur les colonnes
For Colonne = DerniereColonne To 3 Step -1
' Colonne n'ayant aucun valeur entre la ligne 2 et la derniere ligne
If WorksheetFunction.CountA(Range(.Cells(2, Colonne), .Cells(DerniereLigne, Colonne))) = 0 Then
.Columns(Colonne).Delete
End If
Next Colonne
End With
End Sub |
Pour l'erreur d'incompatibilité de type, utilise le débogueur pour savoir quelle ligne de code génère l'erreur et quelles sont les valeurs des variables au moment de l'erreur.
Et antonysansh a raison sur l'uniformisation de ton écriture. Ne fais pas un bête copier-coller des codes que tu glanes à droite et à gauche. Approprie-toi le code, comprend-le, adopte les meilleures pratiques. Et puis commente ton code pour t'y retrouver quand tu feras des modifications dans quelques mois.