IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> applescript et insertion image dans excel, ou macro xl
Options
ades
posté 14 Sep 2014, 12:31
Message #1


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



bonjour
Je souhaite insérer dans excel (excel mac 2011) des images, placées dans un dossier et dont je connais le chemin.
J'ai donc une colonne où je souhaite mettre l'image, une colonne avec le chemin et une colonne avec le nom de l'image (avec ou sans suffixe, ça je sais modifier wink.gif )

j'ai bien "trouvé" (en 2 ou 3 heures - sur le net) un script qui répond en partie à ma question. Il importe les images, change la dimension des cellules, et laisse même les images "attachées" à la ligne où elles se trouvent.
Les images sont importées suivant l'ordre de classement par nom dans le dossier.
c'est presque parfait

J'ai environ 2000 images pour 3000 lignes il y aura donc des lignes sans image, en rusant je peux faire un tri de façon à ce que les 2000 fiches devant recevoir une image soient en tête et bien rangées. J'ai quand même la crainte que le script foire un peu et que du coup je me retrouve avec des images insérées à la mauvaise ligne. Et vu le nombre et le fait que ces images sont importées mais pas renseignées (par leur nom par exemple) je crains de ne pas pouvoir vérifier.

D'où la question : est-il possible de modifier ce sript, pour qu'à partir du nom de l'image (et sans doute de sont chemin) les images insérées colonne A correspondent bien à leurs références ?

le script en question :
Citation
set imageFolder to (choose folder)

tell application "Finder"
set imageList to files of folder imageFolder
end tell

tell application "Microsoft Excel"
set imageHeight to 140
set imageWidth to 280
set imageCount to count of imageList
set theRange to range ("A1:B" & imageCount as string) of worksheet 1 of workbook 1
set thisStep to 0
set theLeft to left position of cell 4 of row 1


repeat with imageFile in imageList

set theTop to (top of cell 4 of row (1 + thisStep))

set newPic to make new picture at beginning of worksheet 1 of workbook 1 with properties {file name:(imageFile as text), height:imageHeight, width:imageWidth, top:theTop, left position:theLeft, placement:placement move}


set thisStep to thisStep + 1
end repeat
set row height of theRange to imageHeight
end tell



--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
Aliboron
posté 14 Sep 2014, 13:13
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 198
Inscrit : 1 Jan 2008
Lieu : Toulouse.cong
Membre no 103 942



