3k Aufrufe
Gefragt in Windows 7 von
Hallo an alle,

Windows 7, Excel2013

Ich möchte von einem Ordner, in welchem sich immer nur ein Bild befindet, dieses in ein Excelblatt einfügen.
Im laufe der Arbeit wird das Bild immer wieder erneuert, und somit hat das Bild immer wieder eine andere Nummer.
Ich möchte daher beim einfügen in das Excelblatt für die Bildnummer einen Platzhalter wie *.*.jpg verwenden, da ich die momentane Nummer des Bildes nicht weiß.
Das mit dem *.* funktioniert aber nicht.

Kann mir jemand dazu auf's Pferd helfen?
Vielen Dank schon im Vorraus,

Freind


[*]
[sup]Admininfo: Führ bitte einen Thread nicht fort indem du einen Zweiten eröffnest, und vermeide Mehrfachanfragen. Die Datenbank wird es dir danken. Siehe FAQ 2 für deine nächste Anfrage.[/sup]

8 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Freind,

ich nehme mal an, du willst ein Bild per VBA einfügen.
Das mit dem Platzhalter funktioniert so nicht. Du musst den Bildnamen aus dem Verzeichnis auslesen.
Probier mal den folgenden Code:

Sub bild_einfuegen()

Dim strPfad As String
Dim strDatnam As String

'Pfad ggf. anpassen
strPfad = "C:\test\"

'prüfen, ob überhaupt ein Bild vorhanden ist - Endung ggf. anpassen
If Len(Dir(strPfad & "*.jpg")) = 0 Then
MsgBox "Kein Bild im Verzeichnis vorhanden!", 16, "Fehler"
Exit Sub
End If

'Name des 1. Bildes wird eingelesen und mit Pfad in Variable eingelesen
strDatnam = strPfad & Dir(strPfad & "*.jpg")

'Bild in Zelle B10 einfügen
With ActiveSheet
.Pictures.Insert (strDatnam)
With .Pictures(.Pictures.Count)
.Top = Range("B10").Top
.Left = Range("B10").Left
'Bild wird skaliert
.ShapeRange.ScaleWidth 0.51, msoFalse, msoScaleFromTopLeft
.ShapeRange.ScaleHeight 0.51, msoFalse, msoScaleFromTopLeft
End With
End With

End Sub


Den Pfad musst du natürlich noch auf deine Bedürfnisse anpassen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.,

wieder haben Sie mir perfekt geholfen.
Ich musste nur den Pfad, wie empfohlen anpassen und schon hat alles funktioniert.

Danke
Freind
0 Punkte
Beantwortet von flupo Profi (17.9k Punkte)
Der Code funktioniert einwandfrei, aber wenn das Bild im
dazugehörigen Ordner gelöscht ist, gibt es bei dem eingefügten Platz
des Bildes die Meldung:
Das verknüpfte Bild kann nicht angezeigt werden.
Möglicherweise wurde das bild verschoben oder gelöscht.
Stellen Sie sicher ,dass die verknüpfung auf die korrekte Datei und den
korrekten
Speicherort zeigt.

Ich brauche also keinen Pfad zum speicherort des Bildes, sondern eine
beständige Kopie in meinem Excelblatt.


Ich hab eben mal versucht, das Problem nachzustellen und dabei die
Arbeitsschritte aufgezeichnet.
Bild einfügen mit ActiveSheet.Pictures.Insert(), danach speichern und
Schließen.
Nach dem Umbenennen der Bilddatei war das Bild in der Excel-Datei
noch immer vorhanden.
Irgendwas machst du also anders. Du solltest dafür sorgen, dass das
Makro zum Einfügen des Bildes nur dann ausgeführt wird, wenn noch
keins in der Tabelle ist. Vielleicht reicht das schon.

Gruß Flupo
0 Punkte
Beantwortet von flupo Profi (17.9k Punkte)
<Klugscheißermodus an>
Am Rande:
Beim Platzhalter *.* steht der erste Stern für den Dateinamen und der
zweite für die Namenserweiterung.
*.*.jpg ist also falsch. Es muss *.jpg lauten.
<Klugscheißermodus aus> ;-)
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Freind,

