AW: Thumbnail zur Bilder-URL anzeigen lassen
16.04.2016 13:36:57
Christian
hallo Jürgen,
du könntest zB. das jpg als Bild in einen Kommentar der Zelle einfügen.
Dabei:
musst du zunächst die Höhe und Breite des Bildes ermitteln, damit es im Kommentar nicht verzerrt wird.
Höhe und Breite erhältst du durch Analyse der Bytes oder durch Auslesen der EXIF-Daten oder ...
Code: siehe unten
Nachteil:
Das Bild wird zwar kleiner dargestellt, in der Datei wird das Bild aber in nahezu voller Größe gespeichert. Somit wächst die XLS-Datei mit jedem Bild und bei zB. 100 Bildern à 2MB biste dann bei gut 200MB. Dateien dieser Größe kann man nicht mehr vernünftig handhaben.
Alternativ-1:
temporär das jpg in ein Diagramm importieren. Dieses Diagramm als Bild exportieren und speichern. Dieses jpg mit dem so verkleinerten Bild wie oben in einen Kommentar einfügen
Alternativ-2:
alle Bilder zunächste mit externen Tools (zB. Irfanview) verkleinern und in einem entspr. Ordner speichern und wie oben in einen Kommentar einfügen
Alternativ-3:
Nutzung diverser DLL's ....
Option Explicit
Sub Bildvorschau()
' - einfügen von Hyperlink zur gewählten JPG-Datei
' - einfügen JPG-Datei als Vorschau im Kommentar
Dim wks As Worksheet
Dim rng As Range
Dim strFile As String
Dim dblWdth As Double
Dim dblHhgt As Double
Dim cmt As Comment
Dim sh As Shape
Set wks = ActiveSheet
Set rng = wks.Cells(wks.Rows.Count, 1).End(xlUp).Offset(, 6)
rng.Comment.Delete
rng.Value = ""
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.InitialFileName = "c:\tmp\"
.Filters.Add "Bilder", "*.jpg"
.FilterIndex = .Filters.Count
If .Show = -1 Then
strFile = .SelectedItems(1)
Call GetJpgSize(strFile, dblWdth, dblHhgt)
wks.Hyperlinks.Add Anchor:=rng, Address:=strFile
Set cmt = rng.AddComment
Set sh = cmt.Shape
sh.Fill.UserPicture strFile
sh.Height = 80
sh.Width = sh.Height * dblWdth / dblHhgt
End If
End With
Set sh = Nothing
Set cmt = Nothing
Set rng = Nothing
Set wks = Nothing
End Sub
Function GetJpgSize(ByVal strFile As String, dblWdth As Double, dblHght As Double) As Boolean
' in Anlehnung an 'http://www.michael-schwimmer.de/vba061.htm
Dim intFF As Integer, c As Long, lngPntr As Long
Dim x As Byte, y As Byte, bytFlag As Byte
intFF = FreeFile
lngPntr = 1
Open strFile For Binary Access Read As #intFF
Get #intFF, 2, bytFlag
Get #intFF, 5, x
Get #intFF, 6, y
c = CDbl(x) * 256 + CDbl(y)
lngPntr = 6
Do
If (bytFlag = &HC2) Or (bytFlag = &HC0) Then
Get #intFF, lngPntr + 4, x
Get #intFF, , y
dblWdth = CDbl(x) * 256 + CDbl(y)
Get #intFF, lngPntr + 2, x
Get #intFF, , y
dblHght = CDbl(x) * 256 + CDbl(y)
GetJpgSize = True
Exit Do
End If
lngPntr = lngPntr + c - 2
Get #intFF, lngPntr + 1, x
If x 255 Then Exit Do
Get #intFF, , bytFlag
lngPntr = lngPntr + 2
Get #intFF, lngPntr + 1, x
Get #intFF, , y
c = CLng(x) * 256 + CLng(y)
lngPntr = lngPntr + 2
Loop While bytFlag &HD9
Close #intFF
End Function
Grüße
Christian