Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1788to1792
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

Bild einfügen oder löschen

Bild einfügen oder löschen
02.11.2020 07:45:43
Peer
Hallo.
Ich möchte meinem vorhandenen Code zum Einfügen eines Bildes mit einer MsgBox erweitern, um mit einer Abfrage, ob schon ein Bild vorhanden ist, dem User die Möglichkeit zu geben, entweder das vorhandene Bild zu löschen oder das vorhandene mit dem Öffnen Dialog zu ersetzen. Wenn kein Bild vorhanden ist, dann soll ganz normal der Öffnen Dialog aufgerufen werden.
Das Bild beginnt in Zelle E45 und über den Bereich bis G49 eingefügt.
Bis jetzt habe ich folgenden VBA Code...

Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
'Öffnen Dialog zum Auswählen der Grafik
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , "Wähle deine  _
erstellte Unterschrift aus !")
'wenn keine Grafik vorhanden, dann...
If sPicture  "False" And sPicture  "Falsch" Then
ActiveSheet.Unprotect Password:=""
'Variante 1: wenn 1 Bild enthalten ist, dann dieses löschen
'Variante 2: prüfen, ob sich bereits eine Bild im Blatt befindet, dessen Zelladresse der  _
linken oberen Ecke mit D45 übereinstimmt,
'falls noch weiter Bilder eingefüget werden sollen
'        For Each shaShape In ActiveSheet.Shapes
'        If shaShape.TopLeftCell.Address = "$E$45" Then
'            shaShape.Delete
'            Exit For
'        End If
'        Next shaShape
'        Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, LinkToFile:=msoFalse,  _
_
'            SaveWithDocument:=msoTrue, Left:=Columns(5).Left, Top:=Rows(45).Top, _
'            Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
'        shaShape.Placement = xlMoveAndSize
Set pic = ActiveSheet.Shapes.AddPicture(sPicture, msoFalse, msoTrue, Cells(45, 5).Left,  _
Cells(49, 7), 50, 30)
Set pic = ActiveSheet.Pictures.Insert(sPicture)
If ActiveSheet.Pictures.Count > 0 Then
If MsgBox("Aktuelles Bild löschen?", vbCritical + vbYesNo, "Bild löschen") = vbYes  _
Then
ActiveSheet.Pictures(ActiveSheet.Pictures.Count).Delete
Exit Sub
Else
With pic
.ShapeRange.LockAspectRatio = msoTrue
.Height = Range("E45:G49").Height
.Width = Range("E45:G49").Width
.Top = Range("E45:G49").Top
.Left = Range("E45:G9").Left
.Placement = xlMoveAndSize
End With
ActiveSheet.Protect Password:=""
Set pic = Nothing
End If
End If
End If
End Sub

Kann mir jemand helfen auf die richtig Spur zu kommen? Ich habe schon einiges ausprobiert, konnte aber keine vernünftige Lösung finden. Oben genannter Code ist mein bisher letzter Versuch.
Vielen Dank für eure Hilfe.
LG
Peer

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bild einfügen oder löschen
02.11.2020 14:47:55
Peer
Hallo.
Ich war nicht untätig und suchte weiter nach einer Lösung.
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
'Öffnen Dialog zum Auswählen der Grafik
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , "Wähle deine  _
erstellte Unterschrift aus !")
'wenn keine Grafik vorhanden, dann...
If sPicture  "False" And sPicture  "Falsch" Then
ActiveSheet.Unprotect Password:=""
For Each shaShape In ActiveSheet.Shapes
If shaShape.TopLeftCell.Address = "$E$45" Then
shaShape.Delete
Exit For
End If
Next shaShape
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, LinkToFile:=msoFalse,  _
_
SaveWithDocument:=msoTrue, Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
Else
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, "Unterschrift löschen") = vbYes Then
ActiveSheet.Shapes(shaShape).Delete
End If
ActiveSheet.Protect Password:=""
End If
aber der Debugger bemängelt das Löschen von shaShape.
Wo ist/sind mein(e) Gedankenfehler?
LG
Peer
Anzeige
AW: Bild einfügen oder löschen
02.11.2020 18:53:41
Beverly
Hi Peer,
da deine Schleife über die Shapes im If-Zweig steht, ist die Variable shaShape nicht belegt - deshalb der Fehler.
Die Abfrage zum Löschen und Einfügen des Bildes musst du innerhalb der Schleife platzieren (wenn ich dein Anliegen richtig verstanden habe).
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
'Öffnen Dialog zum Auswählen der Grafik
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , "Wähle deine  _
erstellte Unterschrift aus !")
'wenn keine Grafik vorhanden, dann...
If sPicture  "False" And sPicture  "Falsch" Then
ActiveSheet.Unprotect Password:=""
For Each shaShape In ActiveSheet.Shapes
If shaShape.TopLeftCell.Address = "$E$45" Then
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, "Unterschrift löschen") =  _
vbYes Then
shaShape.Delete
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
Exit For
End If
Next shaShape
ActiveSheet.Protect Password:=""
End If
End Sub


