VBA - FILTRER EN FONCTION D'UNE LISTE
Bonjour,
J'utilise une macro qui me permet de "découper" une grille excel en fonction de la colonne N. Pour chaque élément différent je fais un copier coller et enregistrement en CSV.
Actuellement j'ai une 15ène de variable possible. Je les ai toute intégré à la macro mais afin de l'optimiser je voudrai que le filtre ce fasse en fonction de la liste :
Voici le code (avec explication de chaque étape) : je pense que c'est dans la partie "Criteria1" qui faut créer une boucle avec 1er mot de la liste, 2ème ... etc...
Sub ECRITURE_CSV()
' Ecriture CSV (il vient chercher a zone à prendre dans un fichier de travail puis ouvre un nouveau classeur)
Sheets("ECRITURE").Activate
DerniereLigne = ActiveSheet.UsedRange.Rows.Count
Range("A1:N" & DerniereLigne).Copy
Workbooks.Add
Range("A1").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
'LISTE SOCIETE (création de la liste en colonne N)
Sheets.Add
Sheets("Feuil2").Name = "LISTE SOCIETE"
Sheets("Feuil1").Activate
DerniereLigne = ActiveSheet.UsedRange.Rows.Count
Range("N2:N" & DerniereLigne).Copy
Sheets("LISTE SOCIETE").Activate
Range("A1").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveSheet.Range("A1:A" & DerniereLigne).RemoveDuplicates Columns:=1, Header:=xlNo
'nom du fichier (détermine le nom des futurs fichier CSV)
Dim stDateHeureExport As String
stDateHeureExport = "_" & _
Format(Now, "dd-mm-yyyy" & " à " & _
"hh""h""mm""'""ss""''""")
Dim Libelle As String
Libelle = InputBox("Libelle ?", "Titre") 'La variable reçoit la valeur entrée dans l'InputBox
If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat
MsgBox resultat
End If
'CSV PAR FILTRE (application du filtre en fonction de la liste)
Sheets("Feuil1").Select
Range("A1:N1").Select
Selection.AutoFilter
Selection.AutoFilter Field:=14, Criteria1:="ELEMENT 1 DE LA LISTE"
DerniereLigne = ActiveSheet.UsedRange.Rows.Count
Range("A1:N" & DerniereLigne).Copy
'ouverture du classeur
Workbooks.Add
Range("A1").Select
ActiveSheet.Paste
Site = Range("N2").Value
NomCompletFichier = Libelle & "_" & Site & "_" & stDateHeureExport
chemin = "Z:\Service Support\Comptabilité\Z_FICHIER IMPORTATION CSV\"
ActiveWorkbook.SaveAs Filename:=chemin & NomCompletFichier, FileFormat:=xlCSV, local:=True
ActiveWorkbook.Close SaveChanges:=False
'Et maintenant il faut faire une boucle pour le 2ème de la liste puis le 3ème etc
End SubMerci d'avance pour votre aide
Bonsoir,
sachez que je fais ce que je peux avec mes maigres connaissances...
Mais en faisant de la tambouille ceci pourait marcher :
[...]
Dim Elément As Variant, Tablo() As Variant, NB_Elément As Integer, Cpt As Integer
For Each Elément In ActiveSheet.AutoFilter.Filters.Item(14).Criteria1
Tablo(NB_Elément) = Elément
Next Elément
[...]
For Cpt = 0 To UBound(Tablo)
[...]
Selection.AutoFilter Field:=14, Criteria1:=Tablo(Cpt)
[...]
Next Cpt
[...]@ bientôt
LouReeD
Bonjour et bienvenu(e),
Merci de joindre un petit fichier à ta demande.
Cdlt.
Bonjour Jean Eric,
Je viens de modifier mon fichier afin de pouvoir le mettre en ligne (données confidentielles).
Dans le menu VBA, le module 1 correspond à ce que j'utilise aujourd'hui, n'énumère dans la macro l'ensemble des sociétés susceptible de figurer dans le fichier.
dans le module 2 j'ai essayé de faire quelque chose mais rien de va. Je voudrai qu'il récupère les sociétés figurant en colonne N, qu'il filtre ensuite chaque société et crée un CSV pour chacune d'entre elle.
Le fichier en PJ.
Je vous remercie pour votre aide.
Cordialement,
Bonsoir,
j'ai l'impression d'être transparent....
'CSV PAR FILTRE (application du filtre en fonction de la liste)
[...]
Dim Elément As Variant, Tablo() As Variant, NB_Elément As Integer, Cpt As Integer
For Each Elément In ActiveSheet.AutoFilter.Filters.Item(14).Criteria1
Tablo(NB_Elément) = Elément
Next Elément
[...]
For Cpt = 0 To UBound(Tablo)
[...]
Selection.AutoFilter Field:=14, Criteria1:=Tablo(Cpt)
[...]
Next Cpt
[...]
'Et maintenant il faut faire une boucle pour le 2ème de la liste puis le 3ème etcje n'ai pas recopier tout le code mais la boucle est surlignée en vert, avec un filtre sur la colonne 14 si je ne me suis pas trompé.
Avez vous essayé ?
@ bientôt
LouReeD
Non
oui j'ai essayé mais pas réussi à la mettre en oeuvre, je n'ai jamais eu de formation en VBA et j'ai créé mes macro en m'aidant d'information trouvé sur internet.
Je pense que mon problème c'est que je ne sais pas ou la positionner dans le code. sur votre 2ème code, je vois les "titres" de mon code. Je vais refaire des essais demain.
Merci de votre aide
Bonjour,
Une proposition à étudier et à adapter.
Cdlt.
Option Explicit
Public Sub Creer_CSV()
Dim wb As Workbook
Dim ws As Worksheet
Dim Dict As Object
Dim Rng As Range, Rng2 As Range
Dim n As Long, lCol As Long, I As Long
Dim tbl, k
Dim sPath As String, sFilename As String
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
Set wb = ActiveWorkbook
Set ws = wb.Worksheets("ECRITURE")
Set Dict = CreateObject("Scripting.Dictionary")
sPath = wb.Path & Application.PathSeparator
'sPath = "Z:\Service Support\Comptabilité\Z_FICHIER IMPORTATION CSV\"
lCol = 14
With ws
If .FilterMode Then .ShowAllData
Set Rng = .Cells(1).CurrentRegion
n = Rng.Rows.Count
tbl = .Cells(lCol).Resize(n)
End With
For I = 2 To UBound(tbl)
Dict(tbl(I, 1)) = ""
Next I
For Each k In Dict.keys
sFilename = k & " " & Format(Now, "yyyymmdd hh-mm-ss")
Rng.AutoFilter field:=lCol, Criteria1:=k
Set Rng2 = ws.AutoFilter.Range
Rng2.Copy
Workbooks.Add (xlWBATWorksheet)
With ActiveWorkbook
.Worksheets(1).Cells(1).PasteSpecial xlPasteValues
.SaveAs Filename:=sPath & sFilename, FileFormat:=xlCSV, local:=True
.Close
End With
Application.CutCopyMode = False
Next k
Rng.AutoFilter field:=lCol
Set Dict = Nothing
Set Rng2 = Nothing: Set Rng = Nothing
Set ws = Nothing
Set wb = Nothing
End Sub