XL 2019 VBA supprimer des lignes en fonction d'une condition

Céline49

XLDnaute Junior
Bonjour,
Je sollicite votre aide. Je recherche à supprimer toutes les lignes dont le continu de la colonne A contient "Facture".
Je me suis inspirée de la proposition de https://olivier-bureautique.blogspot.com/2009/04/excel-2007-vba-supprimer-des-lignes-en.html
mais cela ne fonctionne pas.
Voici comment j'ai rédigé mon code sachant que je n'ai pas besoin de l'appliquer à tous les onglets:

Option Explicit
Dim DerLgn As Integer
Dim Lgn As Integer
Sub test()

For DerLgn = .Cells(Rows.Count, 1).End(xlUp).Row 'on détermine la dernière ligne non vide de la Colonne A
For Lgn = DerLgn To 2 Step -1 'pour chaque ligne en partant du Bas
If .Cells(Lgn, 1) Like "Facture*" Then 'Si la Cellule commence pas par "Facture" on ne fait rien
Else 'Si la Cellule de la Colonne 1 ,ne commence pas par "Facture"
.Cells(Lgn, 1).EntireRow.Delete 'on supprime la Ligne
End If

End Sub

Merci de votre aide
 

fanfan38

XLDnaute Barbatruc
Bonjour
Un fichier exemple est TOUJOURS le bienvenu...
on met un point devant cells quand on a mis un with sheets(mafeuille)
Option Explicit
Dim DerLgn As Integer
Dim Lgn As Integer
Sub test()

DerLgn = Cells(Rows.Count, 1).End(xlUp).Row 'on détermine la dernière ligne non vide de la Colonne A
For Lgn = DerLgn To 2 Step -1 'pour chaque ligne en partant du Bas
If Cells(Lgn, 1) Like "Facture*" Then 'Si la Cellule comprend "Facture"
Cells(Lgn, 1).EntireRow.Delete 'on supprime la Ligne
End If

End Sub
A+ François
 

Céline49

XLDnaute Junior
Bonjour
Un fichier exemple est TOUJOURS le bienvenu...
on met un point devant cells quand on a mis un with sheets(mafeuille)
Option Explicit
Dim DerLgn As Integer
Dim Lgn As Integer
Sub test()

DerLgn = Cells(Rows.Count, 1).End(xlUp).Row 'on détermine la dernière ligne non vide de la Colonne A
For Lgn = DerLgn To 2 Step -1 'pour chaque ligne en partant du Bas
If Cells(Lgn, 1) Like "Facture*" Then 'Si la Cellule comprend "Facture"
Cells(Lgn, 1).EntireRow.Delete 'on supprime la Ligne
End If

End Sub
A+ François


Merci François...mais je dois avoir un autre problème. Ci-joint le fichier qui te permettra de tester d'où peut provenir l'erreur.
 

Pièces jointes

  • Test supprimer ligne Facture.xlsm
    33.5 KB · Affichages: 16

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Céline, Fanfan,
Si j'ai bien compris on ne garde que les lignes qui commencent par Facture :
Code:
Option Explicit
Sub test()
Dim DerLgn As Integer
Dim Lgn As Integer
For DerLgn = 1 To Cells(Rows.Count, 1).End(xlUp).Row 'on détermine la dernière ligne non vide de la Colonne A
    For Lgn = DerLgn To 2 Step -1 'pour chaque ligne en partant du Bas
        If Cells(Lgn, 1) Like "Facture*" = False Then 'Si la Cellule commence pas par "Facture" on ne fait rien
            Cells(Lgn, 1).EntireRow.Delete 'on supprime la Ligne
        End If
    Next Lgn
Next DerLgn
End Sub
NB :
Pas de . devant Cells s'il n'y a pas un référent avant de type With...
Chaque For doit avoir son Next.
De préférence déclarer les variables locales après le Sub.
 

James007

XLDnaute Barbatruc
Bonjour à tous,

Pour beaucoup plus d'efficacité et de rapidité : AutoFilter ...

VB:
Sub SuppLigFacture()
    With ActiveSheet.Range("A1").CurrentRegion
        .AutoFilter field:=1, Criteria1:="Facture"
        .Offset(1, 0).EntireRow.Delete
        .AutoFilter
    End With
End Sub
 

Pièces jointes

  • Test Supp_Lignes_Factures.xlsm
    33.5 KB · Affichages: 17

Céline49

XLDnaute Junior
Bonjour,
La formule de James007 fonctionne parfaitement quand je l'applique sans mes autres macros mais je ne m'en sors pas si je la rattache à mon fichier d'origine. Qu'est-ce que je ne fais pas bien?


L'application des macros est très lente alors que mon fichier de base ne contient que 300 lignes (que j'ai limité ici à une centaine).

Par ailleurs, je cherche à dupliquer 3 fois l'onglet "prétravail" dans 3 onglets après sans recopier les macros de l'onglet "prétravail" et à renommer ces 3 nouvels onglets en "Vt", "TVA", "Clt" puis ensuite à y appliquer des macros spécifiques à chaque onglet comme suit:
* Pour l'onglet "Vt", réorganiser l'ordre des colonnes pour obtenir Date / Pièce/ Cpte Vente (attention cellule calculer) / Nom client / Vide / HT
* Pour l'onglet "TVA", réorganiser l'ordre des colonnes pour obtenir Date / Pièce/ Cpte TVA / Nom client / Vide / TVA (attention cellule calculer)
* Pour l'onglet "Clt", réorganiser l'ordre des colonnes pour obtenir Date / Pièce/ Code client / Nom client / TTC

