Version imprimable du sujet
Forums MacBidouille _ Technologies Apple _ Excel : regrouper des fichiers
Écrit par : b00ss 3 Apr 2017, 16:08
Bonjour à tous,
J'utilise Excel tous les jours, et je synchronise plusieurs dossiers avec 2 autres personnes.
J'ai un dossier qui contient plusieurs centaines de fichiers, dans 2 colonnes, A & B (la colonne B peut aller jusqu'à la ligne 500)
Je voudrais faire un fichier ALL.xls qui regrouperait l'ensemble des fichiers, afin de pouvoir faire des recherches.
Comment puis-je faire ?
Merci pour votre aide,
Écrit par : Aliboron 3 Apr 2017, 16:51
Dossiers, fichiers,... Sachant qu'Excel utilise des classeurs contenants des feuilles, est-ce que tu peux décrire précisément le contexte et ce que tu veux faire ?
Tel que je crois le comprendre, si tu veux faire la liste des classeurs contenus dans un dossier, il suffit d'aller dans le dossier, de tout sélectionner (Commande A), de copier (Commande C) puis d'ouvrir un classeur Excel et de coller la liste complète (Commande V).
Si ça ne répond pas à ta question, merci de donner des précisions...
Écrit par : b00ss 3 Apr 2017, 17:49
Merci de te réponse, je vais t'expliquer....
J'ai donc un dossier sur mon MAC, qui s'appelle "commandes".
Dans mon dossier commandes, j'ai plusieurs fichiers XLS (classeurs), qui s'appellent : commande1.xls, commande2.xls, etc. Au moins 500 classeurs.
Tous ces classeurs Excel n'ont qu'une seule feuille et ont toujours la meme structure, colonne A : infos du client, date du jour, etc. ; colonne B : les numéros de série de la commande du client.
Ce que je voudrais faire dans un fichier ALL.xls, c'est rassembler toutes les informations (les colonnes A & B de chaque classeur) dans ce fichier (classeur ALL.xls) afin de pouvoir recherche des données.
Merci,
Écrit par : Aliboron 3 Apr 2017, 23:15
Si tu veux récupérer des données dans 500 classeurs, il va te falloir passer par un peu de programmation. Soit en VBA dans Excel, soit en AppleScript ou Automator (à toi de voir en fonction de tes habitudes/goûts).
Ceci dit, si tu veux quelques éléments complémentaires, il serait peut-être temps de préciser un peu le contexte (version de Mac OS X, version et niveau de mise à jour d'Excel, par exemple)...
Écrit par : baron 4 Apr 2017, 04:28
Autrement, l'affaire serait plus simple si tu avais 500 feuilles dans un classeur…
(OK, ça peut être lourd au quotidien.)
Écrit par : b00ss 4 Apr 2017, 10:03
Je suis sous Mac OS 10.12 sur un iMac 5K, MS Office 2011
Que ce soit en VBA, Applescript ou automator, je suis ouvert à tout... Que proposez vous ?
Écrit par : Aliboron 4 Apr 2017, 10:12
Citation (b00ss @ 4 Apr 2017, 11:03)
Que proposez vous ?
... de t'aider.
(n'inversons pas le sens des choses).
Pour les macros VBA, Excel 2011 permet d'enregistrer ce qu'on fait, ce qui donne un bon début de programmation VBA (il faut évidemment y apporter pas mal de modifications quand on veut généraliser l'enregistrement se contentant "bêtement" de prendre note de ce qu'on fait, pas des intentions qu'on a).
Écrit par : b00ss 4 Apr 2017, 12:17
J'avais trouvé ça sur un autre post, en Apple script mais sans explications de ce qu'il faudrait modifier. Et je ne pense pas que ça fonctionne encore sur Excel 2011 ou plus récent...
Code
tell application "Finder" to set t_files to (document files of (choose folder) whose name starts with "feuille" and name extension is "xls") as alias list
set a to 2
tell application "Microsoft Excel"
set t_book to make new workbook
set name of sheet 1 to "index"
repeat with i in t_files
set currBook to open workbook workbook file name (i as string) with read only
copy range (range "$A$2:$K$22" of sheet 1 of currBook) destination (row a of sheet "index" of t_book)
close currBook saving no
set a to a + 21
end repeat
end tell
Écrit par : Jack the best 4 Apr 2017, 14:24
Rien à voir, mais j'aime bien ta signature !
Écrit par : guillaum 4 Apr 2017, 16:01
Bonjour.
Quelques idées qui peuvent être un autre regard...
Tu veux regrouper tes tableaux dans un seul classeur pour faire tes recherches... ce qui veut dire :
1 - Soit que tes données vont exister en double, et là tu t'expose à des problème de mise à jour (dans quelle feuille mettre les nouvelles données, quelle est la dernière synchro...)
2 - Soit que toutes tes données se retrouvent dans une feuille : avec le problème de poids et de taille de la feuille...
Pourquoi ne pas faire dans une feuille à part, une recherche qui va fouiller les autres feuilles une par une, sans les recopier ?
Voir un exemple qui me semble assez proche :
https://forum.excel-pratique.com/excel/recherche-donnees-dans-plusieurs-classeurs-et-onglets-t21464.html
Bon courage
Écrit par : Aliboron 5 Apr 2017, 23:29
Citation (b00ss @ 4 Apr 2017, 13:17)
J'avais trouvé ça sur un autre post, en Apple script mais sans explications de ce qu'il faudrait modifier. Et je ne pense pas que ça fonctionne encore sur Excel 2011 ou plus récent...
Cet AppleScript fonctionne très bien dans Excel 2011 et Excel 2016 pour Mac. Il convient évidemment d'adapter la première partie en remplaçant "feuille" par quelque chose d'adapté à ton contexte (à moins que les classeurs concernés ont des noms commençant par "feuille", évidemment) ainsi que l'extension .xls puisqu'on pense bien que tes classeurs sont maintenant en .xlsx
Écrit par : b00ss 11 Apr 2017, 19:22
J'ai simplement remplacé 2 choses dans ce script, "enco" car tous mes fichiers commencent par ENCO.
Et j'ai modifié la table a copier (pour aller jusqu'à 500)
Code
tell application "Finder" to set t_files to (document files of (choose folder) whose name starts with "enco" and name extension is "xls") as alias list
set a to 2
tell application "Microsoft Excel"
set t_book to make new workbook
set name of sheet 1 to "index"
repeat with i in t_files
set currBook to open workbook workbook file name (i as string) with read only
copy range (range "$A$2:$K$501" of sheet 1 of currBook) destination (row a of sheet "index" of t_book)
close currBook saving no
set a to a + 500
end repeat
end tell
Puis-je définir la fin du copy range à la cellule "A11" ? A11 est égal au nombre de ligne contenue dans mes encodages. Si A11 est égal à 300, le fichier ira jusqu'à la ligne L301 (300+1)
Je peux également automatiser le script Apple afin qu'il se lance automatiquement chaque fin de journée (via Calendrier)
Mais, serait-il possible de définir le nom du fichier contenant tous les encodages à ALL.XLS ?
Et donc, d'incrémenter ce fichier ALL.XLS chaque jour ?
Encore mieux, serait-il possible d'incrémenter ce fichier ALL.XLS dès qu'un nouveau fichier arrive dans le dossier des encodages (par exemple, dès qu'un nouveau fichier encoxxxx.xls arrive dans "HDD/Commandes/") ?
Écrit par : Aliboron 12 Apr 2017, 13:51
Citation (b00ss @ 11 Apr 2017, 20:22)
Puis-je définir la fin du copy range à la cellule "A11" ? A11 est égal au nombre de ligne contenue dans mes encodages. Si A11 est égal à 300, le fichier ira jusqu'à la ligne L301 (300+1)
Bien sûr. Il faut affecter la valeur de la cellule A11 à une variable, puis utiliser la variable dans la boucle. Quelque chose comme ceci :
Code
tell application "Finder" to set t_files to (document files of (choose folder) whose name starts with "Banque" and name extension is "xls") as alias list
set a to 2
tell application "Microsoft Excel"
set t_book to make new workbook
set name of sheet 1 to "index"
repeat with i in t_files
set currBook to open workbook workbook file name (i as string) with read only
set maVar to value of range "$A$11" as integer
set maPlage to "$A$2:$K$" & maVar
copy range (range maPlage) destination (row a of sheet "index" of t_book)
close currBook saving no
set a to a + maVar
end repeat
end tell
Citation (b00ss @ 11 Apr 2017, 20:22)
Mais, serait-il possible de définir le nom du fichier contenant tous les encodages à ALL.XLS ?
Oui, vu que c'est toi qui décides du nom au moment de l'enregistrement...
Citation (b00ss @ 11 Apr 2017, 20:22)
Et donc, d'incrémenter ce fichier ALL.XLS chaque jour ?
Oui, il te faut déterminer la première cellule libre dans ta feuille et coller à partir de cet emplacement et donner à la variable a la valeur de la première ligne libre au lieu de 2. Par contre, je t'engage vivement à penser sérieusement à passer au format OpenXML, et donc à ALL.XLS
X. Ça ne fait jamais que dix ans que c'est le format natif d'Excel...
Citation (b00ss @ 11 Apr 2017, 20:22)
serait-il possible d'incrémenter ce fichier ALL.XLS dès qu'un nouveau fichier arrive dans le dossier des encodages (par exemple, dès qu'un nouveau fichier encoxxxx.xls arrive dans "HDD/Commandes/") ?
Puisque tu es dans les AppleScripts, regarde comment fonctionnent les "Actions de dossier" de Mac OS X.
Écrit par : b00ss 12 Apr 2017, 15:53
Super, un grand merci pour ta réponse...
D'après toi, tout est faisable, puisque tu réponds "Oui" à l'ensemble des mes questions...
Après, je "sais" lire le code (ou le déchiffrer) mais je ne sais pas coder....
Donc pour faire, ces étapes, quel serait le code ? 😃
Merci,
Écrit par : Aliboron 12 Apr 2017, 15:59
Citation (b00ss @ 12 Apr 2017, 16:53)
Après, je "sais" lire le code (ou le déchiffrer) mais je ne sais pas coder....
Excellente occasion pour apprendre, alors. Concernant AppleScript, tu trouveras plein de choses sur
http://macscripter.net. Sans oublier, bien entendu
http://trad.applescript.free.fr/accueil.html et
http://iscript.tibimac.com qui ont le grand avantage de causer français...
Écrit par : b00ss 12 Apr 2017, 19:37
Si je récapitule, il faudrait arriver à quelque chose comme ça...
Qui peut m'aider à transformer ce brouillon en Apple script ?
Code
tell application "Finder" to set ceDossier to "Macintosh HD:Utilisateurs:macbook:Bureau:TEST"
--Dis à l'application Finder, de définir le dossier TEST du bureau comme variable ceDossier
on adding folder items to ceDossier after receiving itemsajoutes
--Si des fichiers sont ajoutés dans ceDossier, alors exectuter le script
--Comment faire, si des fichiers sont simplement modifiés ?
-- Si pas, affiche -- display dialog "Aucun fichier ajoutés aujourd'hui"
tell application "Finder" to set t_files to (document files of (choose folder) whose name starts with "enco" and name extension is "xlsx") as alias list
--Définir la liste à executer dans le dossier
set a to 2
--définir la destination finale à la première cellule libre dans ta feuille et coller à partir de cet emplacement et donner à la variable a la valeur de la première ligne libre au lieu de 2
tell application "Microsoft Excel"
--set t_book to open ALL.XLSX dans dossier "Macintosh HD:Utilisateurs:macbook:Bureau:TEST"
repeat with i in t_files
set currBook to open workbook workbook file name (i as string) with read only
set maVar to value of range "$A$11" as integer
set maPlage to "$A$2:$K$" & maVar
copy range (range maPlage) destination (row a of sheet "ALLenco" of t_book)
close currBook saving no
set a to a + maVar
end repeat
--fin du script de selection et de copie des cellules
save
--Enregistrer le fichier ALL.XLSX
--Envoie d'un email pour confirmation avec le fichier en PJ :)
end tell
end adding folder items to
Écrit par : b00ss 12 Apr 2017, 20:26
Peut etre devrais-je déplacer ce post dans PROGRAMMATION ?
> Forums MacBidouille > Général > Programmation > Technologies Apple
Est-ce qu'un admin peut m'aider ? Merci
Écrit par : baron 12 Apr 2017, 22:49
Déplacé.
Écrit par : PBell 13 Apr 2017, 08:28
Bonjour,
Je me permets juste un petit conseil: avant de mettre ton script sous forme d'action de dossier, je te conseille fortement de la faire en direct pour la mise au point.
En effet les actions de dossiers sont lancées en tâche de fond et les erreurs de mise au point seront difficilement traçables.
Donc tu fais ton script avec un "choose file" et un "choose folder" qui sélectionnent le dossier et les fichiers Excel prétendument ajoutés.
Une fois mis au point, tu remplaces les 2 "choose..." par le handler "on adding folder..."
J'ai fais de nombreux folder actions et c'est finalement la méthode la plus efficace.
Par ailleurs, si tu ne connais pas le nombre de lignes à copier de ton fichier Excel, tu peux le trouver avec :
CODE
set DerLigne to count of rows of used range of active sheet
La variable DerLigne contient les nombre de ligne. Si ton bloc de données débute en ligne 2, alors tes données sont de A2 à B(Derligne+1).
Je te suggère de nommer ton fichier résultant avec date_heure de type aaaa_mm_jj-hh_mm ce sera plus facile de trouver le dernier.
Cordialement
Écrit par : cloum 7 May 2020, 08:33
Bonjour
j'ai la meme question. Finalement est ce que tu as pu finaliser ??
merci
Écrit par : PBell 8 May 2020, 07:28
Bonjour,
Voici le script que j'avais fait à l'époque pour tester l'idée.
Il combine à la fois les actions de dossier et tu peux aussi le lancer en direct. Dans ce cas, il va te demander de sélectionner le dossier avec les fichiers Excel à regrouper.
Dans les 2 cas, il filtre les xlsx et les fichier commençant par "enco" comme demandé par b00ss.
Le fichier de regroupement est fixe (première ligne du handler "fusion_excel".
Code
(* le programme principal est le handler fusion_excel
Lors d'un run classique (handler on run), l'utiisateur doit choisir le dossier des fichiers Excel
Lors d'un appel via action de dossier, l'action de dossier fourni la liste de Excel ajoutés
*)
--****************************
on run
-- sélection du dossier des fichiers Excel à regrouper
tell application "Finder" to set liste to (document files of (choose folder "selectionner le dossier contentant les fichiers Excel à regrouper") whose name starts with "enco" and name extension is "xlsx") as alias list
fusion_excel(liste)
end run
--****************************
on adding folder items to ceDossier after receiving fichiers
-- il faut filtrer les fichiers de type xlsx commençant par "enco"
set liste to {}
tell application "Finder"
repeat with un_fichier in fichiers
set f to file un_fichier
if ((name of f) starts with "enco") and (name of f ends with "xlsx") then set end of liste to un_fichier
end repeat
end tell
fusion_excel(liste)
end adding folder items to
--****************************
on fusion_excel(listeXL) -- regroupe sur 1 fichier Excel les contenus de fichiers Excel de la liste listeXL
set ALLXL to "Users:imac27:Desktop:Groupe_Excel:ALL.xlsx" -- fichier Excel de regroupement
tell application "System Events" to set ALL_OK to exists file ALLXL -- vérifie que le fichier ALLXL existe déjà
tell application "Microsoft Excel"
activate
if ALL_OK then -- Le fichier existe, ouverture et position de la prochaine ligne vide
open ALLXL
set all_wb to active workbook
set der_ligne to (count of rows of used range of active sheet) + 1
else -- Le fichier n'existe pas. On le crée et l'enregistre. La prochaine ligne est 1
set all_wb to make new workbook
save workbook as all_wb filename ALLXL
set der_ligne to 1
end if
repeat with unXL in listeXL
set curr_wb to open workbook workbook file name (unXL as string) with read only
set Nb_lignes to count of rows of used range of sheet 1 of curr_wb
copy range (used range of sheet 1 of curr_wb)
close curr_wb saving no
activate all_wb
paste worksheet sheet 1 destination range ("A" & der_ligne)
set der_ligne to der_ligne + Nb_lignes
end repeat
close all_wb saving yes
end tell
end fusion_excel
Cordialement
Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)