Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Supprimer des plages de lignes dans un tableau

17 réponses
Avatar
Roland Miller
Bonjour,

Dison que le tableau a 5000 lignes.

Par la fonction .SpecialCells(xlCellTypeBlanks).EntireRow.Select je s=C3=A9=
lectionne les lignes vides. Cela prend une seconde!

Je veux ensuite supprimer ces lignes. Je fais ensuite un Selection.entirero=
w.delete. Je souhaiterais =C3=A9vider de faire une boucle.

Cela fonctionne mais prend beaucoup plus de temps que je le souhaiterais.

N'y aurait-il pas un truc ou une fa=C3=A7on de faire? Merci =C3=A0 l'avance=
.

10 réponses

1 2
Avatar
MichD
Le 21/07/19 à 11:56, Roland Miller a écrit :
Bonjour,
Dison que le tableau a 5000 lignes.
Par la fonction .SpecialCells(xlCellTypeBlanks).EntireRow.Select je sélectionne les lignes vides. Cela prend une seconde!
Je veux ensuite supprimer ces lignes. Je fais ensuite un Selection.entirerow.delete. Je souhaiterais évider de faire une boucle.

Bonjour,
Pour supprimer les lignes complètes d'une plage de cellules pour toutes
les cellules de la colonne A étant vides :
With Worksheets("Feuil1") 'Nom de la feuille à adapter
.Range("A1:A5000").SpecialCells(xlCellTypeBlanks).Interior.Color = vbBlue
End With
Tu peux remplacer la plage A1:A5000 par celle de ton choix. La seule
conditions, les cellules de la colonne doivent être totalement VIDE.
Aucune formule qui retourne des "".
MichD
Avatar
MichD
Le 21/07/19 à 12:14, MichD a écrit :
Le 21/07/19 à 11:56, Roland Miller a écrit :
Bonjour,
Dison que le tableau a 5000 lignes.
Par la fonction .SpecialCells(xlCellTypeBlanks).EntireRow.Select je
sélectionne les lignes vides. Cela prend une seconde!
Je veux ensuite supprimer ces lignes. Je fais ensuite un
Selection.entirerow.delete. Je souhaiterais évider de faire une boucle.

Bonjour,
Pour supprimer les lignes complètes d'une plage de cellules pour toutes
les cellules de la colonne A étant vides :
With Worksheets("Feuil1") 'Nom de la feuille à adapter
    .Range("A1:A5000").SpecialCells(xlCellTypeBlanks).Interior.Color =
vbBlue
End With
Tu peux remplacer la plage A1:A5000 par celle de ton choix. La seule
conditions, les cellules de la colonne doivent être totalement VIDE.
Aucune formule qui retourne des "".
MichD

Désolé est plutôt celle-ci :
With Worksheets("Feuil1") 'Nom de la feuille à adapter
.Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
MichD
Avatar
Roland Miller
Merci.
Oui effectivement. J'ai aussi utilisé ").SpecialCells(xlCellTypeBlanks ).EntireRow.Delete mais cela est aussi lent que selection.entirerow.delete après avoir fait le SpecialCells(xlCellTypeBlanks).select.
J'ai avant fais …
Application.enableeventsúlse
application.screenupdating = false
Feuil54.displaypagebreaks = false
application.calculation = xlmanual
Je me disais qu'il y avait peut-être un élément du genre qui pouvait causer la lenteur.
Avatar
Michel__D
Bonjour,
Le 21/07/2019 à 17:56, Roland Miller a écrit :
Bonjour,
Dison que le tableau a 5000 lignes.
Par la fonction .SpecialCells(xlCellTypeBlanks).EntireRow.Select je sélectionne les lignes vides. Cela prend une seconde!
Je veux ensuite supprimer ces lignes. Je fais ensuite un Selection.entirerow.delete. Je souhaiterais évider de faire une boucle.
Cela fonctionne mais prend beaucoup plus de temps que je le souhaiterais.
N'y aurait-il pas un truc ou une façon de faire? Merci à l'avance..

