XL 2019 Suppressions de lignes sous condition

cyril01250

XLDnaute Nouveau
Bonjour,
je souhaite supprimer des lignes si la colonne A et B contiennent la même valeur numérique dans un tableau qui contient un nombre variable de lignes.
En cherchant, des macros existent avec une seule condition ou plusieurs conditions dans une même colonne.
En vous remerciant pour l'aide apportée.
Cordialement
Cyril
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bien le bonjour Staple, Mapomme,

Je viens de me rappeler qu'il y a fort longtemps j'ai eu ce genre de problème de freeze. Ca se produisait car Windows était "vérolé", il devait lui manquer quelque chose. Et à ce moment là il partait dans une boucle de réparation. ( mais comme c'était sous XP je n'ai pas fait le rapport )

"Si j'étais moi" comme dirait certain, je vérifierai mon Windows, ainsi que Office, et tant qu'à faire je vérifierais mon disque.
A l'époque il avait trouvé des trucs bizarres qu'il avait réparé, et tout est rentré dans l'ordre.

NB: pour la macro du post #74, désolé mon 2007 me jette sur la ligne :
VB:
pvt.AddDataField pvt.PivotFields("COLA"), "Somme de COLA", xlSum
 

Staple1600

XLDnaute Barbatruc
Bonjour Sylvanu

Mon PC n'est pas vérolé.
1) Je navigue sur le net avec javascript désactivé
2) J'ouvre toujours les *.xls? sans activer les macros
3) Je n'installe pas une multitude de freeware ou shareware
4) J'ai réinstaller Office 2013 (complètement cet automne)
mais merci pour tous ces liens

NB: Pour le test de mon dernier code
A1= COLA
B1=COLB
C1=UNIQUES
La macro est lancée sur la feuille active
(Si on relance la macro, supprimez la feuille tmp avant
mais je sais que tu le sais déjà ;))
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Mon PC n'est pas vérolé.
Ne veut pas dire que votre PC a un virus. Ca veut dire qu'à un moment ou un autre un fichier système, une clé de registre, un secteur disque a été corrompu.
Mon PC est aussi toujours très propre et très bien protégé. Cela confine à la paranoïa. Et pourtant c'est arrivé.

Je raisonne à l'envers. Ma macro s'exécute en 500ms, et de temps en temps elle met 6 secondes. Pourquoi Windows ou XL freeze ? Que se passe t-il pour qu'ils se mettent en mode panique ?

Pour la macro : Evidemment ça, j'avais compris, mais il coince toujours avec ce message :
1608459590314.png
 

Staple1600

XLDnaute Barbatruc
Re

Et si tu fais la manip manuellement en faisant tourner l'enregistreur de macros?
La syntaxe VBA des TCD, doit différer entre Excel 2007 et 2013

PS: Pour Windows...
j'ai désactivé moult services, j'ai désactivé la télémétrie, enfin tout ce qui pouvait l'être, l'est (désactivé)
Jadis, j'utilisais CCLeaner (plus depuis leur piratage et ensuite le rachat de Piriform par Avast)
 

Staple1600

XLDnaute Barbatruc
Re

=>mapomme
Donc pour une fois, une fonctionnalité native d'Excel est à oublié au profit de VBA.
Reste à tester avec PQ ;)
Ce que je m'en vais faire après avoir déjeuner.
Bon appétit à ceux qui sortent des Cellules du Tableur, pour passer à Table. ;)

=>Sylvanu
Ma petite vertu est intacte ;)
01_NoVeroleAtALL.jpg
 

cyril01250

XLDnaute Nouveau
Bonjour,
merci pour toutes vos propositions.
Je vous propose mon code. Il met 50 sec. environ pour traiter 14000 lignes.
Existe-t-il une solution pour réduire ce temps de traitement ?
Merci
Sub Suppr()
Dim i As Long
Dim DerLignePC As Long
DerLignePC = Range("A" & Application.Rows.Count).End(xlUp).Row
i = 2
While i <= DerLignePC
If Cells(i, 8).Value = "1899" And Cells(i, 10).Value = "1899" Then
Cells(i, 1).EntireRow.Delete
Else
i = i + 1
End If
Wend
End Sub
 

cyril01250

