Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

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... wink.gif

É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. wink.gif (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.XLSX. Ç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. wink.gif

É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 ? smile.gif

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é. wink.gif

É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)