Je pense que si tu regroupe les lignes vides (avec un tri) cela devrait aller plus vite.
Donc question est-ce qu'un tri est réalisable pour ton tableau ?
Avatar
MichD
Quel est la grandeur de ta plage de cellules?
Quand tu parles de lenteur, combien de temps la procédure prend pour
s'exécuter? Quelle est ta version d'Excel?
Essaie ceci :
Copie ce qui suit dans le haut d'un MODULE standard :
Declare PtrSafe Function OpenClipboard Lib "user32" Alias _
"OpenClipboard" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" Alias _
"EmptyClipboard" () As Long
Declare PtrSafe Function CloseClipboard Lib "user32" Alias _
"CloseClipboard" () As Long
'--------------------------
Sub Vider_Presse_Papier()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub
'--------------------------
Dans ta procédure, appelle cette procédure au début de la tienne.
Call Vider_Presse_Papier
Si ta plage est vraiment grande et qu'elle a beaucoup de sections
(lignes vides entre sections), il se peut que le temps d'exécution soit
notable!
MichD
Avatar
MichD
Je te donne un exemple :
Soit ceci en colonne A1:A10
Les données débutent en ligne 2
En ligne A1, c'est la cellule de critère qui a la valeur 2 dans mon
exemple. Note que j'ai dans le reste de la liste, plus d'une fois la
valeur 2. Pour extraire la ligne de la cellule pour chacune des valeurs 2,
Tu peux utiliser la formule suivante en G1. Tu peux recopier la formule
sur le nombre de lignes voulues. Lorsque la formule retourne "" (rien),
cela signifie que tu as toutes les occurrence contenu dans la liste.
Pour obtenir la valeur de la colonne B pour chacune des lignes où le
numéro de compte existe en colonne A, tu as la formule suivante. Dans la
formule, tu peux remplacer le "B" pour la colonne de ton choix.
C'est une formule matricielle et doit être validé par Ctrl + Maj + Enter
=INDIRECT("B" &
PETITE.VALEUR(SI($A$2:$A$10=$A$1;LIGNE($A$2:$A$10));LIGNE(A1)))
A B
2 Ligne de critère en A1 soit 2
1 toto1
2 toto2
3 toto3
1 toto4
2 toto5
3 toto6
1 toto7
2 toto8
3 toto9
MichD
Avatar
Roland Miller
Bonjour,
La meilleure solution est assurément de trier les données pour re grouper les lignes en question. Mais il semble que je ne peux le faire car j'ai des cellules fusionnées et de tailles différentes. Excel aff iche alors un message à l'effet que je ne peux faire un tri.
À la base j'ai plus de 7800 lignes et qui peut monter jusqu'à 850 0 lignes dans certains cas.
Mais si je prend cet exemple … le nombre de lignes à supprimer serait de 700. Le 7800 lignes est la base qui demeure toujours.
Par exemple j'ai 150 lignes à supprimer et ça prend 2 minutes 20 secondes. Avec le Specialcells(xlblank … je sélectionne ces li gnes en une seconde.
Avatar
MichD
| que je ne peux le faire car j'ai des cellules fusionnées et de tailles
différentes.
**** Insérer des cellules fusionnées dans un tableau de données est une
mauvaise idée...Les données sont faites pour être manipulées et ces
cellules fusionnées accroissent substantiellement la tâche!
Par exemple j'ai 150 lignes à supprimer et ça prend 2 minutes 20 secondes.

Avec le Specialcells(xlblank … je sélectionne ces lignes en une seconde.
Pour supprimer des lignes, nul besoin de les sélectionner, par contre,
une seconde est plus que satisfaisant!
MichD
Avatar
MichD
je n'ai pas compris ta question. Il faut être plus précis.
Je n'ai pas vu le tableau de données sur lequel tu travailles et je n'ai
pas vu le code que tu utilises. Par conséquent, il est difficile de te
répondre.
Comment fais-tu pour déceler (sélectionner) les cellules fusionnées dans
une plage de cellules avec "SpecialCells" ?
Une idée...
Après avoir sélectionné les cellules fusionnées, en supposant qu'elles
contiennent une valeur unique, tu peux mettre dans une variable leur
contenu et à la fin de la procédure, tu fais une recherche afin de
retrouver cette valeur, et, tu la fusionnes à nouveau, tu peux même
t'assurer que leur valeur est identique en ajoutant tes initiales au
contenu, initiales que tu supprimes à la fin.
MichD
Avatar
Roland Miller
Bonjour,
Si ça peut aider …
Var_Selection1 = Feuil54.Range( _
Feuil54.Cells(Feuil54.Range("CN_FMDetTotIdentifZone").Row + 1, Feuil54.Rang e("CN_FMDetTotIdentifZone").Column), _
Feuil54.Cells(Feuil54.Range("CN_FMDetTotIdentifZone").Row + Feuil54.Range(" CN_FMDetTotIdentifZone").Rows.Count - 2, Feuil54.Range("CN_FMDetTotIdentifZ one").Column)).SpecialCells(xlCellTypeBlanks).Offset(0, -36).Address
Var_Selection2 = Feuil54.Range( _
Feuil54.Cells(Feuil54.Range("CN_FMDetTotIdentifZone").Row + 1, Feuil54.Rang e("CN_FMDetTotIdentifZone").Column), _
Feuil54.Cells(Feuil54.Range("CN_FMDetTotIdentifZone").Row + Feuil54.Range(" CN_FMDetTotIdentifZone").Rows.Count - 2, Feuil54.Range("CN_FMDetTotIdentifZ one").Column)).SpecialCells(xlCellTypeBlanks).Offset(0, -35).Address
Feuil54.Range(Var_Selection1, Var_Selection2).Select
Feuil54.Range(Var_Selection1, Var_Selection2).merge true
ou selection.merge true
1 2