Supprimer ligne par macro
a.dequidt
Messages postés
42
Statut
Membre
-
Papou93 Messages postés 147 Statut Membre -
Papou93 Messages postés 147 Statut Membre -
bonjour,
dans mon fichier excel, j'ai un tableau de devis, comprenant
dans la colonne A la quantité,
en B la référence du produit,
en I le prix unitaire
en K le code produit,
en S la marque du produit.
A l'ouverture du ficher, la colonne S n'est pas vide!
Je cherche a faire une macro qui lorsqu'il n'y a pas de référence d'entrée, la ligne se supprime!
Dans ma macro actuelle, je fais une recherche pour trouver la 1ere ligne de me tableau et la derniere
>> ça c'est bon il sauvegarde les bonnes valeurs
Ensuite je cherche si les lignes qui ont une marque (colonne S non vide) mais qui n'ont pas de référence,
Si j'en trouve une, je l'efface!
voici mon code actuel
Sub effacer_ligne()
For i = 1 To 100
If Range("A" & i).Value = "Qté" Then
ligne_min = i + 1
End If
If Range("H" & i).Value = "Total :" Then
ligne_max = i - 2
End If
Next i
For i = ligne_min To ligne_max
If Range("B" & i).Value = "" And Range("S" & i).Value <> "" Then
Rows(i).Delete Shift:=xlShiftUp
End If
Next i
End Sub
Actuellement quand je lance ma macro, elle s'exécute correctement mais elle ne supprime pas toutes les lignes vides.
Sur les 6 linges de mon tableau si une seule ligne est remplie, sur les 5 lignes a supprimer seulement 3 ont étées supprimées
dans mon fichier excel, j'ai un tableau de devis, comprenant
dans la colonne A la quantité,
en B la référence du produit,
en I le prix unitaire
en K le code produit,
en S la marque du produit.
A l'ouverture du ficher, la colonne S n'est pas vide!
Je cherche a faire une macro qui lorsqu'il n'y a pas de référence d'entrée, la ligne se supprime!
Dans ma macro actuelle, je fais une recherche pour trouver la 1ere ligne de me tableau et la derniere
>> ça c'est bon il sauvegarde les bonnes valeurs
Ensuite je cherche si les lignes qui ont une marque (colonne S non vide) mais qui n'ont pas de référence,
Si j'en trouve une, je l'efface!
voici mon code actuel
Sub effacer_ligne()
For i = 1 To 100
If Range("A" & i).Value = "Qté" Then
ligne_min = i + 1
End If
If Range("H" & i).Value = "Total :" Then
ligne_max = i - 2
End If
Next i
For i = ligne_min To ligne_max
If Range("B" & i).Value = "" And Range("S" & i).Value <> "" Then
Rows(i).Delete Shift:=xlShiftUp
End If
Next i
End Sub
Actuellement quand je lance ma macro, elle s'exécute correctement mais elle ne supprime pas toutes les lignes vides.
Sur les 6 linges de mon tableau si une seule ligne est remplie, sur les 5 lignes a supprimer seulement 3 ont étées supprimées
A voir également:
- Supprimer ligne par macro
- Supprimer rond bleu whatsapp - Guide
- Partager photos en ligne - Guide
- Supprimer page word - Guide
- Supprimer pub youtube - Accueil - Streaming
- Mètre en ligne - Guide
12 réponses
salut,
je sais pas si ça peut t'aider, moi j'ai du faire une macro qui me supprimait les lignes quand la date de la colonne F était inférieure à aujourdhui... voilà ce que ça donne:
Dim i As Integer
Sheets("SGBBE").Select
If MsgBox("Etes-vous sûr de vouloir supprimer tous les emprunts à terme?", vbExclamation + vbOKCancel, "Suppression emprunts") = vbOK Then
'si la colonne de dernière date est par ex "F"
For i = 5 To Range("F65536").End(xlUp).Row
If Cells(i, 6).Value <> "" And Cells(i, 6) < Now Then
Cells(i, 6).EntireRow.Delete
i = i - 1
End If
Next i
Else
Cancel = True
End If
il me semble que j'ai eu ton problème des lignes non supprimées (1 sur 2?), essaye de le faire de la dernière à la première, je crois que ça marche mieux comme ça (en tout cas pour mon cas)
je sais pas si ça peut t'aider, moi j'ai du faire une macro qui me supprimait les lignes quand la date de la colonne F était inférieure à aujourdhui... voilà ce que ça donne:
Dim i As Integer
Sheets("SGBBE").Select
If MsgBox("Etes-vous sûr de vouloir supprimer tous les emprunts à terme?", vbExclamation + vbOKCancel, "Suppression emprunts") = vbOK Then
'si la colonne de dernière date est par ex "F"
For i = 5 To Range("F65536").End(xlUp).Row
If Cells(i, 6).Value <> "" And Cells(i, 6) < Now Then
Cells(i, 6).EntireRow.Delete
i = i - 1
End If
Next i
Else
Cancel = True
End If
il me semble que j'ai eu ton problème des lignes non supprimées (1 sur 2?), essaye de le faire de la dernière à la première, je crois que ça marche mieux comme ça (en tout cas pour mon cas)
Bonsoir a.dequidt,
C'est normal que tu ne puisses supprimer tous les vides telle que ta boucle est conçue : tu dois décrémenter le compteur (ainsi que ligne_max) à chaque suppression d'une ligne puisque tu remontes d'une ligne à chaque fois.
Essaies de modifier ta boucle comme suit :
For i = ligne_min To ligne_max
If Range("B" & i).Value = "" And Range("S" & i).Value <> "" Then
Rows(i).Delete Shift:=xlShiftUp
i=i-1
ligne_max=ligne_max-1
End If
Next i
Cordialement.
C'est normal que tu ne puisses supprimer tous les vides telle que ta boucle est conçue : tu dois décrémenter le compteur (ainsi que ligne_max) à chaque suppression d'une ligne puisque tu remontes d'une ligne à chaque fois.
Essaies de modifier ta boucle comme suit :
For i = ligne_min To ligne_max
If Range("B" & i).Value = "" And Range("S" & i).Value <> "" Then
Rows(i).Delete Shift:=xlShiftUp
i=i-1
ligne_max=ligne_max-1
End If
Next i
Cordialement.
Si la question est toujours d'actualité:
Sub effacer_ligne()
Dim i as integer
Dim DernLign as string
DernLign = Sheets("Feuil1").UsedRange.Row + Sheets("Feuil1").UsedRange.Count - 1
'Permet de faire la macro en commençant par le bas, quel que soit le nombre de lignes
For i = DernLign to 1 Step -1
'enclenche le compte à rebours
If Not IsEmpty (Sheets("Feuil1").Cells(i,19)) And IsEmpty(Sheets("Feuil1").Cells(i,2)) Then
'vérifie que la cellule en S n'est pas vide, mais que celle en B oui
Sheets("Feuil1").Cells(i,2).EntireRow.Delete
'Supprime la ligne entière si les deux conditions sont vérifiées
End If
Next
End Sub
Tu peux remplacer "Feuil1" par le nom de ta feuille (n'oublie pas les "") ou utiliser ActiveSheet
Sub effacer_ligne()
Dim i as integer
Dim DernLign as string
DernLign = Sheets("Feuil1").UsedRange.Row + Sheets("Feuil1").UsedRange.Count - 1
'Permet de faire la macro en commençant par le bas, quel que soit le nombre de lignes
For i = DernLign to 1 Step -1
'enclenche le compte à rebours
If Not IsEmpty (Sheets("Feuil1").Cells(i,19)) And IsEmpty(Sheets("Feuil1").Cells(i,2)) Then
'vérifie que la cellule en S n'est pas vide, mais que celle en B oui
Sheets("Feuil1").Cells(i,2).EntireRow.Delete
'Supprime la ligne entière si les deux conditions sont vérifiées
End If
Next
End Sub
Tu peux remplacer "Feuil1" par le nom de ta feuille (n'oublie pas les "") ou utiliser ActiveSheet
CODE:
b=1
ligne_min = Range("O" & b).Value
ligne_max = Range("P" & b).Value
For i = ligne_min To ligne_max
If Cells(i, 19).Value = "" Then
Rows(i).delete Shift:=xlShiftUp
i = i - 1
ligne_max = ligne_max - 1
End If
Next i
a l'execusion, Erreur d'execution '1004'
Yé compren po :'(
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dans ton code tu as:
b=1
ligne_min = Range("O" & b).Value
ligne_max = Range("P" & b).Value
essaye avec:
b=1
ligne_min = Range("15" & b).Value
ligne_max = Range("16" & b).Value
je sais pas si ça marchera, mais dans mon code c'est ce que j'ai du faire...
b=1
ligne_min = Range("O" & b).Value
ligne_max = Range("P" & b).Value
essaye avec:
b=1
ligne_min = Range("15" & b).Value
ligne_max = Range("16" & b).Value
je sais pas si ça marchera, mais dans mon code c'est ce que j'ai du faire...
je bloque un peu là, t'as essayé un truc du style:
For i = ligne_min to ligne_max
If Cells(i,196).Value = "" Then
Cells(i, 19).EntireRow.Delete
i = i - 1
End If
Next i
For i = ligne_min to ligne_max
If Cells(i,196).Value = "" Then
Cells(i, 19).EntireRow.Delete
i = i - 1
End If
Next i
Bonjour a.dequidt,
Essaies alors une boucle comme celle-ci :
b = 1
ligne_min = Range("O" & b).Value
ligne_max = Range("P" & b).Value
For Each cel In Range(Cells(ligne_min, 1), Cells(ligne_max, 1))
If Cells(cel.Row, 19).Value = "" Then cel.EntireRow.Delete
Next
J'ai testé, chez moi ça fonctionne sans problème.
Cordialement.
Essaies alors une boucle comme celle-ci :
b = 1
ligne_min = Range("O" & b).Value
ligne_max = Range("P" & b).Value
For Each cel In Range(Cells(ligne_min, 1), Cells(ligne_max, 1))
If Cells(cel.Row, 19).Value = "" Then cel.EntireRow.Delete
Next
J'ai testé, chez moi ça fonctionne sans problème.
Cordialement.