XLDnaute Nouveau
Bonjou Cyril,R@chid, Staple,
@Staple,
Votre macro est ralentie par le fait le travail s'effectue alors que plein de formules sont présentes.
Alors plus rapide encore :
VB:
Sub SupprimeLignesC()
Dim T0, DL
T0 = Timer
Application.ScreenUpdating = False
DL = Range("A65500").End(xlUp).Row
With ActiveSheet.UsedRange
    .Columns(5).EntireColumn.Insert
    With Range(Cells(2, 5), Cells(DL, 5))
        .FormulaR1C1 = "=IF(AND(COUNTA(RC1:RC2)>1,RC1=RC2),1,"""")"
        .Value = .Value
        .EntireRow.Sort .Cells, xlDescending
        On Error Resume Next
        .SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete
        .EntireColumn.Delete
    End With
End With
With ActiveSheet.UsedRange: End With
[L1] = " Temps de traitement : " & Round(1000 * (Timer - T0)) & "ms."
End Sub
Sur mon PC avec 10 000 lignes : 120ms.
Bonjour,
solution très intéressante
Cependant, je n'arrive pas à la transposer à mon fichier (joint) par manque de compréhension.
Une macro existe avec une boucle. Le résultat arrive au bout de 50 sec avec 14000 lignes, réduit à 10000 pour cause de fichier trop volumineux.
Pourrais-tu m'aider pour adapter ton code à celui de ma macro ?
Merci
Cordialement
Cyril
 

Pièces jointes

  • Classeur2.xlsm
    982.4 KB · Affichages: 17

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Cyril,
Un essai en PJ.
VB:
Sub Macro1()
Dim i As Integer, DerLignePC As Long
Application.ScreenUpdating = False
DL = Range("A65000").End(xlUp).Row
For i = DL To 2 Step -1
    If Range("H" & i).Value = "1899" And Range("J" & i).Value = "1899" Then
        Cells(i, 1).EntireRow.Delete
    End If
    Application.StatusBar = "Progression : " & Round(100 * (DL - i) / DL, 0) & "%" & " N° ligne traitée : " & i
Next i
Application.StatusBar = ""
End Sub
Il ne faut jamais oublier la ligne Application.ScreenUpdating = False qui fige l'affichage et donc accélère grandement les choses.
Mais comme l'écran est figé, je met la progression dans le statusbar pour informer ( et faire patienter ) l'utilisateur.
Chez moi ça marche impec. Pas de problème où d'erreur.
NB : j'ai passé le fichier de xlsm à xlsb ( 1.08Mo qui ne passent pas sue XLD contre 447k ). Aucun impact sauf si vous utilisez une tablette, dans ce cas ré enregistrez le en xlsm.
 

Pièces jointes

  • Classeur2 (10).xlsb
    443.5 KB · Affichages: 1

cyril01250

XLDnaute Nouveau
Bonjour Cyril,
Un essai en PJ.
VB:
Sub Macro1()
Dim i As Integer, DerLignePC As Long
Application.ScreenUpdating = False
DL = Range("A65000").End(xlUp).Row
For i = DL To 2 Step -1
    If Range("H" & i).Value = "1899" And Range("J" & i).Value = "1899" Then
        Cells(i, 1).EntireRow.Delete
    End If
    Application.StatusBar = "Progression : " & Round(100 * (DL - i) / DL, 0) & "%" & " N° ligne traitée : " & i
Next i
Application.StatusBar = ""
End Sub
Il ne faut jamais oublier la ligne Application.ScreenUpdating = False qui fige l'affichage et donc accélère grandement les choses.
Mais comme l'écran est figé, je met la progression dans le statusbar pour informer ( et faire patienter ) l'utilisateur.
Chez moi ça marche impec. Pas de problème où d'erreur.
NB : j'ai passé le fichier de xlsm à xlsb ( 1.08Mo qui ne passent pas sue XLD contre 447k ). Aucun impact sauf si vous utilisez une tablette, dans ce cas ré enregistrez le en xlsm.
J'étais intéressé par votre code car le traitement est beaucoup plus rapide.
quelles sont les modifications à apporter pour qu'il fonctionne avec les inputs souhaités ?
Merci
 

cyril01250

XLDnaute Nouveau
Et quelles sont elles ?
Je n'ai fait que reprendre votre macro et adaptée pour l'accélérer. Je n'y ai rien touché.
Sub SupprimeLignesC()
Dim T0, DL
T0 = Timer
Application.ScreenUpdating = False
DL = Range("A65500").End(xlUp).Row
With ActiveSheet.UsedRange
.Columns(5).EntireColumn.Insert
With Range(Cells(2, 5), Cells(DL, 5))
.FormulaR1C1 = "=IF(AND(COUNTA(RC1:RC2)>1,RC1=RC2),1,"""")"
.Value = .Value
.EntireRow.Sort .Cells, xlDescending
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete
.EntireColumn.Delete
End With
End With
With ActiveSheet.UsedRange: End With
[L1] = " Temps de traitement : " & Round(1000 * (Timer - T0)) & "ms."
End Sub
Sur mon PC avec 10 000 lignes : 120ms.

le code que vous proposez, ci-dessus, permet un traitement de 10000 lignes en 120 ms alors que ma macro modifiée par vos soins traite en 28 Sec. D'où mon intérêt.
les inputs souhaités : supprimer une ligne si les cellules des colonnes H et J sont égales à 1899
 

Discussions similaires

Réponses
7
Affichages
347

Statistiques des forums

Discussions
312 198
Messages
2 086 124
Membres
103 126
dernier inscrit
Vuagno27