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

VBA Bild mit Zellbezug einfügen nach Bedingung

VBA Bild mit Zellbezug einfügen nach Bedingung
14.11.2023 07:43:18
Nadine
Hallo,
ich möchte gerne bestimmte Bilder aus dem Pfad, die nach Erfüllung der Bedingung genau in diese eine Zelle eingefügt werden. Bedingte Formatierung ist mir bekannt, ist aber leider nicht farblich von dem Auftraggeber gewünscht.
Weiterhin wird die Tabelle manuell befüllt und die verformelten Ergebnisse verändern sich somit. Bedeutet, das Bild muss sich bei jeder Änderung (mit Bezug auf das Ergebnis) mit verändern.
mein bisheriger VBA Code klappt, aber die Bilder werden irgendwohin eingefügt und sind nicht auf die Zelle oder sogar auf die Zeile bezogen.
Sub grafik_einfügen()
For Each Zelle In Range("B2:B6")
If Zelle.Value = 1 Then
ActiveSheet.Pictures.Insert("I:\Pfad\Ausrufezeichen.png").Select
ElseIf Zelle.Value = 2 Then
ActiveSheet.Pictures.Insert("I:\Pfad\Haken.png").Select
Else
ActiveSheet.Pictures.Insert("I:\Pfad\Kreuz.png").Select
End If
Next Zelle
End Sub

Die Bilder sind in der Beispieldatei mit drin.

Vielen Dank.

https://www.herber.de/bbs/user/164251.xlsm

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Bild mit Zellbezug einfügen nach Bedingung +
14.11.2023 08:56:06
MCO
Moin Nadine!

Ich hab mir mal erlaubt, deinen code etwas anzupassen. If ,then, else habe ich durch Select Case ersetzt. Das lässt mehr möglichkeiten und ist übersichtlicher.
Außerdem hab ich den Pfad vordefiniert und nur die Grafik zur Auswahl gestellt. Position und einfügen wird wieder allgemein gemacht.

Als Bonbon hab ich noch eine Subroutine dazugepackt, die deine Grafik auf gewünschte Größe ändert. Voreingestellt hab ich jetzt mal die Zeilenhöhe.
Schau es dir mal an.
Sub grafik_einfügen()


Dim pfad As String
Dim Symb As String
Dim pic As Object

pfad = "I:\Pfad\" 'Deinen Pfad eintragen

For Each zelle In Range("B2:B6")
Select Case zelle.Value 'konkrete Auswahl
Case 1
Symb = "Ausrufezeichen.png"
Case 2
Symb = "Haken.png"
Case 3
Symb = "Kreuz.png"
Case Else
MsgBox "Nix vorgesehen"
Exit Sub
End Select

zelle.Offset(0, 1).Select 'Zelle wählen (hat bei dir gefehlt)
ActiveSheet.Pictures.Insert pfad & Symb 'einfügen gewünschtes Bild
Set pic = ActiveSheet.Shapes(Shapes.Count) 'Bild als Objekt setzen
Pic_resize pic, 1, Rows(zelle.Row).RowHeight, , zelle.Offset(0, 1).Left + 30 'Größe und Position festlegen durch Subroutine
Next zelle

End Sub

Sub Pic_resize(pic As Object, Seitenverh_sperr As Boolean, Optional höhe As Long, Optional Breite As Long, Optional Pos_li As Long)


With pic
.LockAspectRatio = Seitenverh_sperr
If höhe > 0 Then .Height = höhe
If Breite > 0 Then .Width = Breite
.Left = Pos_li
End With

End Sub

https://www.herber.de/bbs/user/164254.xlsm

Gruß, MCO
Anzeige
AW: VBA Bild mit Zellbezug einfügen nach Bedingung
14.11.2023 10:00:23
Nadine
Hallo nochmal,

