Supprimer ligne par macro

a.dequidt Messages postés 42 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
A voir également:

12 réponses

Landoltp Messages postés 68 Statut Membre 1
 
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)
0
Papou93 Messages postés 147 Statut Membre 59
 
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.
0
mdonnate Messages postés 82 Statut Membre 45
 
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
0
a.dequidt Messages postés 42 Statut Membre 2
 

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 :'(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Landoltp Messages postés 68 Statut Membre 1
 
essaye de remplacer les lettres par des chiffres,
0=15
P=16
0
a.dequidt Messages postés 42 Statut Membre 2
 
comment ça?
0
Landoltp Messages postés 68 Statut Membre 1
 
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...
0
a.dequidt Messages postés 42 Statut Membre 2
 
ça ne marche pas :(
0
Landoltp Messages postés 68 Statut Membre 1
 
mais tes "O" et "P" c'est bien les n° de colonnes?
0
a.dequidt Messages postés 42 Statut Membre 2
 
oui oui mais mon probleme se trouve au niveau de mon IF
0
Landoltp Messages postés 68 Statut Membre 1
 
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
0
Papou93 Messages postés 147 Statut Membre 59
 
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.
0