web-dev-qa-db-fra.com

Utilisation de VBA pour insérer et conserver des images dans un fichier - Excel 2013

Je travaille sur une macro pour un de mes amis qui doit importer un ensemble d'images dans un document Excel et utiliser ce document ultérieurement sur d'autres ordinateurs. Le problème que j'ai rencontré est que lorsque vous ouvrez ce document sur un autre ordinateur, toutes les images ont disparu et vous obtenez à la place ces petits signes d'erreur indiquant que le chemin de l'image est introuvable.

J'ai développé la macro sur mon propre ordinateur sous Excel 2007 et pour moi, le code fonctionne parfaitement. Mon ami utilise Excel 2013 et, apparemment, il semble y avoir une différence majeure entre la manière dont ces deux versions traitent l’importation et la sauvegarde des images.

Dans l'ensemble, j'ai trouvé 2 façons différentes d'insérer des images. Le premier que j'ai essayé ressemblait à ceci:

Set pic = ActiveSheet.Pictures.Insert("C:\documents\somepicture.jpg")

La deuxième façon de faire ressemblait à ceci:

Set pic = Application.ActiveSheet.Shapes.AddPicture("C:\documents\somepicture.jpg", False, True, 1, 1, 1, 1)

Dans la documentation de cette deuxième approche, il est dit que le troisième paramètre (qui est vrai ici) est responsable de l'enregistrement de la photo avec le document.

Cependant, ces deux approches se ressemblent plus ou moins dans le résultat final: elles fonctionnent bien pour moi mais ne fonctionneront pas si elles sont exécutées sur mon ordinateur d'amis avec Excel 2013. Il me faut donc une solution de contournement pour les plus récents. Les versions Excel (j'ai lu quelque part que depuis Excel 2010, il existe un bogue ou quelque chose comme ça avec ces méthodes d'importation d'images).

7
FlyingM

Dans toutes mes utilisations, Ajouter une image avec Insert fait référence à un fichier sur votre disque dur. Quelle que soit la raison, si vous souhaitez que l’image soit intégrée au fichier, vous devez ajouter une forme, puis la mettre sur la forme AddPicture (comme vous utilisez), je n’ai jamais eu de problèmes avec cela.

De plus, vous donnez à l'image une hauteur et une largeur de 1 pixel. Vous ne serez presque jamais capable de voir ce vrai réglage aussi haut que ci-dessous:

Application.ActiveSheet.Shapes.AddPicture "C:\documents\somepicture.jpg", False, True, 1, 1, 100, 100

J'ai l'impression que cela fonctionnait depuis le début et que vous n'aviez jamais vu la photo car elle était trop petite.

2
user2140261

La réponse précédente a été vraiment utile! Je voulais juste ajouter la référence aux paramètres de la méthode (je pensais que la largeur et la hauteur étaient en pixels, mais en points):

https://msdn.Microsoft.com/en-us/library/Microsoft.office.interop.Excel.shapes.addpicture.ASPX

1
Alexandre Madurell

J'exécute généralement une macro qui télécharge des images d'un serveur dans des fichiers qui sont ensuite transférés aux clients n'ayant pas accès à ce serveur. Mon codage est assez basique, je vais donc simplement copier la ligne que j’utilise pour insérer la photo:

Set pic = ActiveSheet.Shapes.AddPicture(Filename:="C:\documents\somepicture.jpg", _
    linktofile:=msoFalse, savewithdocument:=msoCTrue, Left:=0, Top:=0, Width:=-1, Height:=-1)

Je connais techniquement le même code que celui que vous avez proposé, mais essayez d'utiliser msoCTrue et msoFalse. Je semble me souvenir que cela faisait partie des problèmes. Faites-moi savoir si cela fonctionne et peut-être que nous pouvons essayer autre chose. Cela fonctionne pour moi, alors nous devrions pouvoir le faire fonctionner pour vous.

1
Alan Morrison Fell

Le premier extrait fonctionne très bien, mais il ne permet pas le positionnement de l'image (par exemple, si vous avez besoin d'une image placée à une certaine distance). au dessous de.

Dim r As Range
Dim pic As Range
Set r = ActiveSheet.Range("A34:Q58")
Set pic = ActiveSheet.Shapes.AddPicture(ThisWorkbook.Path & "\FracAnalysis.png", _
linktofile:=msoFalse, savewithdocument:=msoCTrue, Left:=0, Top:=0, Width:=-1, Height:=-1)
pic.Select
Selection.ShapeRange.LockAspectRatio = msoFalse
Selection.Top = r.Top
Selection.Left = r.Left
Selection.Width = r.Width
Selection.Height = r.Height