ich stell mich auch noch blöd an und möchte gerne noch in dem Code, dass das Bild auf ein anderes Tabellenblatt eingefügt wird und nicht in der Datentabelle.
Leider weiß ich nicht, welche Abfrage ich noch in den bereits genannten Code von MCO einbauen kann, damit der wechselt und einfügt.

Danke euch.
AW: VBA Bild mit Zellbezug einfügen nach Bedingung
14.11.2023 13:05:46
MCO
Hallo Nadine!

Dieser Code
        zelle.Offset(0, 1).Select 'Zelle wählen (hat bei dir gefehlt)

ActiveSheet.Pictures.Insert pfad & Symb 'einfügen gewünschtes Bild

bestimmt die Position der Grafik aufgrund der angewählten Zelle.
Wenn du eine andere Zelle wählst, dann wird die Grafik woanders eingefügt .

Beispiel:
sheets("dein Sheet").activate

Range("e59").select


Gruß, MCO
Anzeige
AW: VBA Bild mit Zellbezug einfügen nach Bedingung
14.11.2023 13:28:03
Nadine
Hallo MCO,

hier noch meine bisherige Testdatei und dem "neuen" Code.
Der leider nicht so klappt. Wahrscheinlich zu viel rumgespielt und verändert :-D

https://www.herber.de/bbs/user/164258.xlsm

