webentwicklung-frage-antwort-db.com.de

Verwenden von VBA zum Einfügen und Speichern von Bildern in einer Datei - Excel 2013

Ich arbeite an einem Makro für einen Freund von mir, der eine Reihe von Bildern in ein Excel-Dokument importieren und dieses Dokument später auf anderen Computern verwenden muss. Das Problem, auf das ich gestoßen bin, ist, dass beim Öffnen dieses Dokuments auf einem anderen Computer alle Bilder verschwunden sind und stattdessen diese kleinen Fehlerzeichen angezeigt werden, die darauf hinweisen, dass der Bildpfad nicht gefunden werden konnte.

Ich habe das Makro auf meinem eigenen Computer entwickelt, auf dem ich Excel 2007 habe, und für mich funktioniert der Code einwandfrei. Mein Freund verwendet Excel 2013 und anscheinend scheint es einen großen Unterschied zu geben, wie diese beiden Versionen mit dem Importieren und Speichern von Bildern umgehen.

Insgesamt habe ich 2 verschiedene Möglichkeiten zum Einfügen von Bildern gefunden. Das erste, das ich ausprobierte, war ungefähr so:

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

Die zweite Möglichkeit sah so aus:

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

In der Dokumentation für diesen zweiten Ansatz heißt es, dass der dritte Parameter (der hier wahr ist) für das Speichern des Bildes mit dem Dokument verantwortlich ist.

Beide Ansätze sehen jedoch im Endergebnis mehr oder weniger gleich aus: Sie funktionieren gut für mich, funktionieren aber nicht, wenn sie auf dem PC meines Freundes mit Excel 2013 ausgeführt werden. Was ich also brauche, ist ein Workaround für das neuere Excel-Versionen (Ich habe irgendwo gelesen, dass es ab Excel 2010 einen Fehler oder ähnliches bei diesen Bildimportmethoden gibt).

7
FlyingM

In all meinen Anwendungen verweist das Hinzufügen eines Bildes mit Insert auf eine Datei auf Ihrer Festplatte. Wenn das Bild in die Datei eingebettet werden soll, müssen Sie eine Form hinzufügen und das Bild dann mit der auf die Form setzen AddPicture (wie du es verwendest), ich hatte noch nie Probleme damit.

Außerdem geben Sie dem Bild eine Höhe und Breite von 1 Pixel. Sie werden diese wahre Einstellung so hoch wie unten kaum sehen können:

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

Ich habe das Gefühl, es hat die ganze Zeit funktioniert und Sie haben das Bild einfach nie gesehen, weil es zu klein war.

2
user2140261

Die vorherige Antwort war wirklich nützlich! Ich wollte nur den Verweis auf die Methodenparameter hinzufügen (ich dachte, die Breite und Höhe sind in Pixeln angegeben, es stellt sich heraus, dass sie in Punkten angegeben sind):

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

1

Normalerweise führe ich ein Makro aus, das Bilder von einem Server in Dateien herunterlädt, die dann an Clients weitergeleitet werden, die keinen Zugriff auf diesen Server haben. Meine Codierung ist ziemlich einfach, deshalb kopiere ich einfach die bestimmte Zeile, die ich zum Einfügen des Bildes verwende:

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

Ich kenne den technisch gleichen Code wie den, den Sie vorgeschlagen haben, aber versuchen Sie es mit msoCTrue und msoFalse. Ich scheine mich daran zu erinnern, dass dies Teil der Probleme ist. Lassen Sie mich wissen, ob es funktioniert und vielleicht können wir etwas anderes ausprobieren. Es funktioniert für mich, also sollten wir es für Sie zum Laufen bringen können.

1

Das erste Snippet funktioniert einwandfrei, erlaubt jedoch keine Bildpositionierung (dh, wenn Sie ein Bild in einem bestimmten Bereich benötigen). Daher habe ich auf der Grundlage der zweiten Lösung, wie in der Abbildung gezeigt, eine Funktion bereitgestellt, die die Positionierung unterstützt unten.

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