Anzeige
AW: Bild einfügen oder löschen
02.11.2020 19:37:41
Peer
Hallo Beverly.
Vielen Dank für deine Info und Hilfe.
Du hast es (fast) richtig verstanden.
Eigentlich möchte ich die Abfrage (MsgBox) beim Aufrufen der Sub, die prüft, ob schon ein Bild vorhanden ist und dann dem User die Möglichkeit gibt, das Bild komplett zu löschen (vbYes) oder das vorhandene Bild mit dem Öffnen-Dialog ersetzt.
Ich hoffe, ich konnte es jetzt besser erläutern.
LG
Peer
AW: Bild einfügen oder löschen
02.11.2020 22:27:42
Beverly
Hi Peer,
so müsste es meiner Meinung nach funktionieren:
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
Dim blnLoeschen As Boolean
ActiveSheet.Unprotect Password:=""
If ActiveSheet.Shapes.Count > 0 Then
For Each shaShape In ActiveSheet.Shapes
If shaShape.TopLeftCell.Address = "$E$45" Then
' Abfrage ob löschen: Ja
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, "Unterschrift löschen") =  _
vbYes Then
' Bild löschen
shaShape.Delete
Else
' vorhandenes Bild muss später gelöscht werden wenn neues eingefügt wird
blnLoeschen = True
End If
Exit For
End If
Next shaShape
End If
' Bild aussuchen
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , "Wähle deine  _
erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' vorhandenes Bild löschen da es ersetzt werden soll
If blnLoeschen Then shaShape.Delete
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
ActiveSheet.Protect Password:=""
End Sub


Anzeige
AW: Bild einfügen oder löschen
03.11.2020 12:57:32
Peer
Hallo Beverly.
Auch hierfür nochmals vielen Dank für deine Hilfe.
Jetzt ist es so...
Wenn ein Bild vorhanden ist, kommt die MsgBox. Wenn ich jetzt auf Löschen Ja klicke, öffnet sich der Öffnen-Dialog trotzdem und das Bild wird erstmal nicht entfernt. Nachdem ich den Öffnen-Dialog mit "Abbrechen" schließe, wird erst jetzt das Bild gelöscht. Wenn kein Bild vorhanden ist, dann wird der Öffnen-Dialog gleich geöffnet.
Ich möchte aber gern, dass bei MsgBox auf Ja geklickt, das Bild gelöscht wird, ohne den Dialog zu öffnen.
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
Dim blnLoeschen As Boolean
ActiveSheet.Unprotect Password:=""
If ActiveSheet.Shapes.Count > 0 Then
For Each shaShape In ActiveSheet.Shapes
If shaShape.TopLeftCell.Address = "$E$45" Then
' Abfrage ob löschen: Ja
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, "Unterschrift löschen") =  _
vbYes Then
' Bild löschen
shaShape.Delete
Else
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , "Wä _
hle deine erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' vorhandenes Bild löschen da es ersetzt werden soll
If blnLoeschen Then shaShape.Delete
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
End If
Exit For
End If
End If
Next shaShape
Else:
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , "Wähle deine  _
erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' vorhandenes Bild löschen da es ersetzt werden soll
If blnLoeschen Then shaShape.Delete
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
End If
' Bild aussuchen
End If
ActiveSheet.Protect Password:=""
End Sub

Ich scheitere dabei an der End If Anweisung. Was übersehe ich?
Ich kann den Fehler nicht finden. Gibt es vielleicht eine einfachere Lösung?
Gruß
Peer
Anzeige
AW: Bild einfügen oder löschen
03.11.2020 15:47:04
Beverly
Hi Peer,
das ist nicht mein Code. Ich war davon ausgegangen, dass nach dem Löschen des Bildes trotzdem die Möglichkeit bestehen soll, ein neues einzufügen oder eben nicht. Das ist doch der logische Weg.
Wie hast du dir das denn gedacht: wenn das Bild gelöscht wird ohne ein neues einzufügen soll dann erst beim nächsten Makrodurchlauf die Möglichkeit bestehen, ein Bild einzufügen? Was macht das für einen Sinn?


