Regrouper des classeurs avec un onglet par classeur
Fermé
Mistral_13200
Messages postés
636
Date d'inscription
mardi 5 août 2008
Statut
Membre
Dernière intervention
15 novembre 2024
-
16 nov. 2019 à 10:51
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 - 18 nov. 2019 à 16:07
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 - 18 nov. 2019 à 16:07
A voir également:
- Regrouper des classeurs avec un onglet par classeur
- Comment regrouper des pdf - Guide
- Rouvrir un onglet fermé - Guide
- Regrouper plusieurs feuilles excel en une seule - Guide
- Comment regrouper des applications sur android - Accueil - Guide Android
- Edge nouvel onglet google ✓ - Forum Microsoft Edge / Internet Explorer
7 réponses
Frenchie83
Messages postés
2240
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
11 août 2023
338
16 nov. 2019 à 13:26
16 nov. 2019 à 13:26
Bonjour,
Cdlt
Sub Tri_Par_Onglets() Application.ScreenUpdating = False For i = 1 To Sheets.Count For j = 1 To Sheets.Count If UCase(Sheets(i).Name) < UCase(Sheets(j).Name) Then Sheets(j).Move before:=Sheets(i) Next j Next i End Sub
Cdlt
Frenchie83
Messages postés
2240
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
11 août 2023
338
Modifié le 16 nov. 2019 à 19:06
Modifié le 16 nov. 2019 à 19:06
Le tri qui est fait ressemble plus à un tri aléatoire, alors que j'ai besoin d'un tri décroissant.
Non, ce n'est pas un tri aléatoire, seulement s'il y a des valeurs supérieures à 10, excel fait un tri sur le premier chiffre de gauche.
Exemple dans le cas suivant
club(1), club(2),Club(11), club(21),
en tri décroissant cela donnera Club(21), Club(2), Club(11), Club(1).
Ne connaissant pas le nombre de feuilles dont vous disposez, j'ai opté pour la méthode la plus simple, s'il y a plus de 10 feuilles il faut que je revoie le raisonnement.
Sinon j'ai une autre solution pour ne pas refaire ce que j'ai fait: complétez les noms de feuilles avec des 0 non significatifs, club(1) devient Club(01), club(2) devient Club(02) et ainsi de suite, à partir de 10 on ne touche à rien. Avec cette méthode le tri se fera correctement.
Cdlt
Non, ce n'est pas un tri aléatoire, seulement s'il y a des valeurs supérieures à 10, excel fait un tri sur le premier chiffre de gauche.
Exemple dans le cas suivant
club(1), club(2),Club(11), club(21),
en tri décroissant cela donnera Club(21), Club(2), Club(11), Club(1).
Ne connaissant pas le nombre de feuilles dont vous disposez, j'ai opté pour la méthode la plus simple, s'il y a plus de 10 feuilles il faut que je revoie le raisonnement.
Sinon j'ai une autre solution pour ne pas refaire ce que j'ai fait: complétez les noms de feuilles avec des 0 non significatifs, club(1) devient Club(01), club(2) devient Club(02) et ainsi de suite, à partir de 10 on ne touche à rien. Avec cette méthode le tri se fera correctement.
Cdlt
Mistral_13200
Messages postés
636
Date d'inscription
mardi 5 août 2008
Statut
Membre
Dernière intervention
15 novembre 2024
4
16 nov. 2019 à 15:08
16 nov. 2019 à 15:08
Frenchie 83 merci pour ta réponse mais elle ne correspond pas à ma demande.
1) Elle ne répond qu'à une partie de mes besoins.
2) Le trie qui est fait ressemble plus à un tri aléatoire, alors que j'ai besoin d'un trie décroissant.
Encore une fois merci d'y avoir consacré du temps.
Mistral
1) Elle ne répond qu'à une partie de mes besoins.
2) Le trie qui est fait ressemble plus à un tri aléatoire, alors que j'ai besoin d'un trie décroissant.
Encore une fois merci d'y avoir consacré du temps.
Mistral
Mistral_13200
Messages postés
636
Date d'inscription
mardi 5 août 2008
Statut
Membre
Dernière intervention
15 novembre 2024
4
16 nov. 2019 à 18:38
16 nov. 2019 à 18:38
Bonsoir à tous,
J’ai poursuivi mes recherches et j’ai trouvé la macro qui suit :
<code>Sub Fusionner_classeur()
'
Dim xStrPath As String ' Chemin du répertoire source
Dim xStrFName As String ' Nom du fichier source
Dim xWS As Worksheet
Dim xMWS As Worksheet ' Nom de l'onglet
Dim xTWB As Workbook
Dim xStrAWBName As String ' Nom du fichier cible
On Error Resume Next
' Bloque le rafraichissement et les alarmes.
Application.ScreenUpdating = False
Application.DisplayAlerts = False
xStrPath = "S:\_Fédération Photographique de France\_Annéeencours_FPF_ N&B\2020\N1\_Adresse club\"
xStrFName = Dir(xStrPath & "*.xlsx")
Set xTWB = ThisWorkbook
Do While Len(xStrFName) > 0
Workbooks.Open Filename:=xStrPath & xStrFName, ReadOnly:=True ' Ouverture du 1er fichier à copier
xStrAWBName = ActiveWorkbook.Name
For Each xWS In ActiveWorkbook.Sheets ' Copie le fichier source
xWS.Copy After:=xTWB.Sheets(xTWB.Sheets.Count) ' Colle du fichier dans le classeur cible
Set xMWS = xTWB.Sheets(xTWB.Sheets.Count)
xMWS.Name = xStrAWBName & "(" & xMWS.Name & ")" ' Renomme l'onglet créé dans le classeur cible
Next xWS
Workbooks(xStrAWBName).Close ' Fermeture du fichier copié
xStrFName = Dir() ' Sélectionne le fichier suivant
Loop
'Rétabli le rafraichissement et les alarmes
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub<code>
Elle me convient presque, je veux dire que je copie bien tous les fichiers du répertoire source sur un onglet du classeur cible. Cet onglet est renommé avec le nom et l’extension du fichier + le nom de l’onglet dans le classeur source.
Je voudrais que l’onglet créé prenne le nom du classeur source sans l’extension .Xlsx.
Je pense avoir compris cette macro, mais je bloque pour modifier ce nom.
Merci d’avance pour votre aide.
Mistral
J’ai poursuivi mes recherches et j’ai trouvé la macro qui suit :
<code>Sub Fusionner_classeur()
'
Dim xStrPath As String ' Chemin du répertoire source
Dim xStrFName As String ' Nom du fichier source
Dim xWS As Worksheet
Dim xMWS As Worksheet ' Nom de l'onglet
Dim xTWB As Workbook
Dim xStrAWBName As String ' Nom du fichier cible
On Error Resume Next
' Bloque le rafraichissement et les alarmes.
Application.ScreenUpdating = False
Application.DisplayAlerts = False
xStrPath = "S:\_Fédération Photographique de France\_Annéeencours_FPF_ N&B\2020\N1\_Adresse club\"
xStrFName = Dir(xStrPath & "*.xlsx")
Set xTWB = ThisWorkbook
Do While Len(xStrFName) > 0
Workbooks.Open Filename:=xStrPath & xStrFName, ReadOnly:=True ' Ouverture du 1er fichier à copier
xStrAWBName = ActiveWorkbook.Name
For Each xWS In ActiveWorkbook.Sheets ' Copie le fichier source
xWS.Copy After:=xTWB.Sheets(xTWB.Sheets.Count) ' Colle du fichier dans le classeur cible
Set xMWS = xTWB.Sheets(xTWB.Sheets.Count)
xMWS.Name = xStrAWBName & "(" & xMWS.Name & ")" ' Renomme l'onglet créé dans le classeur cible
Next xWS
Workbooks(xStrAWBName).Close ' Fermeture du fichier copié
xStrFName = Dir() ' Sélectionne le fichier suivant
Loop
'Rétabli le rafraichissement et les alarmes
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub<code>
Elle me convient presque, je veux dire que je copie bien tous les fichiers du répertoire source sur un onglet du classeur cible. Cet onglet est renommé avec le nom et l’extension du fichier + le nom de l’onglet dans le classeur source.
Je voudrais que l’onglet créé prenne le nom du classeur source sans l’extension .Xlsx.
Je pense avoir compris cette macro, mais je bloque pour modifier ce nom.
Merci d’avance pour votre aide.
Mistral
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Mistral_13200
Messages postés
636
Date d'inscription
mardi 5 août 2008
Statut
Membre
Dernière intervention
15 novembre 2024
4
17 nov. 2019 à 09:29
17 nov. 2019 à 09:29
Bonjour Frenchie,
Je ne pense pas avoir écrit que c'était un tri aléatoire et je suis d'accord avec vous quant à la méthode utilisée par Excel pour le tri.
Je peux avoir au maximum 50 fichiers dans le répertoire source. Chaque fichier n'a qu'un seul onglet. Tous les onglets ont le même nom. Les fichiers sont nommés comme suit : XX_YYYY ou XX prend une valeur entre 1 et 50 et ou YYYY prend une entre 1 et 9999. Le nom des fichier est donc : XX_YYYY.Xlsx
Ce que je souhaiterais c'est avoir dans le classeur cible un onglet par fichier et que chaque onglet prenne le nom du fichier sans l'extension (.Xlsx).
Ta dernière proposition, de renommer les fichiers avant n'est pas acceptable car trop longue et surtout répétitive tous les mois.
La macro que j'ai trouvé hier AM (voir plus haut) est presque bonne :
- Elle regroupe bien tous les fichiers avec un onglet par fichier.
- Elle renomme bien les onglets et je les ai dans l'ordre voulu.
Mais le nom qui est affecté aux onglets ne me convient pas. Ils sont renommés du nom du fichier d'origine avec l'extension plus le nom de l'onglet. Je voudrais que le nom de l'onglet soit XX.YYYY égal au nom du fichier d'origine sans l'extension (.Xlsx).
J'espère que ces précisions seront suffisantes.
En tout cas merci d'avance.
Mistral
Je ne pense pas avoir écrit que c'était un tri aléatoire et je suis d'accord avec vous quant à la méthode utilisée par Excel pour le tri.
Je peux avoir au maximum 50 fichiers dans le répertoire source. Chaque fichier n'a qu'un seul onglet. Tous les onglets ont le même nom. Les fichiers sont nommés comme suit : XX_YYYY ou XX prend une valeur entre 1 et 50 et ou YYYY prend une entre 1 et 9999. Le nom des fichier est donc : XX_YYYY.Xlsx
Ce que je souhaiterais c'est avoir dans le classeur cible un onglet par fichier et que chaque onglet prenne le nom du fichier sans l'extension (.Xlsx).
Ta dernière proposition, de renommer les fichiers avant n'est pas acceptable car trop longue et surtout répétitive tous les mois.
La macro que j'ai trouvé hier AM (voir plus haut) est presque bonne :
- Elle regroupe bien tous les fichiers avec un onglet par fichier.
- Elle renomme bien les onglets et je les ai dans l'ordre voulu.
Mais le nom qui est affecté aux onglets ne me convient pas. Ils sont renommés du nom du fichier d'origine avec l'extension plus le nom de l'onglet. Je voudrais que le nom de l'onglet soit XX.YYYY égal au nom du fichier d'origine sans l'extension (.Xlsx).
J'espère que ces précisions seront suffisantes.
En tout cas merci d'avance.
Mistral
cs_Le Pivert
Messages postés
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
Modifié le 17 nov. 2019 à 10:41
Modifié le 17 nov. 2019 à 10:41
Bonjour,
en réponse à:
Je voudrais que le nom de l'onglet soit XX.YYYY égal au nom du fichier d'origine sans l'extension (.Xlsx).
avec la fonction Split
https://silkyroad.developpez.com/VBA/ManipulerChainesCaracteres/#LI-I
Voilà
en réponse à:
Je voudrais que le nom de l'onglet soit XX.YYYY égal au nom du fichier d'origine sans l'extension (.Xlsx).
avec la fonction Split
https://silkyroad.developpez.com/VBA/ManipulerChainesCaracteres/#LI-I
Dim nom As String nom = Dir(chemin complet) 'nom avec extension nom = Split(nom, ".")(0) 'nom sans extension (0) = chaine avant le séparateur (point)
Voilà
cs_Le Pivert
Messages postés
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
Modifié le 17 nov. 2019 à 18:04
Modifié le 17 nov. 2019 à 18:04
Voilà un exemple avec les classeurs fermés en utilisant ADO:
https://silkyroad.developpez.com/VBA/ClasseursFermes/
et pour trouver le nom de la feuille concernée:
https://silkyroad.developpez.com/VBA/ClasseursFermes/#LV
voici le code avec le classeur contenant les macros dans le même dossier:
Tu gagnes en rapidité vu que tu n'ouvres pas chaque classeur!
@+ Le Pivert
https://silkyroad.developpez.com/VBA/ClasseursFermes/
et pour trouver le nom de la feuille concernée:
https://silkyroad.developpez.com/VBA/ClasseursFermes/#LV
voici le code avec le classeur contenant les macros dans le même dossier:
Sub lister() Dim monFichier As String Dim wb As Workbook Dim chemin As String Set wb = Workbooks(ThisWorkbook.Name) 'classeur reception ' On a besoin du chemin absolu du dossier ' Doit se terminer par \ chemin = ThisWorkbook.Path & "\" ' La fonction Dir(chemin, mode) permet de parcourir un dossier ' Ici je rajoute à mon chemin "*.xlsx", ' pour ne retrouver que mes fichiers Excel ' vbNormal permet de ne récupérer que des fichiers, ' vbDirectory récupère tout (dossiers et fichiers) monFichier = Dir(chemin & "*.xlsx", vbNormal) Do While monFichier <> "" wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, ".")(0) 'ajoute un onglet et le renomme RequeteClasseurFerme (chemin & monFichier) ' Permet de passer au fichier suivant monFichier = Dir Loop End Sub 'https://silkyroad.developpez.com/VBA/ClasseursFermes/ 'https://silkyroad.developpez.com/VBA/ClasseursFermes/#LV 'Nécéssite d'activer la référence Microsoft ADO ext x.x for DLL and Security 'Vous devez préalablement activer la référence Microsoft ActiveX Data Objects x.x Library pour utiliser les exemples présentés dans ce tutoriel. Sub RequeteClasseurFerme(ByVal chemin As String) Dim Cn As ADODB.Connection Dim NomFeuille As String, texte_SQL As String Dim Rst As ADODB.Recordset Dim oCat As ADOX.Catalog Dim Resultat As String Dim Feuille As ADOX.Table Set Cn = New ADODB.Connection Set oCat = New ADOX.Catalog With Cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & chemin & ";Extended Properties=""Excel 12.0;HDR=YES;""" .Open End With Set oCat.ActiveConnection = Cn For Each Feuille In oCat.Tables Resultat = Feuille.Name Next 'Nom de la feuille dans le classeur fermé NomFeuille = Resultat 'Définit la requête. '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille. texte_SQL = "SELECT * FROM [" & NomFeuille & "]" Set Rst = New ADODB.Recordset Set Rst = Cn.Execute(texte_SQL) 'Ecrit le résultat de la requête dans la cellule A1 Range("A1").CopyFromRecordset Rst '--- Fermeture connexion --- Set Feuille = Nothing Set oCat = Nothing Cn.Close Set Cn = Nothing End Sub
Tu gagnes en rapidité vu que tu n'ouvres pas chaque classeur!
@+ Le Pivert
Mistral_13200
Messages postés
636
Date d'inscription
mardi 5 août 2008
Statut
Membre
Dernière intervention
15 novembre 2024
4
18 nov. 2019 à 16:07
18 nov. 2019 à 16:07
Bonjour Pivert,
Merci pour ta réponse.
Je testerais ça dès que possible mais là il faut que je reprenne dans l'urgence un autre classeur pour lequel je vais peut être avoir besoin d'aide.
Je reviens vers toi dès que possible.
Cordialement
Mistarl
Merci pour ta réponse.
Je testerais ça dès que possible mais là il faut que je reprenne dans l'urgence un autre classeur pour lequel je vais peut être avoir besoin d'aide.
Je reviens vers toi dès que possible.
Cordialement
Mistarl