Danke sehr
AW: VBA Bild mit Zellbezug einfügen nach Bedingung
15.11.2023 07:31:42
MCO
Hallo Nadine!

  • Das Change-Ereignis gehört in das Sheet, in dem tatsächlich was geändert wird: Tabelle2
  • Das Makro "Grafik_einfügen" gehört in ein allgemeines Modul, damit darauf problemlos zugegriffen werden kann.


  • Zusatz: Einfügen haben wir ja schon voll drauf. Aber da du die Werte ja ständig änderst, müssen die Bilder nicht nur ZUGEFÜGT werden, sondern vorher alle GELÖSCHT werden.
    Außerdem habe ich das SELECT für das Sheet vermieden: du bleibst auf dem Eingabesheet.
    Als weitere Option für das Anpassen der Grafik hab ich Pos_vert(ical) und Pos_hori(zontal) in die Subroutine geschrieben. Damit kann die Position, Größe und Verhalten jetzt komplett festgelegt werden.

    In Summe sieht es jetzt so aus:
    Sub grafik_einfügen()
    

    Dim pfad As String
    Dim Symb As String
    Dim ws As Worksheet
    Dim pic As Object

    Set ws = Sheets("Dashboard")
    pfad = "I:\Pfad\" 'Deinen Pfad eintragen

    For shp = ws.Shapes.Count To 1 Step -1
    ws.Shapes(shp).Delete
    Next shp

    For Each zelle In Worksheets("Tabelle1").Range("B2:B6")
    Select Case zelle.Value 'konkrete Auswahl
    Case 1
    Symb = "Ausrufezeichen.png"
    Case 2
    Symb = "Haken.png"
    Case 3
    Symb = "Kreuz.png"
    Case Else
    MsgBox "Nix vorgesehen"
    Exit Sub
    End Select

    ws.Pictures.Insert pfad & Symb 'einfügen gewünschtes Bild

    Set pic = ws.Shapes(ws.Shapes.Count) 'Bild als Objekt setzen
    Pic_resize pic, 1, zelle.Height, , zelle.Top, Range("L" & zelle.Row).Left + 30 'Größe und Position festlegen durch Subroutine
    Next zelle
    End Sub
    Sub Pic_resize(pic As Object, Seitenverh_sperr As Boolean, Optional höhe As Long, Optional Breite As Long, Optional Pos_vert As Long, Optional Pos_hori As Long)
    

    With pic
    .LockAspectRatio = Seitenverh_sperr
    If höhe > 0 Then .Height = höhe
    If Breite > 0 Then .Width = Breite
    If Pos_vert > 0 Then .Top = Pos_vert
    If Pos_hori > 0 Then .Left = Pos_hori
    .Placement = 1
    End With
    End Sub

    https://www.herber.de/bbs/user/164279.xlsm

    Damit kommen wir glaub ich schon ziemlich nah ans Optimum :-)

    Bitte in der Beispielmappe noch meinen Pfad rauslöschen: C:\TEMP

    Gruß, MCO


    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 08:05:12
    Nadine
    Guten Morgen MCO,

    das funktioniert halbwegs sehr gut. Lieben Dank schonmal. Allerdings löscht der "Zusatz" nun auch meine Diagramme, die ebenfalls auf dem Dashboard vorhanden sind, nachdem er die Bilder gelöscht hat. Kann man da nicht sagen, lösche nur alle Bilder in Spalte L?
    Kann man eventuell auch das VBA so schreiben, dass er genau den Wert ausliest, von dem Namen der in Spalte A steht? Aktuell läuft er ja einfach von oben nach unten durch, egal ob der Wert zu dem Namen gehört.

    Dankeschön.
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 08:45:11
    MCO
    Moin!

    Tja, ich kann ja nur sehen, was du auch zur Verfügung stellst...
    Shapes sind grundsätzlich mit dem Sheet "verheiratet" nicht mit der Zelle. Daher müssten wir zur Identifikation von "Grafik in L" die .left -Position abfragen.

        For shp = ws.Shapes.Count To 1 Step -1
    
    If ws.Shapes(shp).Left >= ws.Range("L1").Left Then ws.Shapes(shp).Delete
    Next shp


    Kann man eventuell auch das VBA so schreiben, dass er genau den Wert ausliest, von dem Namen der in Spalte A steht?
    Klar geht das. Hab mich eh schon gefragt, warum immer alle gesetzt werden müssen.

    Mit dem Worksheet_change-Ereignis wird schon TARGET als geänderte Zelle geliefert. Diese können wir als Parameter mit in die Sub Grafik einfügen geben.
    Damit entfällt die Setzen-Schleife: es muss nur 1 Symbol ausgetauscht werden.

    Denkansatz:
    Zum Löschen muss ich alle Grafiken in ihrer Horizontalen u. Vertikalen Positon überprüfen. (Vergleichswert für die Zeile ist eigentlich unsauber, da ich voraussetze, das in Dashboard die gleiche Zeilenhöhe gesetzt ist wie in Tabelle 2)

        For shp = ws.Shapes.Count To 1 Step -1
    
    If ws.Shapes(shp).Left >= ws.Range("L1").Left And _
    ws.Shapes(shp).Top = Zelle.Top Then ws.Shapes(shp).Delete
    Next shp


    Weiterentwicklung:
    Wenn die Grafik zum Begriff gehört, dann benennen wir sie doch so!
        Set pic = ws.Pictures.Insert(pfad & Symb)  'einfügen gewünschtes Bild, setzen als object
    
    pic.Name = Zelle.Offset(, -1) 'Bild bekommt den namen aus Spalte "A"

    Damit entfällt auch Schleife zum Löschen (musst die einmal von Hand löschen), da gezielt gelöscht werden kann.

    Den Aufruf hab ich mit dem Parameter auch angepasst.:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("B2:B6")) Is Nothing Then grafik_einfügen Target
    End Sub
    Sub grafik_einfügen(Zelle As Range)
    

    Dim pfad As String
    Dim Symb As String
    Dim ws As Worksheet
    Dim pic As Object

    Set ws = Sheets("Dashboard")
    pfad = "I:\Pfad\" 'Deinen Pfad eintragen

    Pic_name = Zelle.Offset(, -1) 'Bild, das zu tauschen ist
    ws.Shapes(Pic_name).Delete

    Select Case Zelle.Value 'konkrete Auswahl
    Case 1
    Symb = "Ausrufezeichen.png"
    Case 2
    Symb = "Haken.png"
    Case 3
    Symb = "Kreuz.png"
    Case Else
    MsgBox "Nix vorgesehen"
    Exit Sub
    End Select

    Set pic = ws.Pictures.Insert(pfad & Symb) 'einfügen gewünschtes Bild, setzen als object
    pic.Name = Zelle.Offset(, -1) 'Bild bekommt den namen aus Spalte "A"
    Pic_resize pic, 1, Zelle.Height, , Zelle.Top, Range("L" & Zelle.Row).Left + 30 'Größe und Position festlegen durch Subroutine
    End Sub


    unverändert:
    Sub Pic_resize(pic As Object, Seitenverh_sperr As Boolean, Optional höhe As Long, Optional Breite As Long, Optional Pos_vert As Long, Optional Pos_hori As Long)
    

    With pic
    .LockAspectRatio = Seitenverh_sperr
    If höhe > 0 Then .Height = höhe
    If Breite > 0 Then .Width = Breite
    If Pos_vert > 0 Then .Top = Pos_vert
    If Pos_hori > 0 Then .Left = Pos_hori
    .Placement = 1
    End With
    End Sub


    Gruß, MCO


    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 08:47:48
    MCO
    Bitte die Zeile ergänzen

    On Error Resume Next
    ws.Shapes(Pic_name).Delete

    Das ist nicht so kompliziert....

    Gruß, MCO
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 08:53:32
    MCO
    aus welchem Grund auch immer:

    ich musste
    .LockAspectRatio = Seitenverh_sperr
    ändern in
    .ShapeRange.LockAspectRatio = Seitenverh_sperr
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 08:55:15
    Nadine
    Hallo MCO,

    tausend Dank für deine Unterstützung. Ich hab den Code und deine Änderungen mit übernommen und werde es im Laufe des Tages testen.
    Ich hoffe, dass du mir dann nicht nochmal aushelfen musst ;-)
    Tut mir leid schon mal für meine Dümmlichkeit :-)

    Ich danke dir.

    Lg Nadine
    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 11:02:19
    MCO
    ist doch ganz nett geworden.

    Als Nutzer mit "Basiskenntnissen in VBA" ist das nur Unwissen, nicht Dummheit. Das gibt sich mit der Zeit.

    Viel Erfolg!

    Gruß, MCO
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    15.11.2023 12:12:48
    Nadine
    Hallo MCO,

    ich habe nun alles in den Code mit verändert, was du mir geschrieben hast. leider kommt die Meldung direkt am Anfang bei: "pic_name = Zelle.Offset(, -1)" - Objekt erforderlich.
    Außerdem frag ich mich grad, woher er weiß, welchen Wert er aus Tabelle1 auslesen soll, um dann in Spalte L das richtige Symbol einzufügen. Weiterhin steht mein Name in Spalte B und nicht mehr in Spalte A. Schreib ich dann Zelle.Offset(, -2) oder Zelle.Offset(, 0)???
    Anbei die Datei und dein Code ;-)

    https://www.herber.de/bbs/user/164301.xlsm
    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    16.11.2023 07:52:27
    MCO
    Moin!

    Ich versuch es mal schrittweise zu erklären.
    Außerdem frag ich mich grad, woher er weiß, welchen Wert er aus Tabelle1 auslesen soll, um dann in Spalte L das richtige Symbol einzufügen.

    Du schreibst "Tabelle1", ausgelesen und ausgelöst wird aber alles in Tabelle2. Diesen Code hasst du nicht übernommen:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("B2:B6")) Is Nothing Then grafik_einfügen Target
    End Sub

    Target wird in der Kopfzeile als Range deklariert und als Objekt mit an "grafik_einfügen" gegeben. Leider hast du auch da die Kopfzeile nicht ergänzt
    
    
    Sub grafik_einfügen(Zelle As Range)

    Dim pfad As String
    Dim Symb As String
    Dim ws As Worksheet
    Dim pic As Object
    Dim Pic_name As String
    ...
    ...
    ...


    "Zelle" ist die Zelle, die geändert wird, Offset beschreibe den Versatz zu dieser Zelle, also (1,0) ist 1 Zeile tiefer, (0,1) ist 1 Spalte rechts, (0,0) bring demnach keine Änderung, negativ beschreibt die Gegenrichtung.
    Was auf deinem Zielsheet passiert, hat nichts mit dem Inhalt der Spalten A (bzw jetzt neu B) zu tun. Die Position (Zeile) der Grafiken ist abhängig von der Ursprungszeile. So gesehen bist du gezwungen, die Auflistung in der gleichen Reihenfolge zu halten wie in Tabelle2, da in der gleichen Zeile eingefügt wird.
    Wenn du das anders haben willst, müssen wird den Begriff (aus Zelle.Offset(, -1) (die Null hab ich geschlabbert) im Sheet WS suchen.

    Probiers mal aus.
    https://www.herber.de/bbs/user/164324.xlsm

    Gruß, MCO
    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    16.11.2023 08:11:02
    Nadine
    Guten Morgen MCO,

    ich habe jetzt nun die Testdatei so aufgebaut, wie auch meine richtige Datei aussieht. Die Daten, Bilder und Diagramme sind nun in genau den Spalten wie in meiner Datei.
    Ich habe deine Codes noch nachgetragen. Ist mir gar nicht so aufgefallen gestern, sorry.
    Im Dashboard soll in Spalte L / M & N die Werte aus der Basistabelle Spalte AV:AX ausgelesen und als Symbol wiedergegeben werden. Aber auch den Wert zum Namen in Spalte B.

    https://www.herber.de/bbs/user/164325.xlsm

    Danke dir
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    16.11.2023 10:17:42
    MCO
    Komisch. Was du vorn aufbaust, wird hinten wieder kaputtgemacht ;-)

    DAS ist doch nicht dein Pfad, oder?!
        pfad = "Pfad\" 'Deinen Pfad eintragen


    Im alt-Original steht die Bewertung direkt links neben dem Namen als .offset(0,-1). Jetzt steht die Bewertung in Spalte AX! Da geht das dann nicht mehr (oder mit .offset(0,-49)
    Tausche also
        pic_name = Zelle.Offset(0, -1) 'Bild, das zu tauschen ist+

    mit
        pic_name = Cells(Zelle.Row, "B")


    Da sich durch die geänderten Spaltenbreiten jetzt die Position von Spalte "L" geändert hat, ist ein Fehler aufgefallen: Bei der Position der Grafik wurde mit
    Range("L" & Zelle.Row).Left + 30
    auf die Spalte L in der Basistabelle verwiesen. Die Position ist aber im Dashboard viel weiter links bzw. verborgen. Daher muss die Referenzierung auch auf das Dashboard gehen.
    ws.Range("L" & Zelle.Row).Left + 30
    (Diese Fehler rauben einem den Nerv)

    Die Zeile heißt also
    Pic_resize pic, 1, Zelle.Height, , Zelle.Top, ws.Range("L" & Zelle.Row).Left + 30 


    Wie ich sehe, willst du aber 3x Bilder einfügen, oder? Immer die gleichen? Damit kommt zum in der Subroutine noch ein weiterer Parameter hinzu, der die Position und möglicherweise auch Art des Bildes steuert....?

    Spannend!
    Ich hab´s mal mit eingebaut. Hier der vollständige Code:
    Sub grafik_einfügen(Zelle As Range)
    

    Dim pfad As String
    Dim Symb As String
    Dim ws As Worksheet
    Dim pic As Object
    Dim pic_name As String

    Set ws = Sheets("Dashboard")
    pfad = "Pfad\" 'Deinen Pfad eintragen

    frag = Application.InputBox("ist das dein Pfad?", "Pfad", pfad)
    If frag = False Then Exit Sub

    'pfad = "C:\temp\" 'Deinen Pfad eintragen
    pic_name = Cells(Zelle.Row, "B") & Zelle.Address(0, 0) 'Bild, das zu tauschen ist

    On Error Resume Next
    ws.Shapes(pic_name).Delete

    Select Case Zelle.Value 'konkrete Auswahl
    Case 1
    Symb = "Ausrufezeichen.png"
    Case 2
    Symb = "Haken.png"
    Case 3
    Symb = "Kreuz.png"
    Case Else
    MsgBox "Nix vorgesehen", vbCritical
    Exit Sub
    End Select

    Select Case Zelle.Column 'geänderte spalte: einfügespalte bestimmen
    Case 48 'Spalte AV
    einf_sp = "L"
    Case 49
    einf_sp = "M"
    Case 50
    einf_sp = "N"
    Case Else
    MsgBox "Spalte nicht vorgesehen", vbCritical
    Exit Sub
    End Select

    Set pic = ws.Pictures.Insert(pfad & Symb) 'einfügen gewünschtes Bild, setzen als object
    pic.Name = Zelle.Offset(, -1) 'Bild bekommt den namen aus Spalte "A"
    Pic_resize pic, 1, Zelle.Height, , Zelle.Top, ws.Range(einf_sp & Zelle.Row).Left + 30 'Größe und Position festlegen durch Subroutine
    End Sub


    Die Pfad-Abfrage kannst du natürlich wieder rauslöschen, die nervt nach 7-12x ;-)

    Gruß, MCO
    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung
    16.11.2023 12:48:05
    Nadine
    Hallo MCO,

    ich danke dir. Jetzt klappst.

    AW: VBA Bild mit Zellbezug einfügen nach Bedingung +
    14.11.2023 09:23:39
    Nadine
    Hallo MCO,

    super vielen Dank. Das klappt schon mal, so wie ich es mir vorgestellt hatte.
    Gibt es auch einen VBA Code der berücksichtigt, dass das Bild die Eigenschaft hat sich von Zellposition und -größe abhängig zu machen? Quasi, wenn man es ausblendet, das auch die Grafik mit ausgeblendet ist?
    Weiterhin wollte ich fragen, ob man diese Grafik auch als Verknüpfung in eine Power Point einfügen könnte?

    Vielen lieben Dank schon mal.
    Nadine
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung +
    14.11.2023 13:16:05
    MCO
    Hi!

    Das hab ich durch´s googlen und makro aufzeichnen herausgefunden. Das hier kommt aus der Hilfe von MS zum Stichwort excel, vba Placement

    https://learn.microsoft.com/de-de/office/vba/api/excel.shape.placement

    Gibt an, wie ein Objekt mit seinen zugrunde liegenden Zellen verbunden ist.

    Name Wert Beschreibung
    xlFreeFloating 3 Das Objekt ist frei verschiebbar.
    xlMove 2 Das Objekt wird mit den Zellen verschoben.
    xlMoveAndSize 1 Das Objekt wird mit den Zellen verschoben und vergrößert/verkleinert.

    Bedeutet, du kannst in der Sub Pic_resize() noch eine Zeile einfügen mit der gewünschten Option
    .Placement = xlMoveAndSize	

    oder
    .Placement = 1


    Das mit dem Link hab ich nicht verstanden... Wer soll wohin verlinken?!

    Gruß, MCO
    Anzeige
    AW: VBA Bild mit Zellbezug einfügen nach Bedingung +
    14.11.2023 13:21:00
    Nadine
    Hallo MCO,

    herzlichen Dank für deine Hilfe. Habe alles erweitert.
    Leider klappt das noch nicht so mit dem Bild einfügen in das andere Tabellenblatt, aber da teste ich mich noch weiter durch.
    Ich habe Diagramme in der Excel die in einer Power Point eingefügt wurden, die mit der Excel verknüpft sind. Sobald die Exceldiagramme sich verändern, kann man in der Power Point diese Verknüpfung aktualisieren und die Werte sind dort ebenfalls aktuell.
    Dies klappt leider nicht mit meinen 3 Grafiken.

    LG Nadine

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige