Excel Makro: Ausführen durch Zellwertänderung?

mschrak

Commander
Registriert
Sep. 2009
Beiträge
2.199
Hallo zusammen,

ich muss vorab sagen, dass ich bei Makros wirklich wenig Ahnung habe. Vielleicht kann mir trotzdem jemand auf die Sprünge helfen.

Ich habe ein Tabellenblatt mit folgendem Makro:

Sub makroname()

Dim Bildpfad As String

On Error Resume Next
Worksheets("Tabelle1").Shapes.Range(Array("Bild")).Delete
'Löscht ein bereits vorhandenes Bild

Bildpfad = Cells(8, 2).Value
'Pfad zu den Ordnern mit den Bildern

Range("a1").Select
'Platz wo das Bild einfügt werden soll, geht aber auch über "Koordinaten"

ActiveSheet.Pictures.Insert(Bildpfad).Name = "Bild"
'Hiermit wird dem Bild der Name "Bild" gegeben, um es wieder löschen zu können


'Dimensionen des Bildes anpassen - mir hat es gereicht die Bildbreite anzupassen -> Width
Worksheets("Tabelle1").Shapes.Range(Array("Bild")).Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Width = 768
'Selection.ShapeRange.Height = 1024

'Sollte die Breite aber nicht genügen und die Höhe des Bildes den Platz sprengen, dann wird hiermit die Höhe angepasst
If Selection.ShapeRange.Height > 1024 Then
Selection.ShapeRange.Height = 1024
End If

'Und noch eine Feinjustierung
Selection.ShapeRange.Top = 1
Selection.ShapeRange.Left = 1

End Sub

Zweck der Tabelle ist es, zu wechselnden Inhalten das jeweils passende Bild von der Festplatte in der Tabelle anzuzeigen. Wie man sieht, ist der Dateilink in Zelle B8 vorhanden. Dieser kommt dort per SVERWEIS hin, ist also dynamisch.

Derzeit muss ich, um mir das Bild mit dem Makro anzeigen zu lassen, immer das Makro umständlich ausführen.

Meine Frage ist: Wie kann man das Makro programmieren, damit es sich immer dann selbst ausführt, wenn sich in Zelle B8 der Wert ändert, das Bild also immer gleich mit angepasst wird, wenn sich der Dateilink ändert?


Für Hilfe bin ich sehr dankbar,


Martin
 
Die Routine reagiert, wenn Zelle C3 geändert wird.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$C$3" Then
MsgBox "Wert geändert"
'Tu etwas"
End If

End Sub
 
Habe das mal ausprobiert...

Wenn ich manuell den Zellwert ändere, dann funktioniert das. Wenn ich also einfach einen anderen Dateipfad eintippe und den alten Wert überschreibe.

Wenn ich in der "Auslöser-Zelle" aber eine Formel habe, dann reagiert das Makro nicht auf Veränderungen des Zellwertes...

Mache ich irgendetwas falsch?

Hier mein derzeitiger Makro-Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$8" Then

Dim Bildpfad As String

On Error Resume Next
Worksheets("Tabelle1").Shapes.Range(Array("Bild")).Delete
'Löscht ein bereits vorhandenes Bild

Bildpfad = Cells(8, 2).Value
'Pfad zu den Ordnern mit den Bildern

Range("a1").Select
'Platz wo das Bild einfügt werden soll, geht aber auch über "Koordinaten"

ActiveSheet.Pictures.Insert(Bildpfad).Name = "Bild"
'Hiermit wird dem Bild der Name "Bild" gegeben, um es wieder löschen zu können


'Dimensionen des Bildes anpassen - mir hat es gereicht die Bildbreite anzupassen -> Width
Worksheets("Tabelle1").Shapes.Range(Array("Bild")).Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Width = 768
'Selection.ShapeRange.Height = 1024

'Sollte die Breite aber nicht genügen und die Höhe des Bildes den Platz sprengen, dann wird hiermit die Höhe angepasst
If Selection.ShapeRange.Height > 1024 Then
Selection.ShapeRange.Height = 1024
End If

'Und noch eine Feinjustierung
Selection.ShapeRange.Top = 1
Selection.ShapeRange.Left = 1

End If

End Sub
 
Moin Martin,

das Worksheet_Change - Ereignis wirkt nur dann als Auslöser, wenn per Hand eine Änderung vorgenommen wird. Wird deine Auslöserzelle durch eine Formel verändert, dann tritt das Worksheet_Calculate - Ereignis ein. Dieses hat aber kein Target-Argument ... :(

Ich löse das so: In einer globalen Variable lege ich beim aktivieren des Sheets den Wert der Zelle ab. Bei jedem Calculate-Ereignis vergleiche ich den Wert der Zelle mit der Variablen. Sind die ungleich, dann führe ich meinen Code aus und weise der globalen Variablen den neuen Wert zu.
 
Stimmt.
Dann probiere es so:

Option Explicit

Dim curWert As String

Private Sub Worksheet_Activate()
curWert = Cells(1, 3).Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Cells(1, 3).Value <> curWert Then
MsgBox "WWW" 'Tu etwas
curWert = Cells(1, 3).Value
End If

End Sub
 
Ohne das auszuprobieren:
Die Idee einen Blattwechsel (id est: es zu aktivieren beim Öffnen) als Trigger zu nehmen kam mir auch… Aber es bleibt dabei: Change-By-Val reagiert nicht auf reine Formelaktivitäten.

@GMG-CC
Worksheet_Calculate - wäre auch brauchbar, aber tut das ›im Hintergrund‹ auf Blatt 5 wenn ich auf Blatt 1 was ändere das eine Formel auf Blatt 5 anstößt? Oder muss das Blatt aktiv sein? (Dann würde normales Change ja auch tun - kopfkratz…)


@mschrak
Ich will dir mal eine ganz dumme Frage stellen: Damit sich in der Zelle auf die du scharf bist was tut müsste sich, meiner bescheidenen Meinung nach, irgendwo anders erst recht was tun, stimmts?
Spinnen wir das mal weiter. Ich täte allgemein »in der Zentrale« was ändern was solche Auswirkungen hätte, nicht wild in der Gegend. Damit wäre ich so weit, dass ich dort ein normales Change-Ereignis abfangen könnte das alle Blätter abklappert (Hellsehen ist Glückssache) und Änderungen plump durchführt.
Genauer würde ich den Stand in den spannenden Zellen auf meinem Zentral-Blatt irgendwo im «Unsichtbaren» parken und dagegen, Blatt um Blatt, abgleichen. Ist das Formelresultat nun anders käme die Bildtauschaktion und das Update dieser Park-Liste.

Bin ich ehrlich frage ich mich aber was die Aktion soll. Das erwähnte Worksheet-Change wäre insoweit Trigger genug, dass der Code jedes Blattes eine zentrale Prüfung (Modul z.B.) anwirft und das Bild ggf. tauscht, also ›on demand‹, wenn man so will.
Auf der anderen Seite - wie viele solcher Blätter mit Bild gibt es, nur eins? Wenn du nämlich eine Datenbankabfrage nachbauen willst nimm besser das Original…

CN8
 
cumulonimbus8 schrieb:
Worksheet_Calculate - wäre auch brauchbar, aber tut das ›im Hintergrund‹ auf Blatt 5 wenn ich auf Blatt 1 was ändere das eine Formel auf Blatt 5 anstößt? Oder muss das Blatt aktiv sein? (Dann würde normales Change ja auch tun - kopfkratz…)

Kratzhilfe::evillol: Wenn die Sub im Tabelle5 steht und in A1 ist die Funktion =Tabelle1!A2 dann wird (selbstverständlich) die Funktion Worksheet_Calculate (in Blatt5) angestoßen, auch wenn ich auf Blatt1 bin. - Dass das Ganze nicht wirklich optimal ist, das sehe ich auch so. Aber Datenbanken sind da sooo schwer :(
 
Zurück
Oben