Création onglet VBA Excel Tri alphabétique
Bonjour à tous,
Je me permets de poster un message sur le forum car j'ai besoin d'aide.
J'ai créé un code vba dans le but d'automatiser la création ou duplication d'onglets (à partir d'une feuille maquette_D)
Dans une feuille INDEX je viens renseigner un tableau qui me permets de définir le nombre et le nom des onglets
J'aimerai que lorsque je crée mes onglets via une base (feuille index), que les onglets se crées à la suite de la feuille "Maquette_D" mais par ordre alphabétique.
je débute en VBA mais j'ai beau tourner le code je ne trouve pas la solution ...
voici mon code:
Sub Creation_CS()
Dim Comptes_section As Range 'Définition de la plage de cellules
Dim Ws As Worksheet
Dim x As Integer
'Ensuite, je lui affecte l'ensemble des cellules de la zone A2:A1048576 (Rows.Count)
'qui contiennent des données (SpecialCells(xlCellTypeConstants))
Set Comptes_section = Sheets("INDEX").Range("B3:B" & Rows.Count).SpecialCells(xlCellTypeConstants)
'La boucle suivante balaie toutes les cellules de la plage définie
For Each Cel In Comptes_section
Sheets("Maquette_D").Select
Cells.Copy
Sheets.Add after:=Sheets("Maquette_D")
ActiveSheet.Paste
'Enfin, je récupère la ligne de la cellule en cours de lecture :
ActiveSheet.Cells(1, 2) = Sheets("INDEX").Cells(Cel.Row, 2)
ActiveSheet.Name = Cells(1, 2) 'nom des feuilles
' Application des mises en forme à toutes les feuilles attention il faut que les feuilles soient toutes visibles
Application.ScreenUpdating = False
For i = 1 To Sheets.Count
Sheets(i).Visible = xlSheetVisible
Sheets(i).Activate
ActiveWindow.Zoom = 70 'zoom 70% sur toutes les feuilles
Next i
Application.ScreenUpdating = True
Next
End Sub
Merci de votre aide
Bonjour,
Pour trier les onglets alphabétiquement ... tu peux tester le code suivant ...
En te placant sur ton premier onglet de maquettes ... tu peux lancer cette macro ...
Sub TrierOnglets()
Dim N As Integer
Dim M As Integer
Dim PremWSATrier As Integer
Dim DerWSATrier As Integer
Dim TriDescendant As Boolean
TriDescendant = False
If ActiveWindow.SelectedSheets.Count = 1 Then
PremWSATrier = 2
DerWSATrier = Worksheets.Count
Else
With ActiveWindow.SelectedSheets
For N = 2 To .Count
If .Item(N - 1).Index <> .Item(N).Index - 1 Then
MsgBox "Pas possible de trier des onglets non-adjacents"
Exit Sub
End If
Next N
PremWSATrier = .Item(1).Index
DerWSATrier = .Item(.Count).Index
End With
End If
For M = PremWSATrier To DerWSATrier
For N = M To DerWSATrier
If TriDescendant = True Then
If UCase(Worksheets(N).Name) > UCase(Worksheets(M).Name) Then
Worksheets(N).Move Before:=Worksheets(M)
End If
Else
If UCase(Worksheets(N).Name) < UCase(Worksheets(M).Name) Then
Worksheets(N).Move Before:=Worksheets(M)
End If
End If
Next N
Next M
End Sub
En espérant que cela t'aide ...
Merci de ta réponse.
J'ai déjà une macro du même type.
Le problème c'est que j'aimerai que le tri s'effectue que sur les onglets créé à la suite du lancement de ma macro ...
je vais étudier ton code pour voir si je peux l'adapter
Merci beaucoup de ton aide
Merci de ta réponse.
J'ai déjà une macro du même type.
Le problème c'est que j'aimerai que le tri s'effectue que sur les onglets créé à la suite du lancement de ma macro ...
je vais étudier ton code pour voir si je peux l'adapter
Merci beaucoup de ton aide
Re,
C'est exactement le cas ...la macro n'intervient que sur les onglets concernés ... en excluant l'onglet Maquette ...
Re.
j'ai tester la macro à la liant à mon code.
Je souhaiterai que les feuilles qui son compris entre la feuille D et la feuille E se classent automatiquement...
mais si je modifie les lignes suivantes:
If ActiveWindow.SelectedSheets.Count = 1 Then
PremWSATrier = 2
DerWSATrier = Worksheets.Count
en :
PremWSATrier = sheets("d")
DerWSATrier = sheets ("e")
cela ne marche pas ... dsl je me sens nul...
c'est bon je crois que cela marche:
j'ai modifier le code par :
If ActiveWindow.SelectedSheets.Count = 1 Then
PremWSATrier = Sheets("Maquette_D").Index
DerWSATrier = Sheets("Maquette_E").Index
Else
cela à l'air de marcher
Merci beaucoup de ton aide
Re,
Avant de coupler la macro de tri à d'autres macros ...
Est-ce-que, comme convenu initialement, ton onglet Maquette est bien le premier onglet ... et lances-tu la macro de tri depuis cet onglet de base ...???
Pour que ce soit plus clair:
j'ai trois onglets avant mon onglet maquette_D.
Cet onglet me permet à partir d'une table de créer 30 autres onglets d_0001 ... xxxx
Ces onglets se génèrent après mon onglet maquette car ce n'est n'y plus n'y moins qu'une duplication de la feuille. Mais? j'ai dix autres feuilles derrières.
Le souci c'est que lorsque je génère ma macro, les onglets se génèrent en ordre décroissant ...
En adaptant ta macro et en bornant entre deux feuilles j'arrive à classer juste les onglets créées.
Je vais réfléchir à une autre solution, mais cela m'a déjà bien aidé
Re,
Content que tu aies pu trouver un début de solution à ton problème ...
Merci ... pour tes remerciements ...
je ne voudrais pas abuser mais est il possible de générer le nom des onglets créé par la macro, sans passer par formule/gestionnaire de nom/nouveau
et
est il possible de générer automatiquement les liens hypertextes, des onglets créé par la macro uniquement, dans une feuille déjà existante (feuille synthèse) à partir de la cellule B8 ?
Sub Creation_CS()
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
Dim Comptes_section As Range 'Définition de la plage de cellules
Dim Ws As Worksheet
Dim x As Integer
Dim N As Integer
Dim M As Integer
Dim PremWSATrier As Integer
Dim DerWSATrier As Integer
Dim TriDescendant As Boolean
Dim I As Long, nf As Variant
'Ensuite, je lui affecte l'ensemble des cellules de la zone A2:A1048576 (Rows.Count)
'qui contiennent des données (SpecialCells(xlCellTypeConstants))
Set Comptes_section = Sheets("INDEX").Range("B3:B" & Rows.Count).SpecialCells(xlCellTypeConstants)
'La boucle suivante balaie toutes les cellules de la plage définie
For Each Cel In Comptes_section
Sheets("Maquette_D").Select
Cells.Copy
Sheets.Add after:=Sheets("Maquette_D")
ActiveSheet.Paste
'Enfin, je récupère la ligne de la cellule en cours de lecture :
ActiveSheet.Cells(1, 2) = Sheets("INDEX").Cells(Cel.Row, 2)
ActiveSheet.Name = Cells(1, 2) 'nom des feuilles
' Application des mises en forme à toutes les feuilles attention il faut que les feuilles soient toutes visibles
For I = 1 To Sheets.Count
Sheets(I).Visible = xlSheetVisible
Sheets(I).Activate
ActiveWindow.Zoom = 70 'zoom 70% sur toutes les feuilles
Next I
Next
'Tri des onglets
TriDescendant = False
If ActiveWindow.SelectedSheets.Count = 1 Then
PremWSATrier = Sheets("Maquette_D").Index
DerWSATrier = Sheets("E").Index
Else
With ActiveWindow.SelectedSheets
For N = 2 To .Count
If .Item(N - 1).Index <> .Item(N).Index - 1 Then
MsgBox "Pas possible de trier des onglets non-adjacents"
Exit Sub
End If
Next N
PremWSATrier = .Item(1).Index
DerWSATrier = .Item(.Count).Index
End With
End If
For M = PremWSATrier To DerWSATrier
For N = M To DerWSATrier
If TriDescendant = True Then
If UCase(Worksheets(N).Name) > UCase(Worksheets(M).Name) Then
Worksheets(N).Move before:=Worksheets(M)
End If
Else
If UCase(Worksheets(N).Name) < UCase(Worksheets(M).Name) Then
Worksheets(N).Move before:=Worksheets(M)
End If
End If
Next N
Next M
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox "Traitement terminé"
End Sub