Création/Enregistrement multiple de classeur avec noms variables
Bonjour à tous.
Pour vous expliquer rapidement mon problème. J'ai un classeur Excel avec toutes mes données calculées. Ce classeur est composé comme suit :
Mon but est d'importer ces données dans notre ERP. Pour ce faire, j'ai besoin de
1 - créer des fichiers Excel d'import (1 fichier par dossier). Et je dois nommer ces fichiers avec le nom du dossier.
Exemple : Dossier A = nouveau classeur "A", Dossier B = nouveau classeur "B" et ainsi de suite jusqu'au dernier dossier
2- Retranscrire les données d'une certaine manière (comme ci-dessous),
Dans le classeur qui sera généré (exemple "A"), j'ai besoin de renseigner les numéros de comptes en Colonne A etc..
Je suis coincé à la première étape, là ou je dois définir les variables de Noms des classeurs.
Ci-dessous mon code ; Il fonctionne jusqu'a ce que je définisse un nom pour le classeur ouvert, je bloque sur les variables "VariableNom" & "Nom"
Sub test()
Dim wb As Workbook
Dim ws As Worksheet
Dim Chemin As String, NomFichier As String, Fichier As String, Dossier As String, Import As String, VariableNom As String, Nom As String, Feuil As String
Application.ScreenUpdating = False
Chemin = "CHEMIN\" 'Chemin du fichier mère
NomFichier = "Fichier_Mere.xlsx" 'Nom du fichier mère
Fichier = Chemin & NomFichier 'Chemin & nom fichier mère
Feuil = "SYNTHESE" 'Onglet où sont les informations sur le classeur mère
Set wb = Workbooks.Open(Fichier, UpdateLinks:=0) 'Ouvre le fichier mère et désactive la mise à jour des liens
Set ws = wb.Worksheets(Feuil) 'Se place sur la feuille "SYNTHESE"
For L = 9 To ws.Range("B" & Rows.Count).End(xlUp).Row
'Pour toutes les lignes à partir de la ligne 9, colonne B, et jusqu'a la dernière ligne non vide
Workbooks.Add 'Crée un nouveau classeur Excel
Import = "CHEMIN"
'Chemin pour entregistrer le nouveau classeur
VariableNom = wb.ws.Range("B9" & Rows.Count).End(xlUp).Row.Value
'Nom du classeur = B9 pour le premier classeur crée, et parcours les lignes suivantes pour la création des autres classeurs
Nom = VariableNom
Workbook.SaveAs Filename:=Import & Nom, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Next
End SubPouvez-vous m'éclaircir ? Merci par avance,
Cdt,
bonjour
importe tout ton fichier d'un coup dans l'ERP
les ERP acceptent d'ailleurs mieux ce genre d'import "en vrac"
Bonjour Jmd,
En fait malheureusement c'est impossible, en fait quand je parle d'ERP (qui n'en est pas un), il s'agit plus de notre logiciel de comptabilité, qui est au passage un peu... archaïque.
Il n'est pas possible d'importer en "multi" dossiers. Tu es obligé de sélectionner un dossier (qui est ta clé d'entrée), et importer les données qui alimenteront le module budgétaire de ce dossier uniquement. Et nous devons le faire pour chaque dossiers . C'est pourquoi j'ai besoin de créer un fichier Excel par dossier
Cdt,
J'ai corrigé pour que mon premier point fonctionne, j'arrive donc à créer les classeurs avec des noms spécifiques
Je m'attaque au second point, à savoir retranscrire les données d'une certaine manière dans les classeurs créés.
Je reviens vers vous car j'aurai surement besoin d'aide,
Mon code :
Dim wb As Workbook
Dim ws As Worksheet
Dim Chemin As String, NomFichier As String, Fichier As String, Dossier As String, Import As String, VariableNom As String, Feuil As String
Application.ScreenUpdating = False
Chemin = "CHEMIN\" 'Chemin du fichier mère
NomFichier = "Fichier_Mere.xlsx" 'Nom du fichier mère
Fichier = Chemin & NomFichier 'Chemin & nom fichier mère
Feuil = "SYNTHESE" 'Onglet où sont les informations sur le classeur mère
Set wb = Workbooks.Open(Fichier, UpdateLinks:=0) 'Ouvre le fichier mère et désactive la mise à jour des liens
Set ws = wb.Worksheets(Feuil) 'Se place sur la feuille "SYNTHESE"
For L = 9 To ws.Range("B" & Rows.Count).End(xlUp).Row
'Pour toutes les lignes à partir de la ligne 9, colonne B, et jusqu'a la dernière ligne non vide
Workbooks.Add 'Crée un nouveau classeur Excel
Import = "CHEMIN\"
'Chemin pour entregistrer le nouveau classeur
VariableNom = ws.Range("B" & L)
'Nom du classeur = B9 pour le premier classeur crée, et parcours les lignes suivantes pour la création des autres classeurs
ActiveWorkbook.SaveAs Filename:=Import & VariableNom, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWorkbook.Close
Next
End Subre
alors avec ton Excel 2016 il y a le menu Données. Tu connais ? il FAUT le connaître, bien avant de te lancer dans VBA
donc feuille vierge
données, obtenir de plage Excel, naviguer vers ta plage d'origine
"modifier"
dépivoter (cherche, ce sera un clic droit ! )
"charger"
je te montre, mais il faut un fichier origine et non du VBA
note : apprendre Excel avant d'apprendre VBA
re
avec une requête, un dépivotage et un TCD
je t'ai fait le A
il y a un simple filtre A sur le TCD
fais idem pour un TCD B etc.
pour ajouter tes valeurs en bleu, sauras-tu les mettre à côté des TCD avec des RECHERCHEV ?
s'il faut remanier les colonnes pour avoir exactement ton dessin, alors copier un TCD, et "collage spécial valeur"
les requêtes et TCD peuvent se mettre dans des classeurs à part, comme tu le souhaite.
Bonjour jmd,
Pour ma curiosité perso, comment as tu pu avec la requête passée de l'étape de depivotage?,
Cordialement,
Bonjour,
Après une recherche, j'ai donc trouver ce sujet qui explique le dépivotage :
https://forum.excel-pratique.com/viewtopic.php?f=2&t=113258&start=10
Ça peut toujours servir
Cordialement,
Bonjour Jmd
Alors c'est assez impressionnant, je ne connaissais pas du tout... et je ne comprends pas tout mais je vais regarder.
Par contre ça fait pas mal de manipulations.
- > Créer plus de 70 TCD
- > Les remanier 1 à 1
- > Faire des rechercheV (très simple, mais une action supplémentaire)
- > Sachant que 1 TCD donne lieu à la création d'un classeur, et que je dois nommer spécifiquement chaque classeur crée (est-ce possible avec la requête ?)
- > Que je dois également nommer spécifiquement l'onglet de chaque classeur créé (est-ce possible avec la requête ?)
- > Et que je dois insérer des noms de colonnes spécifiques (standard pour tous) dans mes classeurs crées qui n'apparaissent pas sur mon tableau de données
Pour info, j'ai terminé la macro qui me permet de ne réaliser aucune manipulation supplémentaire,
Ci-dessous le code pour les suivants qui lieront ce post :
Sub Generation_Import_Elements_financiers()
Dim wb As Workbook
Dim ws As Worksheet
Dim newwb As Workbook, Entete
Dim newws As Worksheet
Dim Chemin As String, NomFichier As String, Fichier As String, Dossier As String, Import As String, Nom_Variable As String, Nom_Fixe As String, Nom As String, Feuil As String, Onglet_Import As String
Application.ScreenUpdating = False 'désactive la mise à jour de l'affichage
Chemin = "CHEMIN\" 'Chemin du fichier mère
NomFichier = "FICHIER_MERE.xlsx" 'Nom du fichier mère
Fichier = Chemin & NomFichier 'Chemin & nom fichier mère
Feuil = "SYNTHESE" 'Onglet où sont les informations sur le classeur mère
Set wb = Workbooks.Open(Fichier, UpdateLinks:=0) 'Ouvre le fichier mère et désactive la mise à jour des liens
Set ws = wb.Worksheets(Feuil) 'Se place sur la feuille "SYNTHESE"
For L = 9 To ws.Range("B" & Rows.Count).End(xlUp).Row
'Pour toutes les lignes à partir de la ligne 9, colonne B, et jusqu'a la dernière ligne non vide
Set newwb = Workbooks.Add 'Crée un nouveau classeur Excel
Onglet_Import = "CMBU_BUDGET" 'Définition du nom de l'onglet du nouveau classeur
newwb.ActiveSheet.Name = Onglet_Import 'Renomme l'onglet du classeur avec la variable Onglet_Import
Set newws = newwb.Worksheets(Onglet_Import)
Entete = Array("Nom 1", "Nom 2", "Nom 3", "Nom 4", "Nom 5", "Nom 6", "Nom 7") 'Défini les entetes du notre tableau de réstitution n des données
newws.Range("A1").Resize(, UBound(Entete) + 1) = Entete '
ws.Range("D8", ws.Range("D8").End(xlToRight)).Copy 'Copie les Cellules D8 à la dernière cellule non vide sur la droite du classeur&feuille "ws"
newws.Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True 'Colle en valeur & transpose à partir de la celulle A2 du classeur&feuille "newws"
ws.Range("D" & L, ws.Range("D" & L).End(xlToRight)).Copy 'Selectionne les Cellules de D9 à la dernière cellule non vide sur la droite pour la première boucle du classeur&feuille "ws"
newws.Range("D2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True 'Colle en valeur & transpose à partir de la celulle D2 du classeur&feuille "newws"
newws.Range(Cells(2, 3), Cells(newws.Range("A" & Rows.Count).End(xlUp).Row, 3)) = "LIN" 'Texte renseigné en colonne C jusqu'a la dernière ligne non vide de la colonne A
newws.Range(Cells(2, 5), Cells(newws.Range("A" & Rows.Count).End(xlUp).Row, 7)) = 0 'Texte renseigné en colone D jusqu'a à la colonne G jusqu'a la dernière ligne non vide de la colonne A
Import = "CHEMIN\" 'Chemin pour entregistrer le nouveau classeur
Nom_Variable = ws.Range("B" & L) 'Determine le nom variable du classeur excel : B9 pour le premier classeur crée, et parcours les lignes suivantes pour la création des autres classeurs
Nom_Fixe = "_CMBU_BUDGET" 'Determine le nom fixe du classeur excel
Nom = Nom_Variable & Nom_Fixe 'Nom concatené du classeur
ActiveWorkbook.SaveAs Filename:=Import & Nom, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 'Enregistre en format xls
ActiveWorkbook.Close
Next
End Sub