bouton supprimer ligne =0 puis remonter [RÉSOLU]

azemer

XLDnaute Nouveau
Bonjours a tous

Etant novice sur excel je voudrais mettre en place un bouton intituler "valider" sur la feuille "1" qui me permettrais de supprimer toute les valeur ="0" dans la colonne "C" puis de remonter mes cellule le tout sur la feuille "2"
si possible avec une explication afin de comprendre comment cela fonctionne
Merci par avance de votre aide
Azemer
 

azemer

XLDnaute Nouveau
merci beaucoup pour vos réponses

Cathodique
sur une feuille test cela fonctionne nickel par contre sur mon projet lorsque je clic sur le bouton il y a une erreur a la ligne 3
VB:
ActiveSheet.Rows(i).Delete

DoubleZero
cela est plutot efficace seulement je n arrive pas a tous decrypter

VB:
Option Explicit
Sub Zéro_zéro_en_c()
' exécution du code accélérer
    Application.ScreenUpdating = False
    ' onglet "Feuil2" : supprimer les valeurs des colonnes a-l                pourquoi a-1?
    Sheets("Feuil2").Range("a:l").Clear
    ' filtre automatique sur la colonne c (3), valeurs différentes de zéro    pour filtrer sur la colone c=3 si j ai bien compris
    ActiveSheet.Range("a:l").AutoFilter Field:=3, Criteria1:="<>0", Operator:=xlAnd
    ' cellules visibles copier vers onglet "Feuil2", en a1
    Columns("a:l").SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Copy Sheets("Feuil2").Range("a1")
    ' filtre supprimer
    Cells.AutoFilter
    ' onglet "Feuil2" activer
    Sheets("Feuil2").Select
    ' colonnes ajuster
    Cells.EntireColumn.AutoFit
    Application.ScreenUpdating = True
End Sub

ci joint mon classeur excel

l idée de base etait sur la 1ere feuille le client fait son choix avec X
dans la 2ieme feuille le tableau est identique est reporte les X sinon =0
puis de cliquer sur le bouton pour supprimer ligne avec comme valeur 0 est de remonter afin d avoir un recapitulatif du menu

par contre cette solution m ouvre une autre perspective
toujours sur la feuille 1 le choix du client
puis valider pour copier et supprimer non X
 

Pièces jointes

  • test menu.xlsm
    26.7 KB · Affichages: 52
Dernière édition:

cathodique

XLDnaute Barbatruc
Ce sont tes cellules fusionnées qui causes problèmes. Refais un test lorsqu'il n'y a pas de cellules fusionnées en colonne C sur la feuil8.

Le code de DoubleZero, filtre la colonne C avec pour critère 0, et supprime toutes les lignes du filtre c-a-d les lignes visibles. C'est beaucoup plus rapide qu'une boucle sur toutes les lignes.
 

Pièces jointes

  • supprimer lignes ayant zero en col C.xlsm
    26.7 KB · Affichages: 27

azemer

XLDnaute Nouveau
Merci, j y avait pensé, j ai essayer ton code 2 fois sur une feuille vierge au départ avec 30 ligne avec certaine fusionné ou alors aucune fusionné sur A B C et cela a bien fonctionné
sur le classeur actuel je viens de tester sans fusion des cellule et il y a toujours la même erreur
 

cathodique

XLDnaute Barbatruc
Bonjour, si la structure de ta feuille ne change pas
VB:
Sub SupLig0()
    For i = 80 To 40 Step -1
        If ActiveSheet.Cells(i, 3).Value = 0 Then ActiveSheet.Rows(i).Delete
    Next i
   
    For i = 36 To 4 Step -1
        If ActiveSheet.Cells(i, 3).Value = 0 Then ActiveSheet.Rows(i).Delete
    Next i
End Sub
Pour le code de OO, ce n'est 1 mais L (colonne)
 

cathodique

XLDnaute Barbatruc
Merci, j y avait pensé, j ai essayer ton code 2 fois sur une feuille vierge au départ avec 30 ligne avec certaine fusionné ou alors aucune fusionné sur A B C et cela a bien fonctionné
sur le classeur actuel je viens de tester sans fusion des cellule et il y a toujours la même erreur
Tu avais posé ta question sans préciser que tu avais des cellules fusionnées.
Là encore, on ne peux pas deviner; joins le fichier le fichier.
 

job75

XLDnaute Barbatruc
Bonjour azemer, cathodique, DoubleZero,

Mieux vaut masquer les ligne que les supprimer !!!
Code:
Sub Masquer()
Dim i&
With ActiveSheet.UsedRange
  For i = 2 To .Rows.Count
    If UCase(.Cells(i, 3)) <> "X" Then .Rows(i).Hidden = True
  Next
End With
End Sub

Sub Afficher()
Rows.Hidden = False
End Sub
Aucun problème avec les cellules fusionnées.

Bonne journée.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Salut Job75:),

En fait, il avait 2 inconvénients - cellules fusionnées et formules matricielles sur la feuille de destination (feuil8).
Ta solution est plus judicieuse et la plus adaptée.

L'expérience fait toute la différence.

Bonne journée.
 

job75

XLDnaute Barbatruc
Re,

S'il y a une feuille de destination on peut comme DoubleZero utiliser le filtre automatique :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
Sheets("Feuil8").Activate 'feuille de destination, à adapter
Cells.Clear 'RAZ
Rows.RowHeight = 35 'hauteur modifiable, on ne touche pas aux colonnes dimensionnées manuellement
With Sheets("Feuil7").[A1].CurrentRegion 'feuille source, à adapter
  .AutoFilter 3, "X"
  .Copy [A1]
  .AutoFilter
End With
End Sub
C'est plus rapide s'il y a beaucoup de lignes.

Edit : j'avais écrit par erreur Application.ScreenUpdating = True

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

J'ai donné 2 solutions, en voici une 3ème :
Code:
Sub SupprimerLignes()
Application.ScreenUpdating = False
Sheets("Feuil8").Activate 'feuille de destination, à adapter
Sheets("Feuil7").Cells.Copy [A1] 'copie la feuille source, à adapter
With [A1].CurrentRegion.Offset(1)
  .UnMerge 'défusionne les cellules
  With .Columns(.Columns.Count + 1) 'colonne auxiliaire
    .FormulaR1C1 = "=1/(RC3=""X"")"
    .Value = .Value 'supprime les formules
    .EntireRow.Sort .Cells(1), Header:=xlNo 'tri pour accélérer
    .SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete
    On Error Resume Next 'si toutes les lignes ont été supprimées
    .Value = ""
  End With
  .Borders.Weight = xlThick 'bordures
End With
With ActiveSheet.UsedRange: End With 'actualise la barre de défilement verticale
End Sub
S'il y a un grand nombre de lignes c'est la solution la plus rapide.

Edit : pour lancer la macro pas besoin de bouton, placer dans le code de "Feuil8" :
Code:
Private Sub Worksheet_Activate()
SupprimerLignes
End Sub

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour à tous,

Non c'est bien la macro Filtrer qui est la plus rapide.

Testez le fichier joint de 40 000 lignes, chez moi sur Win 10 - Excel 2013 :

- macro Masquer => 17,5 secondes - avec bien sûr Application.ScreenUpdating = False

- macro Filtrer => 3,7 secondes

- macro SupprimerLignes => 6,1 secondes.

Bonne journée.
 

Pièces jointes

  • test menu 40 000 lignes.xlsm
    804 KB · Affichages: 42

Discussions similaires

Réponses
7
Affichages
324

Statistiques des forums

Discussions
312 103
Messages
2 085 323
Membres
102 862
dernier inscrit
Emma35400