|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Chargé d'affaire Inscription : novembre 2011 Messages : 6 ![]() |
Bonjour/bonsoir
J'ai beau chercher et retourner le web dans tous les sens, je ne trouve pas de réponse à ce simple problème. J'en déduis que c'est probablement impossible, mais en désespoir de cause, je pose la question - sait-on jamais. J'utilise professionnellement une macro vba qui a tendance à être gourmande en temps, sans entrer dans les détails disons que j'ai pu l'optimiser pour qu'au moins il soit possible de travailler à côté sur d'autres logiciels qu'Excel sans être trop limité - notamment en contournant toutes les parties utilisant le copier-coller, sauf une : à un moment régulier de la macro, une image est copiée d'une page source vers une page nouvellement créée. Et c'est là que la bât blesse, car il me semble impossible de trouver la moindre information sur une possibilité de copier une image sans passer par le clipboard, ni une lecture depuis un fichier image local (la macro étant déjà assez lente, si en plus elle doit régulièrement charger une image depuis le disque, toute mon optimisation n'aura servi à rien). Je comprends d'autant moins cette impossibilité que s'il est possible d'enregistrer l'image sur le clipboard puis de la recopier par la suite, cela signifie qu'un objet image est capable de s'enregistrer en mémoire localement. Alors voilà, j'aimerais savoir si quelqu'un a déjà eu à résoudre ce type de souci, peut-être en passant par un flux (en prog "traditionnelle" je serais passé par un objet de type memorystream ou assimilé, mais j'avoue que sur VBA mes connaissances sont encore limitées quant à l'existence et l'usage de ce type de solution) ? De toute façon c'est ça ou rien, alors si quelqu'un a une idée, je suis preneur. Et peut-être qu'un jour un autre "bricoleur" perdu tombera sur ce sujet en cherchant à résoudre le même problème... Edit : je précise que pour le moment la macro tourne sur 97, un portage vers 2010 étant en prévision (mais ceci est une autre histoire). |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Dans quoi est contenue ton image exactement? Directement en image de fond ou dans une zone image? ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Chargé d'affaire Inscription : novembre 2011 Messages : 6 ![]() |
Je n'ai jamais eu besoin de mettre une image en fond, donc ça me semblait évident d'où cet oubli de précision, mais, oui, c'est une image dans un conteneur image, telle qu'on l'obtient en utilisant l'insertion depuis un fichier.
|
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Je n'aime pas trop les solution avec des select mais dans ce cas, je n'en ai pas trouvé d'autre. Je n'arrive pas à avoir accès à la propriété Picture du shape. Essai de cette facon, en activant la feuille de destination puis la cellule de destination. Code :
++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() |
bonjour
a partir du moment ou tu fait "Image11.Copy" tu te sert du clipboard comme te l'a dit qwazerty les "selects et activate" rendent très longues et gourmandes les macros il vaut mieux préciser le nom du sheets de depart ou se trouve ton image , et le sheets de destination pour le collage de ton image essaie ça : 'un exemple qui ajoute un sheets et colle l'image du sheets 1 dans le nouveau Code :
au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
||
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Oui en effet j'avais éludé le problème du Clipboard... Pour ce qui est des select, je les ai mis pour que l'image soit placée directement au bon endroit sur la feuille, mais ton écriture est préférable en effet. Et d'un autre coté pourquoi ne pas ensuite modifier les propriétés top et left de l'image, ce qui supprime les Select "indésirables" [Edit] Pour l'utilisation du Add, je préfère ce type d'écriture Code :
[/Edit] ++ Qwaz Une autre solution serait d'utiliser des composants images (tu les trouveras dans l'onglet developper). Sur ta feuille d'origine tu places un composant image en lieu est place de ton image insérée (Shape). Ensuite dans ton code il te suffit de rajouter dynamiquement( une image sur ta nouvelle feuille, puis de "copier" le contenu de ton image source vers ton image destination en utilisant la propriété Picture des deux images... et dans ce cas, plus de clipboard ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() |
bonjour qwazerty
tu dis : Citation:
maintenant si son image n'est pas dans le classeur mais dans un dossier effectivement le picture sur chaque image donnera le même résultât mais ça oblige a avoir le fichier image a porté en même tant que le classeur au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé
![]() |
en fait ce qui se passe dans ma macro
c'est que forcement le sheets de destination est activé donc un select est superflu ensuite ton ecriture me seduit aussi alors : Code :
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
||
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
en fait non, pas besoin du clip bord, un fois ton image de destintion mise en place dynamiquement tu fais Code :
Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() |
bonjour misterlo et qwazerty
pour qwazerty: quel est le conteneur de l'image n°2? au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Chargé d'affaire Inscription : novembre 2011 Messages : 6 ![]() |
Bonjour.
Tout d'abord, merci à tous deux de vos réponses, et de vous être penché sur mon "petit" problème. L'aspect important est réellement de ne pas utiliser le clipboard, ce qui exclue les ".Copy", ".CopyImage" et les ".Paste" en tous genres et de quelque manière que ce soit. Parce que sinon, je pense que le plus simple et efficace dans mon cas, où la position par défaut en haut à gauche d'une nouvelle image est justement la bonne (c'est sûr que ça aurait été une autre paire de manches si j'avais en plus eu besoin de copier sa position), c'est celle que j'ai adopté pour l'instant, à savoir : identifier le premier Shape qui soit une image sur ma page source, le repérer par un set sur une variable (en l'occurrence sans chercher très loin je l'ai nommée srcImage), puis ensuite, dans la boucle principale qui doit recopier cette image sur chaque nouvelle page, enchaîner un setImage.Copy, et un .Paste. Je précise qu'avant de venir ennuyer le monde avec mes soucis j'ai effectué quelques tests et recherches par moi-même - j'estime qu'avant de réclamer de l'aide il faut soi-même faire l'effort de chercher. Ainsi, j'ai pu, entre autres, créer un nouveau Shape de type image sur mes pages, sans toutefois parvenir à lui faire charger son image depuis un autre composant image. En l'absence de source image sur disque valide, il affiche un type différent (une boîte cylindrique 3D si je me souviens bien de ce que j'ai vu). Quant au .Picture, VBA ne veut pas en entendre parler et il m'envoie suer en me disant que cette propriété n'existe pas. J'ai aussi tenté avec .Fill.UserPicture, mais là encore cette fonction n'accepte qu'un chemin vers un fichier image sur disque. C'est sûr que ça aurait été plus simple si l'objet Shape était doté, tout comme l'objet Range, d'une fonction Copy acceptant en option un objet de même type en paramètre... Oui, j'ai essayé, bien que je savais que c'était peine perdue (trop beau pour être vrai Edit : Je me rends compte qu'en décrivant un peu plus le contexte ça permettrait de mieux situer le besoin. Cette macro est contenue dans un classeur de travail qui lui est spécifique. Elle ouvre des fichiers texte (préalablement définis dans une liste) comme nouveaux classeurs, leur applique une mise en forme selon un fichier d'instruction - mise en forme qui peut inclure l'ajout d'un logo en haut à gauche, la source de mon problème ici - puis les enregistre en format Excel sous un nouveau nom (donc en gros elle convertit des .txt en .xls selon une procédure définie). Si un logo est à ajouter, la macro le trouve sur une feuille dédiée dans son propre classeur de travail. Chaque fichier est traité séparément (la macro traite le premier, le ferme, traite le second, le ferme, etc.) Généralement, le nombre de fichiers à convertir est de l'ordre d'une cinquantaine à une centaine. Mais dans certains cas particuliers, on peut atteindre le millier, voire même plus, ce qui prend un temps fou. Temps pendant lequel aucun travail n'est possible : juste de la consultation, mais pas de programmation ou autre travail impliquant de manipuler du texte, puisque le copié-collé est banni. Je ne suis pas l'auteur initial de cette macro, mais en tant qu'utilisateur éclairé j'ai finalement décidé de l'optimiser et d'en améliorer "l'ergonomie". En remplaçant tous les "Select" et autres "Activate", sans compter le très gourmand "Copy/Paste", j'ai pu obtenir un gain jusqu'à 2/3 de temps en moins au total - ce qui est déjà vraiment très bien. Mais si en plus je pouvais m'affranchir totalement du copié-collé... |
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Je vois que mes explications n'ont pas suffit Voila un exemple, joint à cette discussion, de ce dont je parlais plus haut ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
10
|
|
|
#13 |
|
Expert Confirmé
![]() |
Re
bonjour qwazerty je comprend mieux d'où ma question quel type de conteneur dans ma précédente réponse on est bien avec un controls activex et non pas un e image du menu insertion je commençais a devenir zinzin au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() |
SalutPatrick
Oui, j'ai débuter sur VisualBasic, donc j'ai toujours gardé l'habitude de nommer un composant "activeX image" sous l'intitulé "composant image", c'est pour cela que j'avais préciser ou le trouver. Citation:
++ Bonne soirée Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() |
Re
oui mais beaucoup plus lourd le fichier néanmoins au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Visiblement on parle ici d'un logo sur une feuille, pas de 50 images sur 50 feuilles. Je pense donc que l'utilisation d'un composant image est adapté au vu des conditions. les fichiers feront peut-être 50Ko de plus mais au final la macro sera moins génératrice de perturbations puisque n'utilisant pas le ClipBoard. Mais bon la validité de cette solution appartient à MisterLo je pense, je ne peux pas être juge et partie :p ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Chargé d'affaire Inscription : novembre 2011 Messages : 6 ![]() |
Ah ouais, un objet Ole, carrément.
Pour le poids, je verrais à combien s'élève le "gain", mais pour une image en dessous de 100 de côté (affichée à mi-taille pour des raisons de rendu) je doute que ce soit énorme. Par contre, je n'ai pas encore eu l'occasion d'adapter mon code, mais je remarque qu'un objet Ole, une fois posé, je ne peux ni le déplacer, ni le redimensionner, ni faire quoi que ce soit à l'édition manuelle, en fait. N'étant pas du tout habitué à l'usage de ce type de solution, peut-être que je passe à côté de quelque-chose ? Quoi qu'il en soit, je ferrai le test pour voir si cette solution convient à mon problème, mais, du coup, ça veut bien dire qu'une image au format de base sous Excel (en conteneur shape, donc) ne peut absolument pas être copiée sans passer par le clipboard. Passez moi l'expression, mais je trouve ça fort de café, quand-même. (par contre et pour note, si, précisément, on parle bien de "50 images sur 50 feuilles", car tous ces fichiers transformés sont ensuite réunis en un seul par une autre macro, et au final je me retrouve avec quelques classeurs qui réunissent une centaine de pages chacun... mais je comparerais les tailles, de toute façon, comme ça on verra bien si ça reste raisonnable ou pas - c'est sûr que si mes fichiers passent de quelques Mo à quelques dizaines de Mo, ça va pas le faire |
|
|
00
|
|
|
#18 | ||||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Code :
Citation:
Citation:
.++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||||
|
|
10
|
|
|
#19 |
|
Invité de passage
![]() Chargé d'affaire Inscription : novembre 2011 Messages : 6 ![]() |
Ce que je voulais dire, c'est qu'en ouvrant le fichier d'exemple que tu as donné, j'ai tenté de "toucher" à l'image dans Excel, mais elle ne prend pas le clic, ni même le focus. Je ne peux donc ni la redimensionner, ni la déplacer, ni quoi que ce soit, c'est un peu comme si j'avais une fenêtre sans bords en always-on-top.
C'est pour ça que je suppose que c'est un PEBKAC, en d'autres termes que ma méconnaissance de l'usage des OLE est la raison pour laquelle je ne peux rien en faire. Je sais parfaitement que de réduire la taille d'affichage ne réduit pas le poids, je me suis mal exprimé. En fait j'ai essayé de réduire l'image à la taille que je souhaitais (merci GIMP), mais à l'affichage je me suis aperçu que même en utilisant la meilleur extrapolation dont je dispose le rendu était plus "flou" que la version réduite par Excel (si, si !). J'imagine que c'est un bête souci de fonctions utilisées mais j'avais un petit peu d'autres soucis plus importants à régler que de me perdre dans des recherches poussées, aussi comme j'ai vu qu'une image de taille double de l'affichage final suffisait à me donner ce que je voulais, je me suis arrêté là sans chercher plus loin. Pour l'impossibilité, en même temps il n'y a pas 36 manières de copier une image par programmation, et sans avoir accès au contenu image d'un Shape je ne vois pas vraiment comment faire autrement, et ce quelle que soit la manière envisagée. Edit : En fait, je viens de trouver pour le OLE, c'était bien un PEBKAC. Il suffit de se mettre en mode création et on a accès aux paramètres sans souci. |
|
|
00
|
|
|
#20 |
|
Invité de passage
![]() Chargé d'affaire Inscription : novembre 2011 Messages : 6 ![]() |
Verdict : non seulement ça marche exactement comme je le souhaitais, mais pour la modique "somme" de 5 ko supplémentaires par fiche, autant dire peanuts.
![]() Par contre, là où l'insertion directe (mode shape) était capable de lire du png, il semble que l'insertion OLE ne connaisse pas ce format - à moins de devoir passer par un type OLE différent ? - mais enfin ce n'est pas très grave dans la configuration actuelle (bien entendu, la comparaison citée ci-dessus a été effectuée entre l'ancienne et la nouvelle version avec le même type d'image). Je considère donc cette problématique comme globalement résolue, mais si quelqu'un sait (ou trouve) comment copier-coller une image shape sans passer par le clipboard, qu'il ou elle n'hésite pas à expliquer le mode opératoire ici, ne serait-ce que par curiosité on aimerait savoir. Edit : par contre, si en bonus quelqu'un peut me dire comment empêcher une macro de s'arrêter si on utilise [shift] ailleurs, je suis preneur... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com