AW: Bild einfügen oder löschen
03.11.2020 18:56:26
Peer
Hallo Beverly.
Das ist wirklich (nicht ganz) dein Code. Ich habe zwar deine Zeilen benutzt, aber versucht sie anderes anzuordnen, um folgendes zu bewerkstelligen.
Der User soll die Möglichkeit bekommen, das vorhandene Bild zu löschen ohne gleich ein neues einzufügen. Ebenso soll bei fehlenden Bild (auch nach dem Löschen des Bildes) über den Öffnen Dialog ein neues Bild auswählbar sein.
Also kein Bild vorhanden, ohne MsgBox der Öffnen Dialog starten; Bild vorhanden, dann die Auswahl über MsgBox, ob das vorhandene gelöscht werden soll oder nicht. Wenn ja, das Bild löschen und Sub beenden, wenn nein, Öffnen Dialog, um ein anderes Bild auszuwählen.
Das sind meine Vorstellungen. Ich habe keine Ahnung, wie man es sonst lösen könnte. Oder denke ich zu umständlich... ist nicht das erste Mal ;-)
LG
Peer
Anzeige
AW: Bild einfügen oder löschen
03.11.2020 22:44:27
Beverly
Hi Peer,
leider kenne ich deine mappe nicht, deshalb bin ich jetzt davon ausgegangen, dass außer dem 1 Bild keine weiteren Shapes im Tabellenblatt vorhanden sind:
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
Dim blnLoeschen As Boolean
'    ActiveSheet.Unprotect Password:=""
If ActiveSheet.Shapes.Count > 0 Then
For Each shaShape In ActiveSheet.Shapes
If shaShape.TopLeftCell.Address = "$E$45" Then
' Abfrage ob löschen: Ja
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, _
"Unterschrift löschen") = vbYes Then
' Bild löschen
shaShape.Delete
Else
' Bild aussuchen
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , _
"Wähle deine erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' Bild löschen
shaShape.Delete
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
End If
Exit For
End If
Next shaShape
Else
' Bild aussuchen
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , _
"Wähle deine erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
End If
'    ActiveSheet.Protect Password:=""
End Sub


Anzeige
AW: Bild einfügen oder löschen
04.11.2020 19:05:41
Peer
Hallo Beverly.
Ich habe deinen Code mit meinem Code verglichen und nachvollziehbar verstanden, was bei mir nicht passen konnte. Trotzdem habe ich deinen Code komplett genommen und eingefügt. Und er startet mit einem Fehler bei der shaShape-Variable. Das verstehe ich nun nicht mehr, denn die Variable ist deklariert und zugeordnet.
Ich hänge die sehr abgespeckte Datei an und hoffe, du kannst mir helfen, den Grund zu verstehen, Beverly.
https://www.herber.de/bbs/user/141316.xlsm
Und abermals danke ich dir im Voraus für deine Unterstützung.
LG
Peer
Anzeige
AW: Bild einfügen oder löschen
04.11.2020 20:12:32
Beverly
Hi Peer,
du hast Gültigkeitszellen in deiner Tabelle, die einen DropDown-Pfeil haben. Dieser wird ebenfalls als Shape erkannt aber besitzt die Eigenschaft TopLeftCell nicht - deshalb der Fehler. Ich habe mal versucht, das zu umgehen:
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
Dim blnVorhanden As Boolean
Dim blnLoeschen As Boolean
ActiveSheet.Unprotect Password:=""
For Each shaShape In ActiveSheet.Shapes
On Error GoTo ErrorHandler
If Not IsError(shaShape.TopLeftCell.Address) Then
If shaShape.TopLeftCell.Address = "$E$45" Then
blnVorhanden = True
Exit For
End If
End If
ErrorHandler:
On Error GoTo 0
Next shaShape
If blnVorhanden Then
' Abfrage ob löschen: Ja
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, _
"Unterschrift löschen") = vbYes Then
' Bild löschen
shaShape.Delete
Exit Sub
Else
blnLoeschen = True
End If
End If
If blnVorhanden = False Then
' Bild war vorhanden deshalb löschen
If blnLoeschen Then shaShape.Delete
' Bild aussuchen
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , _
"Wähle deine erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
End If
ActiveSheet.Protect Password:=""
End Sub