Par ailleurs, l'application des macros est très lente alors que mon fichier de base ne contient que 300 lignes (que j'ai limité ici à une centaine).

Je suis débutante en la matière et je recherche désespéramment sur internet mais....!!!!


Mon fichier est trop volumineux pour tenir en pièce jointe... il fait 47,9 Mo !!! J'ai forcément un problème lié aux macros...mais qu'est-ce qui est redondant !!! je vous fourni le fichier de base sans les macros et mes macros ci-dessous:

Sub REORGANISATION()

Dim DerLgn As Integer
Dim Lgn As Integer

'Désactiver le raffraichissement d'écran
Application.ScreenUpdating = False


'Supprimer colonnes inutiles
Range("C:C,H:K,M:N").Delete

'Insérer colonne en B
Columns(2).Insert


'Calcul la TVA collectée dans la colonne B
Range("B2:B" & [F65536].End(xlUp).Row).FormulaR1C1 = "=RC[-1]-RC[1]"

'Trouver le code de vente
Range("I:I").FormulaLocal = "=recherchev(H:H;article;2;FAUX)"

'Renommer des colonnes
Range("A1").Value = "TTC"
Range("B1").Value = "TVA"
Range("C1").Value = "HT"
Range("D1").Value = "Pièce"
Range("E1").Value = "Code client"
Range("F1").Value = "Nom client"
Range("G1").Value = "Date"
Range("H1").Value = "Code article"
Range("I1").Value = "Cpte vente"
Range("J1").Value = "Tx TVA"
Range("J1").Value = "Cpte TVA"

' Supprimer les lignes dont la colonne A contient Facture

With ActiveSheet.Range("A1").CurrentRegion
.AutoFilter field:=1, Criteria1:="Facture"
.Offset(1, 0).EntireRow.Delete
.AutoFilter
End With


' Calculer le taux de TVA dans colonne J et y attribuer un compte de TVA (445710 pour 0,2 - 445713 pour 0,055 - 445714 pour 0,1

Columns("J:J").Select
Selection.FormulaR1C1 = "=ROUND(RC[-8]/RC[-7],3)"
Columns("K:K").Select
Selection.FormulaR1C1 = "=IF(RC[-1]=0.2,445710,IF(RC[-1]=0.055,445713,IF(RC[-1]=0.1,445714,471000)))"



' Copier cet onglet dans un nouvel onglet situé juste après
Worksheets("prétravail").Copy After:=Worksheets("prétravail")

'Réactiver le raffraichissement d'écran
Application.ScreenUpdating = True


End Sub
 

Pièces jointes

  • Fichier vierge de macros.xlsm
    34.2 KB · Affichages: 7

James007

XLDnaute Barbatruc
Salut Céline49,

Justement la macro avec AutoFilter est beaucoup plus rapide pour les fichiers importants comme le tien .... ;)

Est-ce la suppression des lignes ... ou autre chose qui prend du temps ...?

Au fait... je viens de le remarquer ... la première ligne de ta feuille doit impérativement contenir les entêtes dans toutes les colonnes ...!!!
 

Céline49

XLDnaute Junior
Salut Céline49,

Justement la macro avec AutoFilter est beaucoup plus rapide pour les fichiers importants comme le tien .... ;)

Est-ce la suppression des lignes ... ou autre chose qui prend du temps ...?

Au fait... je viens de le remarquer ... la première ligne de ta feuille doit impérativement contenir les entêtes dans toutes les colonnes ...!!!
Comment puis-je savoir ce qui prends du temps et alourdi mon fichier relativement basique au demeurant?
 

Céline49

XLDnaute Junior
Pour ta remarque d'entête dans toutes les colonnes:
Mon 1er onglet correspond à l'extraction que je récupère d'un logiciel...qui ne contient pas effectivement des entêtes par tout. Est-ce possible de prévoir de rajouter une entête "automatique" pour créer une entête et ne pas avoir de problème?
 

James007

XLDnaute Barbatruc
Comment puis-je savoir ce qui prends du temps et alourdi mon fichier relativement basique au demeurant?


Re,
Fichier basique ... mais pas mal de petites améliorations possibles .. ;)
Il me faut quelques minutes ...
....
Pour ta remarque d'entête dans toutes les colonnes:
Mon 1er onglet correspond à l'extraction que je récupère d'un logiciel...qui ne contient pas effectivement des entêtes par tout. Est-ce possible de prévoir de rajouter une entête "automatique" pour créer une entête et ne pas avoir de problème?

Oui ... cela peut être ajouter à ta macro REORGANISATION ...

Cà tombe bien ... c'est justement de cela dont on parle ...;););)
 

James007

XLDnaute Barbatruc
Re,

Ci-joint ton fichier test ...

Quelques précisions :

1. Ta feuille ' fichier d'origine ' contient les données de départ et ta macro tournera sur cette feuille avant de tout copier sur ta feuille prétravail

2. Ta feuille ' table ' ne contient pas toutes les références ( N016, T002, etc...) j'ai ajouté ' pas de compte ' ... et dorénavant elle contient deux nouvelles colonnes F et G pour compte affectation TVA ...

En espèrant que cela t'aide
 

Pièces jointes

  • Test Céline.xlsm
    30.4 KB · Affichages: 12

Statistiques des forums

Discussions
312 104
Messages
2 085 344
Membres
102 865
dernier inscrit
FreyaSalander