Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1784to1788
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Object einbetten mit Icon

Object einbetten mit Icon
16.10.2020 12:10:05
Thomas
Hallo,
ich möchte in mein Dokument noch die Möglichkeit haben, Objekte (PDF, JPG, XLS) einzubetten. Ich habe untenstehenden Code hier gefunden und eingebaut. Soweit so gut, nur dass beim hinzufügen des dritten Dokuments das Icon über dem zweiten Icon liegt. Also schaltet die Column Anweisung nicht weiter.
Ich möchte auch das Script noch so abändern, dass nur PDF, JPG, XLS eingefügt werden können und die Row zwar im Endeffekt bei 216 beginnt, aber ggf. durch hinzufügen von Zeilen sich auch ändern kann wie z.B. 220 (falls vier Zeilen hinzugefügt werden).
Hier mein Code Versuch:

Option Explicit
Private Declare PtrSafe Function FindExecutableA Lib "shell32.dll" ( _
ByVal lpFile As String, _
ByVal lpDirectory As String, _
ByVal lpResult As String) As Long
Private Declare PtrSafe Function LockWindowUpdate Lib "user32.dll" ( _
ByVal hwndLock As Long) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As Long
Private Const MAX_PATH As Long = 260&
Public Sub InsertFileObjectNEU()
Dim objOLEObject As OLEObject
Dim lngReturn As Long
Dim strPath As String, strFilename As String, strDisplayName As String
Dim strTemp As String * MAX_PATH, strExecutable As String
Dim vntItem As Variant
Dim lngRow As Long, lngColumn As Long
lngRow = 4
lngColumn = 2
With Application.FileDialog(msoFileDialogFilePicker)
.Filters.Clear
.Title = "Add General Document"
.AllowMultiSelect = False
If .Show Then
For Each vntItem In .SelectedItems
If (IsEmpty(ActiveSheet.Cells(lngRow, lngColumn)) = False) Then
lngColumn = lngColumn + 2
End If
If lngColumn Mod 9 = 0 Then
lngRow = lngRow + 5
lngColumn = 2
End If
strPath = .SelectedItems(1)
strFilename = Mid$(strPath, InStrRev(strPath, "\") + 1)
strFilename = Left$(strFilename, InStrRev(strFilename, ".") - 1)
lngReturn = FindExecutableA(strPath, vbNullString, strTemp)
If lngReturn > 32 Then
strExecutable = Left$(strTemp, InStr(strTemp & vbNullChar, vbNullChar) - 1)
Else
Call MsgBox("Kein Programm zum Öffnen gefunden.", vbCritical, "Programmabbruch") _
_
Exit Sub
End If
strDisplayName = InputBox("Bitte Anzeigetext eingeben.", "Einagbe", strFilename)
If StrPtr(strDisplayName)  0 Then
Call LockWindowUpdate(GetDesktopWindow)
Set objOLEObject = ActiveSheet.OLEObjects.Add(Filename:=strPath, _
Link:=False, DisplayAsIcon:=True, IconIndex:=0, _
IconFileName:=strExecutable, IconLabel:=strDisplayName)
objOLEObject.ShapeRange.AlternativeText = strFilename
With objOLEObject
.Left = Columns(lngColumn).Left
.Top = Rows(lngRow).Top
End With
ActiveSheet.Cells(lngRow, lngColumn) = lngColumn
lngColumn = lngColumn + 2
Call LockWindowUpdate(0&)
Set objOLEObject = Nothing
End If
Next
End If
End With
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Object einbetten mit Icon
16.10.2020 15:18:16
volti
Hallo Thomas,
schau mal, ob die u.a. Erweiterung schon Deinem Wunsche entspricht. Anfangs-Zeile/Spalte und Anzahl der Spalten kannst im Kopf vorgeben.

Code:
[Cc][+][-]
 
Option Explicit Private Declare PtrSafe Function FindExecutableA Lib "shell32.dll" ( _ ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As String) As Long Private Declare PtrSafe Function LockWindowUpdate Lib "user32.dll" ( _ ByVal hwndLock As Long) As Long Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As Long Private Const MAX_PATH As Long = 260& Public Sub InsertFileObjectNEU() Dim objOLEObject As OLEObject Dim lngReturn As Long Dim strPath As String, strFilename As String, strDisplayName As String Dim strTemp As String * MAX_PATH, strExecutable As String Dim vntItem As Variant Dim lngRow As Long, lngColumn As Long Dim lngMaxColumn As Long, lngMaxRow As Long Dim lngRowBegin As Long, lngColumnBegin As Long Dim bCheck As Boolean lngRowBegin = 4 lngColumnBegin = 2 lngMaxColumn = 10 lngMaxRow = 20 With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Title = "Add General Document" .AllowMultiSelect = False If .Show Then For Each vntItem In .SelectedItems bCheck = False For lngRow = lngRowBegin To lngMaxRow Step 5 For lngColumn = lngColumnBegin To lngMaxColumn Step 2 If (IsEmpty(ActiveSheet.Cells(lngRow, lngColumn)) = True) Then bCheck = True: Exit For End If Next lngColumn If bCheck = True Then Exit For Next lngRow strPath = .SelectedItems(1) If InStr(".pdf .xls xlsm xlsx xlsb .jpg", LCase(Right(strPath, 4))) > 0 Then strFilename = Mid$(strPath, InStrRev(strPath, "&bsol;") + 1) strFilename = Left$(strFilename, InStrRev(strFilename, ".") - 1) lngReturn = FindExecutableA(strPath, vbNullString, strTemp) If lngReturn > 32 Then strExecutable = Left$(strTemp, InStr(strTemp & vbNullChar, vbNullChar) - 1) Else Call MsgBox("Kein Programm zum Öffnen gefunden.", vbCritical, "Programmabbruch") Exit Sub End If strDisplayName = InputBox("Bitte Anzeigetext eingeben.", "Einagbe", strFilename) If StrPtr(strDisplayName) <> 0 Then Call LockWindowUpdate(GetDesktopWindow) Set objOLEObject = ActiveSheet.OLEObjects.Add(Filename:=strPath, _ Link:=False, DisplayAsIcon:=True, IconIndex:=0, _ IconFileName:=strExecutable, IconLabel:=strDisplayName) objOLEObject.ShapeRange.AlternativeText = strFilename With objOLEObject .Left = Columns(lngColumn).Left .Top = Rows(lngRow).Top End With ActiveSheet.Cells(lngRow, lngColumn) = lngColumn Call LockWindowUpdate(0&) Set objOLEObject = Nothing End If Else Call MsgBox("Falsches Dateiformat!", vbCritical, "Programmabbruch") Exit Sub End If Next End If End With End Sub
 
____________________
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: Object einbetten mit Icon
16.10.2020 16:23:17
Thomas
funktioniert soweit. Die Frage ist, ob ich denn die Zelle unterhalb des Bilds mit lngColumn füllen muß. Danke dir. hat mich schon weiter gebracht.
AW: Object einbetten mit Icon
16.10.2020 16:33:48
volti
Hallo Thomas,
in der Vorlage war das so. Hiermit wird abgefragt, ob ein potenzielles Feld schon belegt ist und dort kein Bild hin soll.
Da muss zwar nicht die Nummer rein, aber irgendwas, damit erkannt werden kann, ob das Feld leer ist.
Alternative wäre (wenn es total stören sollte) das Durchgehen aller vorhandener Objekte und die Ermittlung des jeweiligen Feldes über linke/obere Eckposition des Objekts und dann die Ermittlung des ersten freien Feldes.
Machbar, aber deutlich aufwändiger....
viele Grüße
Karl-Heinz
Anzeige
AW: Object einbetten mit Icon
16.10.2020 17:00:36
volti
Hallo Thomas,
hab's jetzt doch mal ohne Nummern gemacht....

Code:
[Cc][+][-]
 
Option Explicit Private Declare PtrSafe Function FindExecutableA Lib "shell32.dll" ( _ ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As String) As Long Private Declare PtrSafe Function LockWindowUpdate Lib "user32.dll" ( _ ByVal hwndLock As Long) As Long Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As Long Private Const MAX_PATH As Long = 260& Public Sub InsertFileObjectNEU() Dim objOLEObject As OLEObject Dim lngReturn As Long Dim strPath As String, strFilename As String, strDisplayName As String Dim strTemp As String * MAX_PATH, strExecutable As String Dim vntItem As Variant Dim lngRow As Long, lngColumn As Long Dim lngMaxColumn As Long, lngMaxRow As Long Dim lngRowBegin As Long, lngColumnBegin As Long Dim bCheck As Boolean, bBesetzt As Boolean Dim oShape As Object, AC As Range lngRowBegin = 4 lngColumnBegin = 2 lngMaxColumn = 10 lngMaxRow = 20 With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Title = "Add General Document" .AllowMultiSelect = False If .Show Then For Each vntItem In .SelectedItems bCheck = False For lngRow = lngRowBegin To lngMaxRow Step 5 For lngColumn = lngColumnBegin To lngMaxColumn Step 2 Set AC = ActiveSheet.Cells(lngRow, lngColumn) bBesetzt = False For Each oShape In ActiveSheet.Shapes With oShape If .Top > AC.Top - 2 And .Left > AC.Left - 2 _ And .Top < AC.Top + 5 And .Left < AC.Left + 5 Then bBesetzt = True: Exit For End If End With Next oShape If bBesetzt = False Then bCheck = True: Exit For Next lngColumn If bCheck = True Then Exit For Next lngRow strPath = .SelectedItems(1) If InStr(".pdf .xls xlsm xlsx xlsb .jpg", LCase(Right(strPath, 4))) > 0 Then strFilename = Mid$(strPath, InStrRev(strPath, "&bsol;") + 1) strFilename = Left$(strFilename, InStrRev(strFilename, ".") - 1) lngReturn = FindExecutableA(strPath, vbNullString, strTemp) If lngReturn > 32 Then strExecutable = Left$(strTemp, InStr(strTemp & vbNullChar, vbNullChar) - 1) Else Call MsgBox("Kein Programm zum Öffnen gefunden.", vbCritical, "Programmabbruch") Exit Sub End If strDisplayName = InputBox("Bitte Anzeigetext eingeben.", "Einagbe", strFilename) If StrPtr(strDisplayName) <> 0 Then Call LockWindowUpdate(GetDesktopWindow) Set objOLEObject = ActiveSheet.OLEObjects.Add(Filename:=strPath, _ Link:=False, DisplayAsIcon:=True, IconIndex:=0, _ IconFileName:=strExecutable, IconLabel:=strDisplayName) objOLEObject.ShapeRange.AlternativeText = strFilename With objOLEObject .Left = Columns(lngColumn).Left .Top = Rows(lngRow).Top End With Call LockWindowUpdate(0&) Set objOLEObject = Nothing End If Else Call MsgBox("Falsches Dateiformat!", vbCritical, "Programmabbruch") Exit Sub End If Next End If End With End Sub
 
____________________
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: Object einbetten mit Icon
16.10.2020 17:47:03
Thomas
zu spät gesehen... funktioniert bestens. Habe es noch mit .locked=False erweitert um es wieder zu löschen, da mein Worksheet protected ist.
AW: Object einbetten mit Icon
16.10.2020 17:41:54
Thomas
genau, so habe ich das auch verstanden. Ist es denn möglich, beim Entfernen (durch Del taste) auch die Zelle zu leeren?

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige