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 SubMerci 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.Savepourrais 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 SubMerci 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
Bonjour a Tous
j'espère que les éléments transmis vont permettre d'avance je me tiens a votre disposition pour toutes explications