Macro de selection et suppression

Bonjour a tous,

Je suis novice en VBA, petite précision, mais je suis curieux d'apprendre et surtout de comprendre.

Je reçois tous les mois un fichier très volumineux que je dois épurer, grosso modo 120Mo/2 onglets de 1 500 000 chacun, les limites d'excel par onglets si je ne m'abuse.

le problème étant que ce fichier n'est jamais identique sur sa forme (celui-ci étant le catalogue d'un constructeur informatique) donc la macro actuelle n'est pas optimisée car les résultats obtenu ne sont pas corrects, j'ai réalisé la macro a partir de l'enregistreur de macro.

ActiveSheet.Range("$A$1:$F$721478").AutoFilter Field:=4, Criteria1:= _
        "=*refurb*", Operator:=xlAnd
    Rows("273:273").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$721133").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$721133").AutoFilter Field:=4, Criteria1:= _
        "=*remanu*", Operator:=xlAnd
    Rows("1363:1363").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$718217").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$718217").AutoFilter Field:=4, Criteria1:= 

Cette macro ayant été réalisée il y a un an, les produits "refurb" ont augmentés donc la sélection est fausse, idem pour les remanu et j'en ai encore pleins d'autres a supprimer que je mets a jours dans un onglets. Grosso modo j'ai plus de 50 (reférences a supprimer) qui supprime environ 1.5 millions de lignes.

Qui pourrait m'aider pour adapter cette pseudo macro de débutant et en faire quelque chose de plus efficace et professionnel.

Je remercie ceux qui prendront du temps a me lire et a m'expliquer.

Bien a vous tous

Bonjour Christophe et bienvenu, bonjour le forum,

Peut-être comme ça :

Public Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim PLU As Range 'déclare la variable O (PLage Utile)

Set O = ActiveSheet 'définit l'onglet O
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
Set PLU = PL.Offset(1, 0).Resize(PL.Rows.Count - 1, PL.Columns.Count) 'définit la plage utile PLU (sans la première ligne de PL)
PL.AutoFilter Field:=4, Criteria1:="=*refurb*", Operator:=xlOr, Criteria2:="=*remanu*" 'filtre les 2 cas
PLU.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes visibles de la plage utile PLU
PL.AutoFilter 'supprime le filtre
End Sub

Merci de ta réponse rapide ThauThème,

Je vais essayer d'adapter celle ci a ma macro existante.

Sans trop vouloir abuser, j'aimerai comprendre car j'ai peut etre zappé l'essentiel a savoir les bases du VBA,

j'ai compilé en une macro sur un fichier distinc l'ensemble des actions d=que je souhaite voir réalisée.

Sub supprimedoublons()

Windows("GPL CISCO.xlsx").Activate

Dim EtatStatusBar As Boolean
EtatStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "Veuillez patienter ACTION EN COURS ..."
'----------------------
' ton code

'
    Range("A1:F1").Select
    Selection.AutoFilter
    Sheets("Glemea2").Select
    Range("A1:F1").Select
    Selection.AutoFilter
    Sheets("Glemea1").Select
    Range("A2").Select
    ActiveSheet.Range("$A:$F").RemoveDuplicates Columns:=Array(3, 4), Header:= _
        xlYes
    Sheets("Glemea2").Select
    Range("A2").Select
    ActiveSheet.Range("$A:$F").RemoveDuplicates Columns:=Array(3, 4), Header:= _
        xlYes
    ActiveSheet.Range("$A$1:$F$721478").AutoFilter Field:=4, Criteria1:= _
        "=*refurb*", Operator:=xlAnd
    Rows("273:273").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$721133").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$721133").AutoFilter Field:=4, Criteria1:= _
        "=*remanu*", Operator:=xlAnd
    Rows("1363:1363").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$718217").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$718217").AutoFilter Field:=4, Criteria1:= _
        "=CON-NC*", Operator:=xlAnd
    ActiveWindow.SmallScroll Down:=-21
    Rows("87886:87886").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$718212").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$718212").AutoFilter Field:=3, Criteria1:= _
        "=CON-NC*", Operator:=xlAnd
    Rows("27901:27901").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$531034").AutoFilter Field:=3
    Sheets("Glemea1").Select
    ActiveSheet.Range("$A$1:$F$906480").AutoFilter Field:=4, Criteria1:= _
        "=*REMANU*", Operator:=xlAnd
    Rows("2074:2074").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$899460").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$899460").AutoFilter Field:=4, Criteria1:= _
        "=*Refurb*", Operator:=xlAnd
    Rows("6105:6105").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$899052").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$F$899052").AutoFilter Field:=3, Criteria1:= _
        "=CON-NC*", Operator:=xlAnd
    Rows("2856:2856").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$F$479915").AutoFilter Field:=3
    ActiveWorkbook.Save

pourrais tu me confirmer comment insérer celle ci, et surtout je dois réaliser cette seléction suppression sur plus de 50 références que je liste dans un onglet de mon fichier Macro

