Traitement de donnée Excel dans des dossiers variables
Bonjour, je suis nouveau sur le forum, et débutant en VBA.
Je vous écris car je rencontre un soucis dans mon programme.
Je m'explique :
Je dois créer un programme qui s'exécute sur un tableur excel qui va chercher à ouvrir d'autre tableurs excels, faire des copies et coller sur de nouveau onglet sur le tableur initial. Le programme s'éxecute bien sur le nom associé, voici un extrait du programme :
Sub CreationSynthese()
'Synthèse des documents à traiter
' Ouverture de ADA.xlsx"
Workbooks.Open "C:\Users\maxime.paruch\Analyse de donnée EXCEL\112163\ADA.xlsx"
Application.DisplayAlerts = False
' Copie des données :
Workbooks("ADA.xlsx").Sheets("ADA").Range("A1:P1000").Copy
Workbooks("Générateur de bilan de comptes.xlsm").Activate
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Select
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Paste
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Range("A1").Select
' Fermeture de ADA.xlsx :
Workbooks("ADA.xlsx").Close False
Application.DisplayAlerts = True
' Ouverture de ADA-2.xlsx :
Workbooks.Open "C:\Users\maxime.paruch\Analyse de donnée EXCEL\112163\ADA-2.xlsx"
Application.DisplayAlerts = False
' Copie des données :
Workbooks("ADA-2.xlsx").Sheets("ADA-2").Range("A1:P1000").Copy
Workbooks("Générateur de bilan de comptes.xlsm").Activate
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Select
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Paste
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Range("A1").Select
' Fermeture de ADA-2.xlsx :
Workbooks("ADA-2.xlsx").Close False
Application.DisplayAlerts = True
Les données qui sont en couleur bleu sont variables selon le dossier ou le générateur de bilan s'éxecute.
Dans l'idée j'aimerais que mon programme puisse s'exécuter dans d'autre dossier directement avec n'importe quelle valeur du type XXXXXX (112163 pour celui ci).
Il faudrait que se soit une variable que le générateur prenne en compte.
Je vous remercie pour votre aide.
Maxime
Bonjour
Workbooks.Open "C:\Users\maxime.paruch\Analyse de donnée EXCEL\" & variable & "\ADA-2.xlsx"
IL vous reste à intégrer dans la variable l'élément voulu
Tout d'abord merci pour votre réponse,
mais je ne sais pas comment gérer "& variable &" pour que cela fonctionne.
Comment dois-je la déclarer ? Et comment faire pour que mon programme fonctionne dans n'importe quel dossier de la forme XXXXXX..
Je vous remercie pour votre aide.
Cordialement,
Maxime
Tout dépend de la source, qui va donner à la variable sa raison d'être. Si c'est-ce une saisie manuelle...du texte dans une cellule...
Ici, par exemple mon programme s'executera dans un dossier portant un nom de la forme XXXXXX en chiffre.
Je voudrai qu'au lancement de la macro récupération de donnée, que le programme puisse prendre le numéro de compte XXXXXX.
Que la macro s'exécute en adaptant à chaque fois sa variable (n° de compte) dans le fichier ou elle se trouve (dans la ligne workbook.open).
NomDossier : 112158 --> & variable & =112158
NomDossier : 145489 --> & variable & =145489
NomDossier : 159486 --> & variable & =159486
Je vous remercie pour toute votre aide.
Cordialement,
Maxime
Max6456 a écrit :Je voudrai qu'au lancement de la macro récupération de donnée, que le programme puisse prendre le numéro de compte XXXXXX.
Je réitère ma question sous une autre forme : allez chercher le N° de compte où ? Chez l'épicier ? Chez le coiffeur ? Dans les toilettes ? Dans la cuisine ? Sous le coussin ? Dans la cellule B1, dans la feuille 2 ? Chez tatan Edmonde ? Chez tonton lulu ?
Après réflexion, je me suis rendu compte qu'il me faut une macro qui me permette d'aller chercher un dossier à traiter.
Chaque dossier est caractérisé par un numéro de compte à 6 chiffres.
Si vous voulais je vais garder la même structure de programme mais c'est moi qui lui dit dans quel dossier intervenir et où traiter justement les différents fichiers Excel.
Pouvez vous.m'aider à modifier mon programme pour qu'il puisse faire ça ?
En gros on doit via l'explorer lui dire ou la macr extraction doit intervenir (dossier avec numéro de compte)
Désolé pour mon ancienne explication.
Merci pour votre aide.
Cordialement.
Maxime.
En première approche, vous pouvez commencer par ceci (je vous laisse rajouter les éléments concernant la copie)
Sub recopie()
Dim fichierD As Workbook
Application.Dialogs(xlDialogOpen).Show
Set fichierD = ActiveWorkbook
Range(machintruc).Copy fichierD.sheets("bidule").Range("Aquelquechose")
End Sub
Tout ce qui vous paraît anormal (les machin truc bidule) ce sont les termes à remplacer.
Au lancement de la macro, une fenêtre s'ouvre. Vous allez chercher votre fichier via l'arborescence des repertoires puis celui-ci se nommera "FichierD" . Dans l'exemple ci-dessus je copie la plage machintruc pour la coller dans la feuille bidule du fichierD.
Tout d'abord merci pour votre réponse.
Je ne suis pas sur ma machine mais demain à la première heure je testes tout ça, et vous dit comment ça réagit.
Cela devrait résoudre mon problème, et pouvoir faire fonctionner cette macro dans n'importe quel dossier (fichierd, XXXXXX n° de compte).
La ligne qui recopie et place (RANGE), je peux en mettre à la suite autant que je veux sur la macro recopie ?
Je vous remercie.
Bien cordialement,
Maxime PARUCH
Autant que vba en supporte.
Par la suite, présentez-nous votre macro (voire le fichier) pour que les vbaïste puissent améliorer le code et vous apporter un certain "confort informatique)
La macro d'ouverture des répertoires s'exécute bien mais après je ne parviens pas à ce que la sélection se sopie et se colle ou je veux automatiquement.
Je m'explique pour que tout soit bien clair.
J'ai un fichier excel appelé "Générateur de bilan", c'est dans celui ci que toutes les macros seront.
Dans ce fichier excel, je dois être capable via un bouton d'aller chercher le dossier de la forme XXXXXX (variable Dossierd), et qu'elle s'exécute automatiquement pour les fichiers .xls : ADA ADA_2 ADM ADV CHRONO DEVIS1 DEVIS2......
Si vous voulez ma macro actuelle fonctionne mais pour un seul dossier (bien localisé 112163).
Je voudrai lui dire où intervenir.
La macro juste à l'ouverture du dossier de la forme XXXXXX, doit pouvoir copier ADA ADA_2 ADM .... et les coller dans des onglets du générateur de bilan.
Je mettrai bien des images pour vous aider mais je ne sais pas comment faire avec Img.
J'espère que vous pourrez m'aider. Je vous remercie.
Cordialement,
Maxime PARUCH
J'ai eu cette petite idée mais je ne sais pas comment la programmer.
Je vais procéder avec la variable ncompte (ncompte, que l'on définit en choisissant le dossier n°compte=nom du dossier (avec l'explorer en gros on va définir la variable n°compte pour lancer Sub CreationSynthese.
Voici une partie du code qui doit être ajusté pour faire cela.
Sub CreationSynthese()
'Synthèse des documents à traiter
[color=#FF4000]Dim ncompte As Integer
ncompte = name du dossier choisi avec Application.Dialogs(xlDialogOpen).Show[/color]
' Ouverture de ADA.xlsx"
Workbooks.Open "C:\Users\maxime.paruch\Analyse de donnée EXCEL\[color=#FF4000]ncompte[/color]\ADA.xlsx"
Application.DisplayAlerts = False
' Copie des données :
Workbooks("ADA.xlsx").Sheets("ADA").Range("A1:P1000").Copy
Workbooks("Générateur de bilan de comptes.xlsm").Activate
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Select
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Paste
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Range("A1").Select
' Fermeture de ADA.xlsx :
Workbooks("ADA.xlsx").Close False
Application.DisplayAlerts = True
' Ouverture de ADA-2.xlsx :
Workbooks.Open "C:\Users\maxime.paruch\Analyse de donnée EXCEL\[color=#FF4000]ncompte[/color]\ADA-2.xlsx"
Application.DisplayAlerts = False
' Copie des données :
Workbooks("ADA-2.xlsx").Sheets("ADA-2").Range("A1:P1000").Copy
Workbooks("Générateur de bilan de comptes.xlsm").Activate
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Select
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Paste
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Range("A1").Select
' Fermeture de ADA-2.xlsx :
Workbooks("ADA-2.xlsx").Close False
Application.DisplayAlerts = True
Je vous remercie pour votre aide.
Maxime PARUCH
Bonjour, votre macro semble avoir une certaine logique, pour ma part j'étais en train de developper celle-ci
Sub dossier()
Dim fichier, dossier, fichierD As Workbook
With Application.FileDialog(msoFileDialogFolderPicker)
'.InitialFileName = ActiveWorkbook.Path & "\"
.Show
If .SelectedItems.Count > 0 Then
dossier = .SelectedItems(1)
Else
dossier = ""
End If
End With
fichier = Array("ADA", "ADA_2", "ADM", "ADV", "CHRONO", "DEVIS1")
For i = 0 To UBound(fichier)
Workbooks.Open dossier & "\" & fichier(i) & ".xlsx"
Set fichierD = ActiveWorkbook
'ici placer une condition si
'Si fichierD = fichier(0) alors copier plage générateur de bilan sur la feuille ADA-2
'si FichierD =fichier(1) alors copier............................... sur la feuille ADA_2-2
Next
End Sub
La première partie de la macro est une macro déjà existante qui permet de récupérer le nom du répertoire.
De se fait, le nom complet du chemin sera dans la variable "dossier"
Ensuite avec fichier = Array("ADA", "ADA_2", "ADM", "ADV", "CHRONO", "DEVIS1")
Je crée un petit tableau virtuel ou je rentre le nom (simplement le nom) des fichiers à traiter
Puis je fais une boucle
--> Workbooks.Open dossier & "\" & fichier(i) & ".xlsx" j'ouvre dans le dossier spécifier le ième fichier (ADA fichier 1,ADA_2 c'est le fichier 2 etc)
Puis pour coller sur les bonnes feuille de chaque fichier il faudra étudier une fonction si ou un select cas mais sans savoir précisément collé quoi et ou je ne peux le faire pour vous.
Cordialement
Alors là, je suis impressionné, j'ai copié votre programme et il marche, je vais bien chercher mon répertoire de la forme XXXXXX, et il ouvre automatique les fichiers ADA ADA-2 ADM CHRONO........
A la suite de ça je vais intégrer ma partie pour faire les copies, et coller dans "générateur de bilan de compte"...
Je vous remercie, j'aurai quelques questions, sur quelques lignes que je ne comprends pas...
Je vous remercie,
J'adapte mon programme et l'envoie ensuite ici.
Maxime Paruch
Je n'y répondrai que vers midi car je vais m'absenter
Voici une partie du programme, j'ai remplacer fichierd par generation :
Sub dossier()
Dim fichier, dossier, Generation As Workbook
With Application.FileDialog(msoFileDialogFolderPicker)
'.InitialFileName = ActiveWorkbook.Path & "\"
.Show
If .SelectedItems.Count > 0 Then
dossier = .SelectedItems(1)
Else
dossier = ""
End If
End With
fichier = Array("ADA", "ADA-2", "ADM", "CHRONO", "DEVIS1")
For i = 0 To UBound(fichier)
Workbooks.Open dossier & "\" & fichier(i) & ".xlsx"
Set Generation = ActiveWorkbook
If Generation = fichier(0) Then
Workbooks("ADA.xlsx").Sheets("ADA").Range("A1:P1000").Copy
Workbooks("Générateur de bilan de comptes.xlsm").Activate
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Select
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Paste
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA").Range("A1").Select
End If
If Generation = fichier(1) Then
Workbooks("ADA-2.xlsx").Sheets("ADA-2").Range("A1:P1000").Copy
Workbooks("Générateur de bilan de comptes.xlsm").Activate
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Select
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Paste
Workbooks("Générateur de bilan de comptes.xlsm").Sheets("ADA (2)").Range("A1").Select
'ici placer une condition si
'Si fichierD = fichier(0) alors copier plage générateur de bilan sur la feuille ADA-2
'si FichierD =fichier(1) alors copier............................... sur la feuille ADA_2-2
End If
Next i
End Sub
Il ouvre bien les fichiers mais sa bloc au niveau de : If Generation = fichier(0) Then
ça affiche : Erreur d'exécution 438, propriété ou méthode non géré par cet objet
Merci pour votre aide.
Maxime PARUCH
Workbooks("ADA-2.xlsx").Sheets("ADA-2")
Workbooks("ADA.xlsx").Sheets("ADA")
Le nom des feuilles sera toujours le même que le nom du classeur ?
Oui, les mêmes
Maxime PARUCH
essayez celle-ci.
Sub dossier()
Dim fichier, dossier, fe,Generation As Workbook
With Application.FileDialog(msoFileDialogFolderPicker)
'.InitialFileName = ActiveWorkbook.Path & "\"
.Show
If .SelectedItems.Count > 0 Then
dossier = .SelectedItems(1)
Else
dossier = ""
End If
End With
fichier = Array("ADA", "ADA-2", "ADM", "CHRONO", "DEVIS1")
For i = 0 To UBound(fichier)
Workbooks.Open dossier & "\" & fichier(i) & ".xlsx"
Set Generation = ActiveWorkbook
fe = Left(Generation.Name, Len(Generation.Name) - 5)
Generation.Sheets(fe).Range("A1:P1000").Copy Workbooks("Générateur de bilan de comptes.xlsm").Sheets(fe).Range("A1")
Generation.Close False
Next i
End Sub
Il existe des techniques pour lire dans un classeur fermés sans les ouvrir mais je ne maîtrise pas du tout cette partie donc par défaut, j'ouvre et je ferme le fichier.
Generation.Sheets(fe).Range("A1:P1000").Copy Workbooks("Générateur de bilan de comptes.xlsm").Sheets(fe).Range("A1")
le programme bloque sur cette avant dernière ligne.
Il s'agit d'une erreur "9". L'indice n'appartient pas à la sélection.
Merci,
Maxime