Suppression de lignes Excel en VBA

Résolu/Fermé
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
- 23 avril 2012 à 11:44
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
- 24 avril 2012 à 09:03
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?

5 réponses

eriiic
Messages postés
24393
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
26 mai 2022
7 078
Modifié par eriiic le 23/04/2012 à 12:18
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
michel_m
Messages postés
16569
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
23 mai 2022
3 280
23 avril 2012 à 14:41
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
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
23 avril 2012 à 13:59
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.
0
eriiic
Messages postés
24393
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
26 mai 2022
7 078
23 avril 2012 à 14:03
pourquoi poser une question si tu n'utilises pas les réponses ?
0
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
23 avril 2012 à 14:07
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
0
eriiic
Messages postés
24393
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
26 mai 2022
7 078
Modifié par eriiic le 23/04/2012 à 14:25
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...
0
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
23 avril 2012 à 14:31
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...
0
eriiic
Messages postés
24393
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
26 mai 2022
7 078
Modifié par eriiic le 23/04/2012 à 14:39
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
0
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Modifié par linkcr15 le 23/04/2012 à 14:59
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
0

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

Posez votre question
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
Modifié par linkcr15 le 23/04/2012 à 15:35
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...
0
eriiic
Messages postés
24393
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
26 mai 2022
7 078
Modifié par eriiic le 23/04/2012 à 17:07
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
0
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
23 avril 2012 à 17:56
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 ;)
0
eriiic
Messages postés
24393
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
26 mai 2022
7 078
23 avril 2012 à 20:21
Je suis sur une macro Word
Je n'y avais pas prété attention...
C'est résolu ?
eric
0
linkcr15
Messages postés
362
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
31 mars 2016
13
24 avril 2012 à 09:03
Oui c'est résolu merci bien :)
0