pouvons nous essayer ensemble de faire quelques choses.

Je te remercie de ton aide

Bonjour,

En effet les macros faites via l'enregistreur sont rarement optimisées, est-il possible de nous joindre un bout de fichier avec une centaine de ligne avec les critères que tu cherches à effacer ?

Je pense qu'une boucle sur les critères t'allegeront la macro (ou l'ajout d'un NB.SI() ou TROUVE() pour tout supprimer d'un coup).

Bonne journée.

Re.

Si j'ai bien compris, ça devrait donner ça :

Sub supprimedoublons()
'Dim EtatStatusBar As Boolean
Dim G1 As Worksheet
Dim G2 As Worksheet
Dim PL As Range 'déclare la variable PL (PLage)
Dim PLU As Range 'déclare la variable O (PLage Utile)

'je ne te le recommande pas ! Ralenti l'exécution du code...
'EtatStatusBar = Application.DisplayStatusBar
'Application.DisplayStatusBar = True
'Application.StatusBar = "Veuillez patienter ACTION EN COURS ..."

Workbooks("").Activate 'active le classeur GPL CISCO.xlsx
Set G1 = ActiveWorkbook.Worksheets("Glema1") 'définit l'onglet G1
Set G2 = ActiveWorkbook.Worksheets("Glema2") 'définit l'onglet G2
If G2.FilterMode = True Then G2.ShowAllData 'si G2 est filtrée, supprime le filtre
G1.Range("$A:$F").RemoveDuplicates Columns:=Array(3, 4), Header:=xlYes 'supprime les doublons des colonne C et D dansl'onglet G1
G2.Range("$A:$F").RemoveDuplicates Columns:=Array(3, 4), Header:=xlYes 'supprime les doublons des colonne C et D dansl'onglet G2
Set PL = G2.Range("A1").CurrentRegion 'définit la plage PL (onglet G2)
Set PLU = PL.Offset(1, 0).Resize(PL.Rows.Count - 1, PL.Columns.Count) 'définit la plage utile PLU (sans la première ligne de PL)
PL.AutoFilter Field:=4, Criteria1:="=*refurb*", Operator:=xlOr, Criteria2:="=*remanu*" 'filtre les 2 cas colonne D
PLU.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes visibles de la plage utile PLU
G2.ShowAllData 'supprime le filtre
PL.AutoFilter Field:=3, Criteria1:="=*CON-NC*" 'filtre colonne C
PLU.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes visibles de la plage utile PLU
G2.ShowAllData 'supprime le filtre
PL.AutoFilter Field:=4, Criteria1:="=*CON-NC*" 'filtre colonne D
PLU.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes visibles de la plage utile PLU
G2.ShowAllData 'supprime le filtre

Set PL = G1.Range("A1").CurrentRegion 'définit la plage PL (onglet G1)
Set PLU = PL.Offset(1, 0).Resize(PL.Rows.Count - 1, PL.Columns.Count) 'définit la plage utile PLU (sans la première ligne de PL)
PL.AutoFilter Field:=4, Criteria1:="=*refurb*", Operator:=xlOr, Criteria2:="=*remanu*" 'filtre les 2 cas dans la colonne D
PLU.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes visibles de la plage utile PLU
G1.ShowAllData 'supprime le filtre
PL.AutoFilter Field:=3, Criteria1:="=*CON-NC*" 'filtre colonne C
PLU.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes visibles de la plage utile PLU
G1.ShowAllData 'supprime le filtre
ActiveWorkbook.Save
MsgBox "Données traitées" 'message
End Sub

Merci ThauThème, Ergotamine

De vous penchez sur ma problématique.

Compte tenu que le fichier initial est très lourd je vais faire marcher ma pseudo macro novice

Celle ci fonctionne en plusieurs phases

1 mise en forme du fichier initial (suppression de lignes inutiles)

2 mise en forme avec recopie sur chaque ligne d'information permettant de classifier correctement les produits par famille/sous famille

3 suppression des doublons et lignes vides, suppression des lignes de produits inutiles via une liste (remanu/refurb/ et des produits commençant par CON-xxx). mise en forme de certaines colonnes.

4 une nouvelle phase de suppression car cela me faisait planter la macro 3.

5 je ne l'utilise pas car pas optimisé et comme pour la suppression ne m'apporte pas satisfaction sur le résultat attendu, du aux changements du fichier de base.

je vais edulcorer le fichier GPL Cisco pour vous envoyer cela ce soir ou demain

Messieurs,

Ci joint le fichier GPL Cisco qui est le fichier tarif

ainsi que mon fichier qui comporte l'ensemble des macros utilisés pour épurer celui ci

13gpl-cisco.zip (883.83 Ko)

Bonjour a Tous

j'espère que les éléments transmis vont permettre d'avance je me tiens a votre disposition pour toutes explications

Rechercher des sujets similaires à "macro selection suppression"