bei mir (Office 2007) taucht der Fehler auch nicht auf.
Du kannst aber mal den folgenden Alternativ-Code probieren:

Sub bild_einfuegen()

Dim strPfad As String
Dim strDatnam As String

'Pfad ggf. anpassen
strPfad = "C:\test\"

'prüfen, ob überhaupt ein Bild vorhanden ist - Endung ggf. anpassen
If Len(Dir(strPfad & "*.jpg")) = 0 Then
MsgBox "Kein Bild im Verzeichnis vorhanden!", 16, "Fehler"
Exit Sub
End If

'Name des 1. Bildes wird eingelesen und mit Pfad in Variable eingelesen
strDatnam = strPfad & Dir(strPfad & "*.jpg")

'Bild in Zelle B10 einfügen und skalieren
ActiveSheet.Shapes.AddPicture strDatnam, msoFalse, msoTrue, Range("B10").Left, Range("B10").Top, 400, 320

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von
Hallo Flupo,
danke für die Aufklärung über den Platzhalter .

Hallo M.O.,
bei der ersten Lösung ist es so, dass bei leerem Bildordner, nach herunter gefahrenem PC, die Fehlermeldung anstatt des Bildes erscheint.
Bei der 2. Lösung funktioniert es, bei leerem Bildordner ist nach dem wieder hochfahren des PC das eingefügte Bild noch vorhanden. aber mit der Scalierung happert es. Ich möchte das Bild in seiner Größe anpassen, dabei aber das Seitenverhältnis beibehalten.
Was mir noch fehlt, dass nach dem abspeichern der Datei das Bild im Bildordner noch gelöscht wird.

Jetzt noch mein Code:'

'
Public Sub SchildFotoEinf()
'..............................
'Schild-Foto-Einfügen
'..............................
'
Dim strText As String 'Schildnummer
Dim i As Integer 'MsgBox
Dim c As Integer 'Schaltknopf-Abfrage von der Bildvorbereitung
Dim e As Integer 'InputBox
Dim strPfad As String 'dre Pfad zum Wegweiser-Foto-Ordner
Dim strDatnam As String 'Foto-Ordner und Foto-Nr
'
Unload UserForm8 ' Auswahl UserForm archiviertes Schild bearbeiten
'
ActiveSheet.Unprotect '("freind")
'
c = MsgBox _
("Wurde das einzufügende Schild-Foto" & Chr(13) & _
"schon in den dazugehörenden Gebietsordner" & Chr(13) & _
" - SchildFoto - " & Chr(13) & _
" eingefügt ?" & Chr(13) & _
" Es darf auch nur dieses eine Foto " & Chr(13) & _
" in dem Ordner befinden!!!", _
vbYesNo + 256 + vbQuestion, "Schild-Foto-Prüfung") ' 256 ist Schaltknopf auf No activiert
'
If c = 7 Then Exit Sub ' 7=No
'
strPfad = "F:\1SchilderVerwaltung\SchildFoto\"
'prüfen, ob überhaupt ein Bild vorhanden ist - Endung ggf. anpassen
If Len(Dir(strPfad & "*.jpg")) = 0 Then
MsgBox "Kein Bild im Verzeichnis vorhanden!", 16, "Fehler"
Exit Sub
End If
'
' Wegweiser im Archivblatt nach seiner Wegweiser-Nummer suchen
Range("P51").Select 'Zelle für den Suchbeginn
strText = InputBox("Wegweiser-End-Nummer eingeben!!!", "Im Archiv suchen")
If strText = "" Then GoTo Ende
'
X:
ActiveSheet.Unprotect '("freind")
'
On Error GoTo Demo
'
Cells.Find(What:=strText, After:=ActiveCell, _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:= _
xlByColumns, SearchDirection:=xlNext, MatchCase:=False). _
Activate
'
ActiveWindow.SmallScroll Down:=8 'geht noch 8 Zeilen nach unten, damit die ganze Archivierung zur Kontrolle zu sehen ist
'
i = MsgBox _
("Ist das die richtige Schild-Archivierung zum Foto-Einfügen ?" & Chr(13) & _
"Siehe links markierte, aktive Zelle!", _
1 + vbQuestion, "Einfügeprüfung")
'
If i = 2 Then GoTo Ende
GoTo Y ' überspringt Demo
'
Demo:
MsgBox ("Schildnummer im Archiv nicht vorhanden !!!" & Chr(13) & _
"Oder es ist kein Bild im Ordner - 4-Einfügen-Schild-Foto - " & Chr(13) & _
"vorbereitet.")
ActiveCell.Offset(-3, 0).Range("A1").Select 'geht auf den Datumseintrag
Selection.ClearContents 'Datumseintrag wieder löschen
Range("L1").Select
ActiveWindow.ScrollRow = 1
ActiveSheet.Protect '("freind")
Exit Sub
'
Y:
'........................
'Archivier-Datum einfügen
'........................
ActiveSheet.Range("L3").Copy 'kopiert das Datum Heute()
ActiveCell.Offset(-4, 52).Range("A1").Select 'Zelle für das Foto-Archivierungs-Datum
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False 'kopiert nur die Werte ein, sonst würde das Format eingefügt, also die Formel
Application.CutCopyMode = False 'beendet die KopieMarkierung = wie esc
'
ActiveCell.Offset(2, 0).Range("A1").Select 'Zelle für das Foto
'
'Name des 1. Bildes wird eingelesen und mit Pfad in Variable eingelesen
strDatnam = strPfad & Dir(strPfad & "*.jpg")
'Bild in ActiveZelle einfügen
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'DAS FUNKTIONIERT NICHT......................
'With ActiveSheet
' .Pictures.Insert (strDatnam)
' With .Pictures(.Pictures.Count)
' .Top = ActiveCell.Top
' .Left = ActiveCell.Left
' 'Bild wird skaliert
' .ShapeRange.ScaleWidth 0.51, msoFalse, msoScaleFromTopLeft
' .ShapeRange.ScaleHeight 0.51, msoFalse, msoScaleFromTopLeft
' End With
'End With
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'DAS FUNKTIONIERT....................
'Bild in (Zelle B10) ActiveCelle einfügen und skalieren
'ActiveSheet.Shapes.AddPicture strDatnam, msoFalse, msoTrue, Range("B10").Left, Range("B10").Top, 400, 320
ActiveSheet.Shapes.AddPicture strDatnam, msoFalse, msoTrue, ActiveCell.Left, ActiveCell.Top, 190, 252
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'?????????????????????????????????????????????????????????????????????????????????????????????????????????????????
' ich möchte das Seitenverhältnis des einzufügenden Bildes nicht ändern, aber ungefähr eine Breite von 7cm erhalten.
'Das bezieht sich auf meinem 20"Bildschirm, auf dem Notebook ist das ja kleiner. Wie muß ich das da in % eingeben?
'was bedeutet Add?ition? (Picture) und mso? (True)??
'dann wäre es noch gut, wenn ich am Ende den Bildordner für das nächste Bild noch leeren würde
'??????????????????????????????????????????????????????????????????????????????????????????????????????????????????
ActiveCell.Offset(-1, 0).Range("A1").Select
'
Beep
e = InputBox("Bitte noch eingeben," & Chr(13) & _
" " & Chr(13) & _
"bei mehreren Schildern, " & Chr(13) & _
"
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Freind,

ergänze den Code wie folgt:

bei der Dimensionierung der Variablen:

Dim Bildbreite As Long
Dim Bildhöhe As Long
Dim meinBild


beim Einfügen des Bildes:

'Bild in (Zelle B10) ActiveCelle einfügen und skalieren
'Name des 1. Bildes wird eingelesen und mit Pfad in Variable eingelesen
strDatnam = strpfad & Dir(strpfad & "*.jpg")

Set meinBild = LoadPicture(strDatnam)
Bildbreite = meinBild.Width
Bildhoehe = meinBild.Height

'Bild in Zelle B10 einfügen, 7 cm Breit - 1 cm = 28,35 pt - und Höhe entsprechend skaliert
ActiveSheet.Shapes.AddPicture strDatnam, msoFalse, msoTrue, Range("B10").Left, Range("B10").Top, 198.45, 198.45 * Bildhoehe / Bildbreite

und am Ende
ActiveWorkbook.Save 'alles abspeichern- sichern
Kill strDatnam


Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.,

Danke für die Hilfe, Ihre Lösung funktioniert.
...