Anzeige
AW: Bild einfügen oder löschen
04.11.2020 20:37:24
Peer
Super, Beverly.
Kann man das Shape nicht direkt ansprechen? Mit einem Index habe ich es schon einmal gelesen, aber direkt mit Namen?
Ich habe im Code noch eine Zeile einfügen müssen, damit bei Auswahl mit "Nein" in der MsgBox auch der Öffnen-Dialog startet.
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
Dim blnVorhanden As Boolean
Dim blnLoeschen As Boolean
ActiveSheet.Unprotect Password:=""
For Each shaShape In ActiveSheet.Shapes
On Error GoTo ErrorHandler
If Not IsError(shaShape.TopLeftCell.Address) Then
If shaShape.TopLeftCell.Address = "$E$45" Then
blnVorhanden = True
Exit For
End If
End If
ErrorHandler:
On Error GoTo 0
Next shaShape
If blnVorhanden Then
' Abfrage ob löschen: Ja
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, _
"Unterschrift löschen") = vbYes Then
' Bild löschen
shaShape.Delete
Exit Sub
Else
blnLoeschen = True
         blnVorhanden = False
End If
End If
If blnVorhanden = False Then
' Bild war vorhanden deshalb löschen
If blnLoeschen Then shaShape.Delete
' Bild aussuchen
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , _
"Wähle deine erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
End If
End If
ActiveSheet.Protect Password:=""
End Sub
Mit besten Gruß
Peer
Anzeige
AW: Bild einfügen oder löschen
04.11.2020 22:02:25
Beverly
Hi Peer,
nun also doch anders: wenn das Bild vorhanden ist und auf Löschen "Nein" geantwortet wurde sofort den Dialog zum Einfügen eines neuen Bildes aufrufen? So hatte ich den Code doch bereits einmal und genau das wolltest du doch nicht...


AW: Bild einfügen oder löschen
05.11.2020 07:11:51
Peer
Guten Morgen, Beverly.
Da haben wir uns wahrscheinlich missverstanden. Es tut mir leid, wenn ich mich nicht richtig
ausgedrückt habe. Folgendes hatte ich es ein paar Posts vorher beschrieben.

Also kein Bild vorhanden, ohne MsgBox der Öffnen Dialog starten;
Bild vorhanden, dann die Auswahl über MsgBox,
ob das vorhandene gelöscht werden soll oder nicht.
Wenn ja, das Bild löschen und Sub beenden,
wenn nein, Öffnen Dialog, um ein anderes Bild auszuwählen.
Wie kann ich die Shapes direkt ansprechen, wenn mehrere vorhanden sind?
LG
Peer
AW: Bild einfügen oder löschen
05.11.2020 07:46:55
Beverly
Hi Peer,
ich bin jetzt von folgender Annahme ausgegangen: wenn Bild vorhanden und beim Dialog für anderes Bild keins ausgewählt wird bleibt das vorhandenes Bild in der Mappe:
Sub BildLaden()
'mit Unterstützung von Beverly aus www.herber.de
Dim sPicture As String, pic As Picture, shaShape As Shape
Dim blnVorhanden As Boolean
Dim blnLoeschen As Boolean
ActiveSheet.Unprotect Password:=""
For Each shaShape In ActiveSheet.Shapes
If shaShape.name = "Unterschrift" Then
blnVorhanden = True
Exit For
End If
Next shaShape
If blnVorhanden Then
' Abfrage ob löschen: Ja
If MsgBox("Bild löschen?", vbQuestion + vbYesNo, _
"Unterschrift löschen") = vbYes Then
' Bild löschen
shaShape.Delete
Exit Sub
Else
blnLoeschen = True
blnVorhanden = False
End If
End If
If blnVorhanden = False Then
sPicture = Application.GetOpenFilename("Grafik laden (*.png), *.png", , _
"Wähle deine erstellte Unterschrift aus !")
If sPicture  "False" And sPicture  "Falsch" Then
If blnLoeschen Then ActiveSheet.Shapes("Unterschrift").Delete
' neues Bild einfügen
Set shaShape = ActiveSheet.Shapes.AddPicture(Filename:=sPicture, _
LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=Columns(5).Left, Top:=Rows(45).Top, _
Width:=Columns("E:G").Width, Height:=Rows("45:49").Height)
shaShape.Placement = xlMoveAndSize
shaShape.name = "Unterschrift"
End If
End If
ActiveSheet.Protect Password:=""
End Sub
Shapes kann man mit dem Namen ansprechen - wenn man das zielgerichtet tun will weist man ihm beim Erstellen den Namen (im obigen Code "Unterschrift") zu.


Vielen Dank, Beverly, für deine Hilfe (owT)
05.11.2020 13:21:45
Peer
""

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige