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

Makro automatisch bei Zellenänderung ausführen

Makro automatisch bei Zellenänderung ausführen
Michael
Hallo,
für eine Tabelle nutze ich folgendes Makro:

Sub einfärben()
For Each Cell In Range("H5:AH16")
If Cell = "SE" Then
Cell.Interior.ColorIndex = 3
Cell.Font.ColorIndex = 3
End If
If Cell = "TW" Then
Cell.Interior.ColorIndex = 4
Cell.Font.ColorIndex = 4
End If
If Cell = "BS" Then
Cell.Interior.ColorIndex = 5
Cell.Font.ColorIndex = 5
End If
If Cell = "SK" Then
Cell.Interior.ColorIndex = 6
Cell.Font.ColorIndex = 6
End If
If Cell = "CN" Then
Cell.Interior.ColorIndex = 7
Cell.Font.ColorIndex = 7
End If
If Cell = "MST" Then
Cell.Interior.ColorIndex = 8
Cell.Font.ColorIndex = 8
End If
If Cell = "SAM" Then
Cell.Interior.ColorIndex = 9
Cell.Font.ColorIndex = 9
End If
If Cell = "Assi" Then
Cell.Interior.ColorIndex = 10
Cell.Font.ColorIndex = 10
End If
Next Cell
End Sub

Bisher muss ich das Makro allerdings jedes Mal per Hand ausführen, wenn sich ein Zellergebnis geändert hat. Gibt es die Möglichkeit, dass das Makro sofort ausgeführt wird, sobald sich ein Zellergebnis in der angegebenen Range ergibt?
Danke für Eure Hilfe und viele Grüße
Michael
AW: Makro automatisch bei Zellenänderung ausführen
16.03.2010 10:59:21
Matthias
Hallo
in einem Modul
Sub einfaerben()
Dim cell As Range
For Each cell In Range("H5:AH16")
If cell = "SE" Then
cell.Interior.ColorIndex = 3
cell.Font.ColorIndex = 3
End If
If cell = "TW" Then
cell.Interior.ColorIndex = 4
cell.Font.ColorIndex = 4
End If
If cell = "BS" Then
cell.Interior.ColorIndex = 5
cell.Font.ColorIndex = 5
End If
If cell = "SK" Then
cell.Interior.ColorIndex = 6
cell.Font.ColorIndex = 6
End If
If cell = "CN" Then
cell.Interior.ColorIndex = 7
cell.Font.ColorIndex = 7
End If
If cell = "MST" Then
cell.Interior.ColorIndex = 8
cell.Font.ColorIndex = 8
End If
If cell = "SAM" Then
cell.Interior.ColorIndex = 9
cell.Font.ColorIndex = 9
End If
If cell = "Assi" Then
cell.Interior.ColorIndex = 10
cell.Font.ColorIndex = 10
End If
Next cell
End Sub
In der Tabelle
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5:AH16")) Is Nothing And Target.Count = 1 Then einfaerben
End Sub