Un classeur Excel avec 2000 images ? Pas sûr que tu aies choisi le bon outil (rappelons qu'Excel est un tableur)… ça risque de ramer sérieusement, une fois tes images importées.


--------------------
Bernard

MacMini, iMac et tout un tas d'accessoires -- FAQ Office Macintosh
Go to the top of the page
 
+Quote Post
ades
posté 14 Sep 2014, 13:30
Message #3


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



C'est pas moi qui choisi mais ces putains de c… de clients qui ont toujours raison wink.gif, mais je ferais des petites images… bien crades wink.gif


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
noop
posté 14 Sep 2014, 15:24
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



A mon avis tu n'as donné assez d'infirmation pour que l'on comprenne ton problème.
Quelles colonnes de l'excel permettent d'accéder à ces images ?
Comment est la hiérarchie du/des dossier(s) qui contient les images
Comment sont formés les noms des images ?
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 14 Sep 2014, 18:11
Message #5





Guests






Bonjour,


Si vous avez déjà les noms des images dans Excel et que les images sont tous dans le même dossier:
Pour avoir la bonne référence, on prends les noms des images dans Excel, après il suffit de prendre le fichier ayant ce nom dans le dossier des images, le script insére l'image dans la même rangée que le nom, si l'image n'existe pas on continue avec le nom dans la prochaine rangée.
Voici le script :

Code
set imageFolder to (choose folder)
getFilesFromList(imageFolder as text)

on getFilesFromList(d)
    script o
        property l : {}
    end script
    set imageHeight to 140
    set imageWidth to 280
    tell application "Microsoft Excel"
        set o's l to value of range "B1:B3000" of worksheet 1 of workbook 1 --  la colonne qui contient les noms
        set theLeft to left position of cell 1 of row 1
        set row height of range "A1:A3000" of worksheet 1 of workbook 1 to imageHeight -- la colonne pour insérer les images
    end tell
    set tc to count o's l
    repeat with i from 1 to tc
        set nom to item 1 of item i of o's l
        if nom is not "" then
            set fich to (d & nom) -- le chemin du dossier + le nom du fichier = le chemin du fichier
            try
                fich as alias -- erreur si ce fichier n'existe pas, on continue avec le prochain nom dans la liste
                tell application "Microsoft Excel" to make new picture at beginning of worksheet 1 of workbook 1 with properties {file name:fich, height:imageHeight, width:imageWidth, top:(top of cell 1 of row i), left position:theLeft, placement:placement move}
            end try
        end if
    end repeat
end getFilesFromList


Il suffit de modifier les ranges dans le script selon votre feuille dans Excel (dans le script actuel, les noms des images sont dans la deuxième colonne, rangée 1 à 3000, les images seront insérer dans la première colonne.)
Si il y a des cellules de vide (aucun nom) , il n'y aura aucun problème avec ce script.

Si les noms des images dans Excel ne contient pas son extension, remplace set fich to (d & nom) par set fich to (d & nom & ".jpg") -- si c'est des JPEG


Edition dans le script :
Code
set nom to item 1 of item i of o's l


Ce message a été modifié par JacqR - 15 Sep 2014, 14:00.
Go to the top of the page
 
+Quote Post
ades
posté 15 Sep 2014, 07:02
Message #6


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



merci à vous deux, on dirait que j'ai pris un abonnement… wink.gif

@noop tout est rangé comme il faut wink.gif
@ JacqR c'est parfait, faut juste bien penser à adapter la plage de lecture des noms dans excel au nombre de lignes sinon un message d'erreur excel (une erreur s'est produite pendant l'importation suivi du chemin du dossier) apparait autant de fois qu'il y a de ligne vide.
Si je voulais pinailler ce serait mieux qu'en l'absence de ref d'image la taille de la ligne ne soit pas modifiée, mais je vais m'arranger pour qu'il y ait bien une image à chaque fois wink.gif .


Pour préciser le contexte, les images sont référencées dans aperture (donc laissées dans un dossier et exportable ou je veux dans le format que je veux), à partir de là comme je travaille ma base avec FMPro (c'est le client qui veux de l'excel) j'importe les images (à la bonne taille et en "dur") dans FMP en les mettant là où il faut, puis j'ai un script qui me permet de les exporter dans un nouveau dossier, avec un nouveau nom (suivant une série séquentielle demandée par le client : insee de la commune + n° séquentiel dans la commune ce que je calcule dans FMP), ensuite j'exporte la base dans excel comme il n'y que du texte ça ne pose pas de soucis.
Ne reste (ne restait) plus qu'à voir comment importer les images dans excel. Le processus est sans doute améliorable, mais d'une part je n'ai pas ça à faire tous les jours, et d'autre part ça me permet, à part le script d'import dans excel de rester à mon niveau de compétence. Merci encore.

ps : pour l'autre question que j'avais posée (changement des IPTC) c'est un petit plus pour le client… comme ça il pourra voir à quoi correspondent les images qui ne sont pas "intégrées" dans excel, j'ai oublié de dire que je choisi une image de référence par fiche, c'est celle qui apparaitra dans excel, mais il y en a d'autres qui sont rangées ailleurs…


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 15 Sep 2014, 14:07
Message #7





Guests






Bonjour,

Citation (ades @ 15 Sep 2014, 02:02) *
@ JacqR c'est parfait, faut juste bien penser à adapter la plage de lecture des noms dans excel au nombre de lignes sinon un message d'erreur excel (une erreur s'est produite pendant l'importation suivi du chemin du dossier) apparait autant de fois qu'il y a de ligne vide.
Si je voulais pinailler ce serait mieux qu'en l'absence de ref d'image la taille de la ligne ne soit pas modifiée, mais je vais m'arranger pour qu'il y ait bien une image à chaque fois wink.gif .

OK, j'avais oublié que les valeurs d'un range était une liste dans un liste laugh.gif , donc Excel tentait d'insérer un dossier quand la cellule était vide, la ligne dans le script devrait être --> set nom to item 1 of item i of o's l au lieu set nom to item i of o's l

Voici un nouveau script :
Il n'y aura pas d'erreur dans Excel, si la cellule est vide (pas de nom).
Le script change la hauteur de la rangée que si l'image est insérée.
On change les paramètres dans les premières lignes du script, ce sera plus facile à comprendre et a modifier pour d'autres personnes qui aurait besoin d'un script semblable.

Code
set depart to 1 -- la rangée où on commence
set arret to 3000 -- la rangée où on arrête
set colName to 2 -- le numéro de la colonne des noms
set colImage to 1 -- le numéro de la colonne des images
set imageHeight to 140
set imageWidth to 280

set imageFolder to (choose folder)
getFilesFromList(imageFolder as text, depart, arret, colName, colImage, imageWidth, imageHeight)

on getFilesFromList(d, sta, sto, colN, colI, w, h)
    tell application "Microsoft Excel"
        set theLeft to left position of cell colI of row sta
        repeat with i from sta to sto
            set nom to value of cell colN of row i
            if nom is not "" then
                set fich to (d & nom) -- le chemin du dossier + le nom du fichier = le chemin du fichier
                try
                    fich as alias -- erreur si ce fichier n'existe pas, on continue avec le prochain nom dans la liste
                    make new picture at beginning of worksheet 1 of workbook 1 with properties {file name:fich, height:h, width:w, top:(top of cell colI of row i), left position:theLeft, placement:placement move}
                    set row height of cell colI of row i to h
                end try
            end if
        end repeat
    end tell
end getFilesFromList


Ce message a été modifié par JacqR - 15 Sep 2014, 14:11.
Go to the top of the page
 
+Quote Post
ades
posté 15 Sep 2014, 14:16
Message #8


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



trop fort, merci encore


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
ades
posté 3 Nov 2014, 19:09
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



bonsoir
j'ai un petit soucis avec ces scripts, le premier fait chier avec des messages d'erreurs lorsque le nom de l'image n'est pas dans le doc excel, ce que JacqRa bien pris en compte dans le second, qui en plus n'agrandi que les lignes nécessaires, donc super…
mais… avec le premier les images se déplacent lorsque je fais un tri sur une colonne (càd qu'elle restent dans la bonne ligne), avec le second elles restent en place (càd n'importe où après le tri), je ne comprends pas pourquoi et je bloque…
j'espère que ce n'est pas à cause du passage de 10.9 à 10.10…
si quelqu'un a un tuyau… je prends
merci

ps : xl 14.0.0

Ce message a été modifié par ades - 3 Nov 2014, 19:11.


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 3 Nov 2014, 21:36
Message #10





Guests






Bonsoir,

Citation (ades @ 3 Nov 2014, 14:09) *
avec le second elles restent en place (càd n'importe où après le tri), je ne comprends pas pourquoi et je bloque…
j'espère que ce n'est pas à cause du passage de 10.9 à 10.10…
si quelqu'un a un tuyau… je prends
merci

ps : xl 14.0.0

Je n'avais pas testé le tri.
Je viens juste de tester le tri, effectivement cela ne fonctionne pas, même pas sur Mavericks ou Leopard.

Voici la solution qui fonctionne ici :
la différence est dans le bloc try : placement move and size au lieu de placement move, et déplacement de la ligne qui ajuste la hauteur de la rangée juste avant l'importation de l'image.
Aussi, lors du tri, il faut s'assurer que la colonne des images est sélectionnée, car ici Excel étend la sélection que sur les colonnes autres que la colonne des images.

Code
set depart to 1 -- la rangée où on commence
set arret to 10 -- la rangée où on arrête
set colName to 2 -- le numéro de la colonne des noms
set colImage to 1 -- le numéro de la colonne des images
set imageHeight to 140
set imageWidth to 280

set imageFolder to (choose folder)
getFilesFromList(imageFolder as text, depart, arret, colName, colImage, imageWidth, imageHeight)

on getFilesFromList(d, sta, sto, colN, colI, w, h)
    tell application "Microsoft Excel"
        set theLeft to left position of cell colI of row sta
        repeat with i from sta to sto
            set nom to value of cell colN of row i
            if nom is not "" then
                set fich to (d & nom) -- le chemin du dossier + le nom du fichier = le chemin du fichier
                try
                    fich as alias -- erreur si ce fichier n'existe pas, on continue avec le prochain nom dans la liste
                    set row height of row i to h
                    make new picture at beginning of worksheet 1 of workbook 1 with properties {file name:fich, height:h, width:w, top:(top of cell colI of row i), left position:theLeft, placement:placement move and size}
                    
                end try
            end if
        end repeat
    end tell
end getFilesFromList
Go to the top of the page
 
+Quote Post
ades
posté 3 Nov 2014, 22:04
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



Merci, je testerais demain, un peu tard ast'heur…
et tiendrais au courant.


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
ades
posté 4 Nov 2014, 06:16
Message #12


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



raté…
le script ne veux pas s'enregistrer en tant que script :
Citation
"erreur de syntaxe : « end » prévu(s) mais jeton inconnu trouvé(s). "
et si je le lance, ce message apparait alors que le curseur est au début de la ligne
Citation
    tell application "Microsoft Excel"

pourtant il me semble que jusque là il n'y a pas de différence avec la version précédente…



--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
ades
posté 4 Nov 2014, 12:36
Message #13


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



j'ai ajouté le choix du fichier au début et ça fonctionne, sauf que la taille des cellules n'est pas conservé lors d'un tri càd que le tri fonctionne, les images bouges, mais comme les cellules où il n'y a pas d'image n'ont pas changée de place…
si il y a une solution tant mieux, mais j'en doute un peu ;-)
merci en tous cas.


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 4 Nov 2014, 22:19
Message #14





Guests






Citation (ades @ 4 Nov 2014, 07:36) *
j'ai ajouté le choix du fichier au début et ça fonctionne, sauf que la taille des cellules n'est pas conservé lors d'un tri càd que le tri fonctionne, les images bouges, mais comme les cellules où il n'y a pas d'image n'ont pas changée de place…
si il y a une solution tant mieux, mais j'en doute un peu ;-)
merci en tous cas.


Je viens de tester sur Excel Version 14.4.5, j'obtient le même comportement que toi, alors que sur la version (Office 2004) cela fonctionne bien avec le script de mon avant-dernier message.

Pour que le tri (avec des images) fonctionne bien sur Excel Version 14.4.5, voici la seule solution que je connaisse :

La hauteur des lignes doivent être égaux, voici le script

Code
set depart to 1 -- la rangée où on commence
set arret to 3000 -- la rangée où on arrête
set colName to 2 -- le numéro de la colonne des noms
set colImage to 1 -- le numéro de la colonne des images
set imageHeight to 140
set imageWidth to 280

set imageFolder to (choose folder)
getFilesFromList(imageFolder as text, depart, arret, colName, colImage, imageWidth, imageHeight)

on getFilesFromList(d, sta, sto, colN, colI, w, h)
    tell application "Microsoft Excel"
        set row height of range ("A" & sta & ":A" & sto) of worksheet 1 of workbook 1 to h
        set theLeft to left position of cell colI of row sta
        repeat with i from sta to sto
            set nom to value of cell colN of row i
            if nom is not "" then
                set fich to (d & nom) -- le chemin du dossier + le nom du fichier = le chemin du fichier
                try
                    fich as alias -- erreur si ce fichier n'existe pas, on continue avec le prochain nom dans la liste
                    make new picture at beginning of worksheet 1 of workbook 1 with properties {file name:fich, height:h, width:w, top:(top of row i), left position:theLeft, placement:placement move}
                    
                end try
            end if
        end repeat
    end tell
end getFilesFromList


Ce message a été modifié par JacqR - 4 Nov 2014, 22:20.
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 5 Nov 2014, 20:50
Message #15





Guests






Bonjour,

Voici une solution pour que la taille de la rangée et le tri fonctionne correctement sur Excel Version 14.4.5, mais vous avez besoin d'une macro pour cela.

L'AppleScript
Code
set depart to 1 -- la rangée où on commence
set arret to 3000 -- la rangée où on arrête
set colName to 2 -- le numéro de la colonne des noms
set colImage to 1 -- le numéro de la colonne des images
set imageHeight to 140
set imageWidth to 280

set imageFolder to (choose folder)
getFilesFromList(imageFolder as text, depart, arret, colName, colImage, imageWidth, imageHeight)

on getFilesFromList(d, sta, sto, colN, colI, w, h)
    tell application "Microsoft Excel"
        set screen updating to false --  to speed up the AppleScript code.
        set theLeft to left position of cell colI of row sta
        repeat with i from sta to sto
            set nom to value of cell colN of row i
            if nom is not "" then
                set fich to (d & nom) -- le chemin du dossier + le nom du fichier = le chemin du fichier
                try
                    fich as alias -- erreur si ce fichier n'existe pas, on continue avec le prochain nom dans la liste
                    set row height of row i to h -- + 4
                    set r to make new picture at beginning of worksheet 1 of workbook 1 with properties {file name:fich, height:h, width:w, top:top of row i, left position:theLeft, placement:placement move}
                    set value of cell colI of row i to 1
                on error
                    set value of cell colI of row i to 0
                end try
            else
                set value of cell colI of row i to 0
            end if
        end repeat
        set screen updating to true
    end tell
end getFilesFromList



La macro dans thisWorkbook :

Code
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        For i = 1 To ActiveSheet.UsedRange.Rows.Count
             If Cells(i, 1).Value > 0 Then
                   Rows(i).RowHeight = 140
            Else
                   Rows(i).RowHeight = 14
            End If
        Next i
        Application.EnableEvents = True
        Application.ScreenUpdating = True
End Sub


Vous devez changer le nombre dans Cells(i, 1) par le numéro de la colonne des images. (le nombre 1 est la première colonne)
Vous devez changer le nombre dans Rows(i).RowHeight = 140 par la hauteur désirée (140 s'il y a une image, 14 s'il n'y a pas d'image).
La macro s'exécutera automatiquement lorsque vous allez trier une feuille ou lors d'un calcul, vous avez besoin d'au moins d'une cellule avec une formule, si la feuille me contient aucune formule, il suffit de mettre cette formule =COLONNE(A1) par exemple dans une cellule qui ne servira pas.


Aussi, si vous supprimer manuellement une image dans la feuille, pour que la macro continue de fonctionner correctement, il faut supprimé le nombre 1 dans la cellule derriere l'image.


Edition : si vous préférez lancer un script AppleScript manuellement au lieu d'avoir une macro, c'est possible.

Ce message a été modifié par JacqR - 5 Nov 2014, 20:57.
Go to the top of the page
 
+Quote Post
ades
posté 5 Nov 2014, 21:05
Message #16


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 845
Inscrit : 23 Nov 2002
Membre no 4 808



merci encore, je viens de rentrer et j'avoue que je n'est pas le courage de tester ce soir…
je tiendrai au courant, le script ne me pose pas de questions a priori, la macro un peu plus, mais faut que je m'y colle avant de savoir… wink.gif;-)

edit : mais, comme c'est parti, j'attends encore un peu, sans poser de nouvelle questions, et j'aurai un script qui fait tout à la fois… (fin du mode plaisanterie douteuse… surout que vu la qualité ds infos reçues je f'rais meiux de fermer ma gueule smile.gif )

Ce message a été modifié par ades - 5 Nov 2014, 21:09.


--------------------
MBP 15 unibody 2,4 Ghz , 4Go ssd 256 Go, dual boot OSX10.9.5-Linux mint
MacMini late 2012, i7 2,3Ghz, 16Go, 2 ssd 1to, OSX Sonoma 14.4 (OpencoreLegacy Patcher 1,4.3)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 23rd April 2024 - 14:53