0% ont trouvé ce document utile (0 vote)
23 vues3 pages

Code Diviser

Le document contient deux macros VBA pour Excel. La première macro divise un tableau en plusieurs feuilles basées sur des valeurs uniques d'une colonne, tandis que la seconde macro extrait des données filtrées dans de nouveaux classeurs Excel pour chaque valeur unique. Les deux macros utilisent des filtres pour gérer les données et les enregistrent dans un dossier spécifié.

Transféré par

Youssef Salam
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
23 vues3 pages

Code Diviser

Le document contient deux macros VBA pour Excel. La première macro divise un tableau en plusieurs feuilles basées sur des valeurs uniques d'une colonne, tandis que la seconde macro extrait des données filtrées dans de nouveaux classeurs Excel pour chaque valeur unique. Les deux macros utilisent des filtres pour gérer les données et les enregistrent dans un dossier spécifié.

Transféré par

Youssef Salam
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd

Sub diviserTableauFeuille()

Dim pTableau As Range


Set pTableau = activeCell.CurrentRegion

Dim ListeValeurs As String


Dim c As Range

For Each c In Intersect(pTableau, activeCell.EntireColumn).Offset(1, 0)


If InStr(1, ListeValeurs, c) = 0 Then
ListeValeurs = ListeValeurs & c & ";"
End If
Next

Dim positionChamp As Integer


positionChamp = activeCell.Column - pTableau.Column + 1

Dim valeur As Variant

For Each valeur In Split(ListeValeurs, ";")


If valeur <> "" Then
Dim feuille As Worksheet
Set feuille = Sheets.Add(after:=Sheets(Sheets.Count))
feuille.Name = valeur

pTableau.AutoFilter Field:=positionChamp, Criteria1:=valeur

pTableau.SpecialCells(xlCellTypeVisible).Copy

feuille.[A1].PasteSpecial xlPasteColumnWidths
feuille.[A1].PasteSpecial xlPasteAll

pTableau.AutoFilter

End If
Next

End Sub

Sub DIVISER_Table_Classeurs()
Dim ws As Worksheet
Dim rng As Range
Dim filterColumn As Range
Dim uniqueValues As Variant
Dim cell As Range
Dim newWorkbook As Workbook
Dim destSheet As Worksheet
Dim lastRow As Long
Dim i As Long
Dim dict As Object
Dim key As Variant
Dim filteredRange As Range
' Déterminer la colonne sur laquelle filtrer en fonction de la cellule active
Set filterColumn = activeCell.EntireColumn

' Assumer que les données commencent dans la feuille active à partir de la
cellule A1
Set ws = ThisWorkbook.ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, filterColumn.Column).End(xlUp).Row
Set rng = ws.Range("A1:X" & lastRow) ' Ajuster la plage en fonction de votre
structure de données

' Vérifier que la colonne est dans la plage de données


If Intersect(filterColumn, rng) Is Nothing Then
MsgBox "La colonne active n'est pas dans la plage de données."
Exit Sub
End If

' Filtrer les données pour les valeurs uniques de la colonne active
filterColumn.Cells(activeCell.Column).AutoFilter Field:=filterColumn.Column,
Criteria1:="<>"

' Récupérer les valeurs uniques filtrées à l'aide d'un dictionnaire


Set dict = CreateObject("Scripting.Dictionary")
On Error Resume Next
Set filteredRange =
ws.AutoFilter.Range.Offset(activeCell.Column).Resize(ws.AutoFilter.Range.Rows.Count
- 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If filteredRange Is Nothing Then


MsgBox "Aucune valeur unique trouvée dans la colonne active après
filtrage."
ws.AutoFilterMode = False
Exit Sub
End If

' Parcourir les cellules visibles et ajouter les valeurs uniques au


dictionnaire
For Each cell In filteredRange.Columns(activeCell.Column).Cells
If Not dict.exists(cell.Value) Then
dict.Add cell.Value, Nothing
End If
Next cell

' Vérifier si des valeurs uniques ont été trouvées


If dict.Count = 0 Then
MsgBox "Aucune valeur unique trouvée dans la colonne active après
filtrage."
ws.AutoFilterMode = False
Exit Sub
End If

' Pour chaque valeur unique, créer un nouveau classeur Excel et copier les
données filtrées
For Each key In dict.keys
' Appliquer le filtre pour la valeur unique actuelle
rng.AutoFilter Field:=filterColumn.Column, Criteria1:=key
' Copier les données filtrées vers une nouvelle feuille temporaire
ws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy

' Créer un nouveau classeur Excel et coller les données


Set newWorkbook = Workbooks.Add
Set destSheet = newWorkbook.Sheets(1)
' destSheet.Name = key
destSheet.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
destSheet.Range("A1").PasteSpecial Paste:=xlPasteAll

' Enregistrer le classeur Excel avec le nom correspondant à la valeur


unique
On Error Resume Next
newWorkbook.SaveAs "C:\Users\y.salam\Desktop\testVBA\TEST VBA\" & key &
".xlsx"
On Error GoTo 0

' Fermer le classeur sans enregistrement des changements visibles


newWorkbook.Close SaveChanges:=False
Next key

' Effacer le filtre dans la feuille principale


ws.AutoFilterMode = False

MsgBox "Extraction des données terminée. Les fichiers ont été enregistrés dans
le dossier : C:\Users\y.salam\Desktop\testVBA\TEST VBA"

'For Each key In dict.keys


' Debug.Print key, dict.Item(key)
' Next key

End Sub

Vous aimerez peut-être aussi