Gruß Matthias
Anzeige
@Matthias : inhaltlicher/logischer Fehler
16.03.2010 11:08:54
NoNet
Hallo Matthias,
Dein Makro überprüft nur, ob innerhalb des Bereiches H5:AH16 eine Änderung stattgefunden hat, das muss jedoch nicht unbedingt sein : Wenn in H5 z.B. die Funktion =WENN(A5=1;"";"TW") steht, sollte wohl auch eine Änderung der Zelle A5 die Farbänderung auslösen, da sich der Wert in H5 in Abhängigkeit der Zelle A5 ja auch ändert !
Weiterhin prüfst Du auf Target.Count=1 : Was aber, wenn mehrere Zellen gleichzeitig geändert wurden (z.B. eine komplette Spalte per ENTF gelöscht oder per Strg+V Werte eingefügt wurden) ? Auch dann sollte m.E. das Makro ausgeführt werden ;-)
Bitte siehe das nicht als böse Kritik :-( meinerseits an, sondern als konstruktive Kritik :-)
Gruß, NoNet
Anzeige
AW: @Matthias : inhaltlicher/logischer Fehler
16.03.2010 11:41:40
Matthias
Hallo
Is nicht mein Makro ;o)
Ich hätte da auch eher mit Case gearbeitet, wie Du vorgeschlagen hast.
Mit Target.Count, das hatte ich falsch interpretiert (habe das mit dem "wenn sich ein Zellergebnis ändert ... falsch verstanden)
Aber evtl. könnte man da eh mit .Calculate arbeiten?
Gruß Matthias
AW: Makro automatisch bei Zellenänderung ausführen
16.03.2010 10:59:51
robert
hi,
meinst du so ?
gruß
robert
'Code in deine Tabelle
Private Sub Worksheet_Change(ByVal Target As Range)
Call "hier dein Makroname"
End Sub

AW: Makro automatisch bei Zellenänderung ausführen
16.03.2010 11:00:19
Reinhard
Hallo Michael,
in Modul Tabelle1:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("H5:AH16")) Is Nothing Then Exit Sub
Call Einfaerben
End Sub
in Modul1:

Sub Einfaerben()
Dim Werte, W As Integer
Werte = Array("SE", "TW", "BS")
For Each Cell In Range("H5:AH16")
For W = 0 To UBound(Werte)
If Cell.Value = Werte(W) Then
Cell.Interior.ColorIndex = W + 3
Cell.Font.ColorIndex = W + 3
Exit For
End If
Next W
Next Cell
End Sub

Gruß
Reinhard
Anzeige
Korrektur
16.03.2010 11:15:22
Reinhard
Hallo Michael,
in Modul1:
Sub Einfaerben()
Dim Werte, W As Integer, Cell As Range
Werte = Array("SE", "TW", "BS")
Range("H5:AH16").Interior.ColorIndex = xlNone
Range("H5:AH16").Font.ColorIndex = 0
For Each Cell In Range("H5:AH16")
For W = 0 To UBound(Werte)
If Cell.Value = Werte(W) Then
Cell.Interior.ColorIndex = W + 3
Cell.Font.ColorIndex = W + 3
Exit For
End If
Next W
Next Cell
End Sub

Gruß
Reinhard
AW: Korrektur
16.03.2010 11:23:48
Michael
Vielen Dank!
Was ist denn der Unterschied zur nicht korrigierten Version? Denn die hat bei mir bereits funktioniert!
Gruß
Michael
Anzeige
AW: Korrektur
16.03.2010 11:38:23
Reinhard
Hallo Micheal,
wenn in einer Zelle im Bereich "SW" ist wird sie bunt. Wird dieser Wert gelöscht, so bleibt sie bunt, deshalb dieses eingebaut:
Range("H5:AH16").Interior.ColorIndex = xlNone
Range("H5:AH16").Font.ColorIndex = 0
Gruß
Reinhard
Vorsicht : Fehlerquelle ARRAY
16.03.2010 11:17:50
NoNet
Hallo Reinhard,
an ein ARRAY dachte ich auch zuerst, allerdings erschien es mir zu unflexibel (z.B. wenn irgendwann bei Wert "BS" der ColorIndex 15 verwendet werden soll).
Eine weitere potentielle Fehlerquelle enthält Dein Code :
Deine Schleife läuft fix von 0 bis zur Obergrenze des ARRAYs und Du addierst immer den Wert 3.
Da wir aber den evtl. bereits vorhandenen Code nicht kennen ist das ein Verlass auf die Standardeinstellungen. Wenn das Modul jedoch zu Beginn die Anweisung Option Base 1 enthält, beginnen die ARRAYs nicht mehr mit dem Index 0 sondern bei 1, dann produziert Dein Code falsche Farben.
Korrekturvorschlag :
For W = LBound(Werte) To UBound(Werte)
Cell.Interior.ColorIndex = W + 3 - LBound(Werte)
Cell.Font.ColorIndex = W + 3 - LBound(Werte)
Gruß, NoNet
Anzeige
Option Base 1
16.03.2010 11:47:17
Rudi
Hallo,
das kann man ja ausschließen:

