Suppression de lignes Excel en VBA
Résolu/Fermé
linkcr15
linkcr15
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
linkcr15
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
A voir également:
- Vba supprimer ligne
- Supprimer ligne vba - Meilleures réponses
- Supprimer ligne excel vba - Meilleures réponses
- Vba supprimer une ligne ✓ - Forum - VB / VBA
- Vba supprimer plusieurs lignes ✓ - Forum - Excel
- Supprimer une ligne excel VBA ✓ - Forum - VB / VBA
- VBA supprimer plusieurs lignes entières ✓ - Forum - VB / VBA
- Excel VBA : supprimer les lignes en doublon ✓ - Forum - VB / VBA
5 réponses
eriiic
Modifié par eriiic le 23/04/2012 à 12:18
- Messages postés
- 24393
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 26 mai 2022
Modifié par eriiic le 23/04/2012 à 12:18
Bonjour,
fonctionne.
Sinon il faut de finir feuilExcel en tant que variable :
eric
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
michel_m
23 avril 2012 à 14:41
- Messages postés
- 16569
- Date d'inscription
- lundi 12 septembre 2005
- Statut
- Contributeur
- Dernière intervention
- 23 mai 2022
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
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
linkcr15
23 avril 2012 à 13:59
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
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.
eriiic
23 avril 2012 à 14:03
- Messages postés
- 24393
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 26 mai 2022
23 avril 2012 à 14:03
pourquoi poser une question si tu n'utilises pas les réponses ?
linkcr15
23 avril 2012 à 14:07
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
23 avril 2012 à 14:07
J'ai utilisé ta réponse, voici mon code :
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
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
eriiic
Modifié par eriiic le 23/04/2012 à 14:25
- Messages postés
- 24393
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 26 mai 2022
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...
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...
linkcr15
23 avril 2012 à 14:31
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
23 avril 2012 à 14:31
Voici mon code entier, on se prendra moins la tête :
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...
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...
eriiic
Modifié par eriiic le 23/04/2012 à 14:39
- Messages postés
- 24393
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 26 mai 2022
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
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
linkcr15
Modifié par linkcr15 le 23/04/2012 à 14:59
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
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 :
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
=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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
linkcr15
Modifié par linkcr15 le 23/04/2012 à 15:35
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
Modifié par linkcr15 le 23/04/2012 à 15:35
Voici le fichier xls : https://www.cjoint.com/?0Dxo7cTsX15
Voici la macro Word qui correspond :
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...
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...
eriiic
Modifié par eriiic le 23/04/2012 à 17:07
- Messages postés
- 24393
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 26 mai 2022
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
linkcr15
23 avril 2012 à 17:56
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
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 :
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 ;)
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 ;)
eriiic
23 avril 2012 à 20:21
- Messages postés
- 24393
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 26 mai 2022
23 avril 2012 à 20:21
Je suis sur une macro Word
Je n'y avais pas prété attention...
C'est résolu ?
eric
Je n'y avais pas prété attention...
C'est résolu ?
eric
linkcr15
24 avril 2012 à 09:03
- Messages postés
- 362
- Date d'inscription
- mercredi 7 janvier 2009
- Statut
- Membre
- Dernière intervention
- 31 mars 2016
24 avril 2012 à 09:03
Oui c'est résolu merci bien :)