Suppression de lignes Excel en VBA [Résolu/Fermé]

Signaler
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
-
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
-
Bonjour,

J'ai un problème pour supprimer des lignes d'un tableau si la cellule dans la colonne A est vide. Mon tableau se compose de la ligne 3 à la ligne 201. Voici mon code :

For i = 201 To 3
If feuilExcel.Range("A" & i).Value = "" Then
feuilExcel.Rows(i).Delete
End If
i = i - 1
Next i


Ce code ne me supprime pas les lignes, mais il efface seulement les formules à l'intérieur des cellules des lignes qui devraient être supprimées.

J'ai éssayé aussi avec cette ligne de code :
feuilExcel.Rows(i).EntireRow.Delete


Mais rien à faire je n'arrive pas à supprimer la ligne. Comment fait-on svp?

A voir également:

5 réponses

Messages postés
23781
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
5 janvier 2021
6 548
Bonjour,

i = 4 
Worksheets("Feuil1").Rows(i).EntireRow.Delete

fonctionne.

Sinon il faut de finir feuilExcel en tant que variable :
dim feuilExcel as worksheet 
set feuilExcel = worksheets("Feuil1") 

eric
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
16362
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
5 janvier 2021
3 105
Bonjour

Salut Eric, ca faisait longtemps qu'on ne s'était pas croiser :o))

pour suprimer une ligne
https://excel.developpez.com/faq/index.php?page=Feuille#SupprimeCellLigneVide
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Est-ce que
feuilExcel.Range("A" & i).Value = ""
est vrai même si une formule est entrée? Car avec le EntireRow, les formules de mes cellules ne sont plus supprimées.
Messages postés
23781
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
5 janvier 2021
6 548
pourquoi poser une question si tu n'utilises pas les réponses ?
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
J'ai utilisé ta réponse, voici mon code :

For i = 200 To 3
If feuilProcesExcel.Cells(i, 1) = "" Then
MsgBox ("Vide pour i = " & i)
feuilProcesExcel.Rows(i).EntireRow.Delete
Exit For
End If
Next i

DoEvents


Cependant, aucune MsgBox n'apparaît, c'est pourquoi je me suis posé la question si mon If passait à vrai car pour moi, il ne rentre jamais dans le If
Messages postés
23781
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
5 janvier 2021
6 548
Worksheets("Feuil1").Rows(i).EntireRow.Delete

fonctionne.

Sinon il faut définir feuilExcel en tant que variable :

dim feuilExcel as worksheet
set feuilExcel = worksheets("Feuil1")


je ne vois pas feuilProcesExcel déclaré en variable...
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Voici mon code entier, on se prendra moins la tête :
Dim docExcel
Dim docExcel
Dim classExcel
Dim feuilExcel
Dim Plage
Dim ligne As Integer
Dim i As Integer

Set docExcel = CreateObject("Excel.Application")
Set classExcel = docExcel.Workbooks.Open(".....xls")
Set feuilExcel = classExcel.Worksheets("ProcesVente")

For ligne = 3 To 200 'Début de la boucle For

feuilExcel.Rows(ligne).Insert 'On insére 200 lignes dans le PV
feuilExcel.Range("A2:H2").Copy Destination:=feuilExcel.Range("A" & ligne) 'On copie la formule de A2 dans toute la colonne A
Next ligne 'Fin de la boucle For
'feuilExcel.Range("A2").AutoFill Destination:=feuilExcel.Range("A3:A201"), Type:=xlFillDefault

DoEvents

For i = 200 To 3
If feuilExcel.Range("A" & i).Value = "" Then
feuilExcel.Rows(i).EntireRow.Delete
End If
Next i

DoEvents

A partir de là, j'obtiens bien les 200 lignes crées avec les valeurs souhaitées dedans. Cependant sur les 200 lignes, j'ai environ 150 lignes qui sont vides (avec des formules mais où j'affiche la chaîne vide "") que je souhaites supprimé. Et mon seconde For ne supprime rien du tout, je ne sais pas pourquoi...
Messages postés
23781
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
5 janvier 2021
6 548
le fichier anonymisé serait mieux...
cjoint.com et coller ici le lien fourni

Et quand tu déclares des variable essaie de les typer. Là elles sont toutes en variant.
C'est sûr que ça fait moins d'erreurs mais ça n'aide pas le débogage et c'est beaucoup plus lent.

eric
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
En fait je me suis rendu compter que la ligne qui plantais n'était pas celle où je supprimais la ligne, mais celle où je vérifie si la cellule est vide ou non. Dans toutes mes cellules du tableau, j'ai une formule de ce type :
=SI(Feuil2!G2="";"";Feuil2!B2)
Et quand j'effectue le test :
If IsEmpty(feuilProcesExcel.Cells(ligne, 1).Value) = True

et bien la condition est toujours False, donc je n'entre jamais dans mon If et donc je ne supprime jamais mes lignes (J'ai vérifié avec =False, toutes mes lignes sont supprimées).

Donc une question me vient : Comment vérifié qu'aucune valeur numérique n'est dans une cellule (qui affiche donc "" grâce à ma formule) car IsEmpty ne regarde pas la valeur de la cellule mais bien la formule.

PS : Je vais t'envoyer le fichier eriiic
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Voici le fichier xls : https://www.cjoint.com/?0Dxo7cTsX15

Voici la macro Word qui correspond :

Sub RecupTableau() 

Dim docExcel 
Dim classExcel 
Dim feuilProcesExcel 
Dim Plage 
Dim ligne As Integer 
Dim i As Integer

Set docExcel = CreateObject("Excel.Application") 
Set classExcel = docExcel.Workbooks.Open(".....xls") 
Set feuilProcesExcel = classExcel.Worksheets("ProcesVente") 

For ligne = 3 To 200 'Début de la boucle For 
feuilProcesExcel.Rows(ligne).Insert 'On insére 200 lignes dans le PV 
feuilProcesExcel.Range("A2:H2").Copy Destination:=feuilProcesExcel.Range("A" & ligne) 'On copie la formule de A2 dans toute la colonne A 
Next ligne 'Fin de la boucle For 
DoEvents 

For i = 200 To 3
If feuilProcesExcel.Cells(ligne, 1).Value = "" Then
feuilProcesExcel.Rows(ligne).EntireRow.Delete
End If
Next i
DoEvents

Plage = "PVVente" 
feuilProcesExcel.Range(Plage).Copy 
DoEvents 

Selection.PasteExcelTable False, False, False 
DoEvents 

classExcel.Save 
classExcel.Close False 
DoEvents 

docExcel.Quit 
Set docExcel = Nothing 
Set classExcel = Nothing 
Set feuilExcel = Nothing 

End Sub


EDIT : Je me suis rendu compte que j'ai une problématique de démarche. J'ai éssayé de supprimer les lignes directement si elles sont vides, sans créer les 200 avant, sauf que les formules dépendent des lignes vu que je les copient, il me faut donc un second For une fois les 200 créées qui me permettrait de supprimer les lignes vides, j'ai donc édité mon code.
Cependant, mon second for ne supprime pas les lignes vides, je ne sais pas pourquoi encore...
Messages postés
23781
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
5 janvier 2021
6 548
Set classExcel = docExcel.Workbooks.Open(".....xls") 
je crois comprendre que tu veux ouvrir un autre classeur.
C'est celui là qui sera actif pour la suite...
Supprime cette ligne si tu ne veux pas travailler dans un autre classeur.
Et pour déclarer la variable type worksheet tu peux utiliser ce que je t'ai proposé, plus standard.

For i = 200 To 3 step -1    
If feuilProcesExcel.Cells(ligne, 1).Value = "" Then    
feuilProcesExcel.Rows(ligne).EntireRow.Delete    
End If    
Next i 

pas très rigoureux ça...
- manque step -1
- boucle sur i, et dans la boucle tu utilises la variable ligne (???)

eric
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Oui j'ai retrouvé quelques erreurs en effet, merci de me l'avoir fait remarqué.
Pour ce qui est du classeur, c'est normal. Je suis sur une macro Word, il faut donc que je définisse sur quel classeur je souhaite travailler.
Donc, après réglages des erreurs, voici le code :

For ligne = 3 To 200
feuilProcesExcel.Rows(ligne).Insert
feuilProcesExcel.Range("A2:H2").Copy Destination:=feuilProcesExcel.Range("A" & ligne) 
Next ligne 
DoEvents

For i = 200 To 3 Step -1
If feuilProcesExcel.Cells(i, 6).Value = "" Then
feuilProcesExcel.Rows(i).EntireRow.Delete
End If
Next i 
DoEvents 


Merci à toi eriiic de m'avoir aidé, je vais aller me coucher maintenant, je pense que j'en ai besoin aprés les erreurs que j'ai fait ;)
Messages postés
23781
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
5 janvier 2021
6 548
Je suis sur une macro Word
Je n'y avais pas prété attention...
C'est résolu ?
eric
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Oui c'est résolu merci bien :)