Sub Einfaerben()
Dim Werte, W As Integer
Werte = Array("SE", "TW", "BS")
For Each Cell In Range("H5:AH16")
For W = LBound(Werte) To UBound(Werte)
If Cell.Value = Werte(W) Then
Cell.Interior.ColorIndex = W + 3 + (LBound(Werte) = 1)
Cell.Font.ColorIndex = W + 3
Exit For
End If
Next W
Next Cell
End Sub

Gruß
Rudi
Farbänderung bei Zellenänderung ausführen
16.03.2010 11:03:12
NoNet
Hallo Michael,
kopiere das folgende Makro in das Klassenmodul des Tabellenblattes (also: Name des Blattes im Blattregister unten per Rechts anklicken - "Code anzeigen..." auswählen und den Code in das nun geöffnete VBA-Fenster kopieren) :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngZelle As Range, intFarbe As Integer
For Each rngZelle In Range("H5:AH16")
Select Case rngZelle.Value
Case "SE": intFarbe = 3
Case "TW": intFarbe = 4
Case "BS": intFarbe = 5
Case "SK": intFarbe = 6
Case "CN": intFarbe = 7
Case "MST": intFarbe = 8
Case "SAM": intFarbe = 9
Case "Assi": intFarbe = 10
Case Else: intFarbe = 0
End Select
If intFarbe > 0 Then
rngZelle.Interior.ColorIndex = intFarbe
rngZelle.Font.ColorIndex = intFarbe
End If
Next
End Sub
Gruß, NoNet
Anzeige
@NoNet: inhaltlicher/logischer Fehler
16.03.2010 11:19:35
Renee
Hallo NoNet,
Dein Makro überprüft nur, ob innerhalb der Tabelle (in der der Code zu stehen kommt) eine Änderung stattgefunden hat, das muss jedoch nicht unbedingt sein : Wenn in H5 z.B. die Funktion =WENN(Andere Tabelle!A5=1;"";"TW") steht, sollte wohl auch eine Änderung der Zelle AndereTabelle!A5 die Farbänderung auslösen, da sich der Wert in H5 in Abhängigkeit der Zelle AndereTabelle!A5 ja auch ändert !
Bitte siehe das nicht als böse Kritik :-( meinerseits an, sondern als konstruktive Kritik :-)
(copyRight) by you ;-)))
GreetZ Renée
*fg* : Kann man so sehen...
16.03.2010 11:37:36
NoNet
...muss man aber nicht ;-)
Hey Renée,
Dein Einwand ist so betrachtet natürlich korrekt - aber wo zieht man da die Grenze !?!?
Dann müsste man auch überprüfen : =WENN(['\\Server\Ordner\Externe Mappe.xls]Andere Tabelle'!A5=1;"";"TW") bzw. es böte sich ein allgemeingültiges Klassenmodul z.B. in einem AddIn an....
Ich habe einfach die Angabe eine Tabelle  im Ausgangspost sehr wörtlich genommen ;-)
Greetz zurück, NoNet
Anzeige
Die Grenze kannst du nirgends ziehen...
16.03.2010 12:56:46
Renee
NoNet,
Denn vielleicht sind auch noch irgendwo =INDIREKT-Formeln, Queries (mit Intervall-Abfragen), andere Makros ...etc. verbaut.
Also bleibt:
a) eine Rückfrage beim Anfragesteller, ob im Bereich nur manuelle Werte oder Formeln, die sich innerhalb des Bereichs bewegen, vorkommen
oder
b) wie vorgeschlagen mit der >_Calculate Keule zuschlagen. ;-)
GreetZ Renée

330 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige