Supportnet / Forum / Tabellenkalkulation
Zellen einfärben in Abhängigkeit des Inhaltes
Frage
Hallo all!
Je nach Eingabe eines Wertes in eine Zelle soll die Zelle eingefärbt werden.
Hierzu habe ich kleines Makro:
[code]
Sub Worksheet_Change(ByVal Target As Excel.Range)
For Each Zelle In Worksheets("2003").Range("B9:Bn46")
If Zelle.FormulaR1C1 = "s" Then
Zelle.Interior.ColorIndex = 42
ElseIf Zelle.FormulaR1C1 = "l" Then
Zelle.Interior.ColorIndex = 4
ElseIf Zelle.FormulaR1C1 = "u" Then
Zelle.Interior.ColorIndex = 6
ElseIf Zelle.FormulaR1C1 = "j" Then
Zelle.Interior.ColorIndex = 15
ElseIf Zelle.FormulaR1C1 = "g" Then
Zelle.Interior.ColorIndex = 39
ElseIf Zelle.FormulaR1C1 = "b" Then
Zelle.Interior.ColorIndex = 3
ElseIf Zelle.FormulaR1C1 = "" Then
Zelle.Interior.ColorIndex = 2
End If
Next
End Sub
[/code]
Leider dauert es je nach Rechner nach jeder Eingabe einen kleinen Augenblick, bis das Makro alle Zellen durchgnudelt hat.
Wie kann ich das ganze beschleunigen? Mit bedingter Formatierung möchte ich nicht arbeiten, da ich diese für andere Zwecke brauche, ausserdem ist diese beschränkt auf 3 Auswahlen.
Wie muss der Code aussehen, damit ich diesen immer nur auf die aktuelle Zelle anwende?
Vielen Dank und Grüße
Jones
Antwort 1 von misterUE
Ich hab zwar kaum Ahnung in VBA aber ich versuch's trotzdem mal, vielleicht hilft's ja :-)
mfg, Ümit
Sub Worksheet_Change(ByVal Target As Excel.Range)
For Each Zelle In Worksheets("2003").Range("B9:Bn46")
select case zelle.formularr1c1
case "s": Zelle.Interior.ColorIndex = 42
case "l": Zelle.Interior.ColorIndex = 4
case "u": Zelle.Interior.ColorIndex = 6
case "j": Zelle.Interior.ColorIndex = 15
case "g": Zelle.Interior.ColorIndex = 39
case "b": Zelle.Interior.ColorIndex = 3
case "": Zelle.Interior.ColorIndex = 2
case else: 'sonst...
end select
Next
End Sub
mfg, Ümit
Antwort 2 von JonesM
hallo!
funktioniert leider nicht. bricht mit fehlermeldung ab. der bereich hier ja auch definiert. ist also bestimmt nicht viel schneller...
trotzdem danke
funktioniert leider nicht. bricht mit fehlermeldung ab. der bereich hier ja auch definiert. ist also bestimmt nicht viel schneller...
trotzdem danke
Antwort 3 von Guenter
Hallo,
vielleicht geht's so:
Gruß
Günter
vielleicht geht's so:
Sub Worksheet_Change(ByVal Target As Excel.Range)
If ActiveCell.Value = "s" Then
ActiveCell.Interior.ColorIndex = 42
ElseIf ActiveCell.Value = "l" Then
ActiveCell.Interior.ColorIndex = 4
ElseIf ActiveCell.Value = "u" Then
ActiveCell.Interior.ColorIndex = 6
ElseIf ActiveCell.Value = "j" Then
ActiveCell.Interior.ColorIndex = 15
ElseIf ActiveCell.Value = "g" Then
ActiveCell.Interior.ColorIndex = 39
ElseIf ActiveCell.Value = "b" Then
ActiveCell.Interior.ColorIndex = 3
ElseIf ActiveCell.Value = "" Then
ActiveCell.Interior.ColorIndex = 2
End If
End Sub
Gruß
Günter
Antwort 4 von JonesM
funktioniert leider auch nicht richtig. manchmal geht es, manchmal nicht? :) kann keine systematik entdecken... ganz komisch...
Antwort 5 von Guenter
Hallo,
das von mir angegebene Makro funktioniert so, dass wenn eine Eingabe an irgendeiner Stelle im Arbeitsblatt gemacht wird, geprüft wird, ob die Eingabe s, l, j, b, usw. dabei ist, wenn ja, dann erfolgt die Einfärbung der Zelle.
Gruß
Günter
das von mir angegebene Makro funktioniert so, dass wenn eine Eingabe an irgendeiner Stelle im Arbeitsblatt gemacht wird, geprüft wird, ob die Eingabe s, l, j, b, usw. dabei ist, wenn ja, dann erfolgt die Einfärbung der Zelle.
Gruß
Günter
Antwort 6 von _gau_
Haut nicht hin, weil es ein Timing-Problem gibt. Beim Eintreten des Ereignisses "Worksheet_Change" (nach Drücken von ENTER) ist die Markierung schon in der nächsten Zelle. Also wird nicht die geänderte Zelle geprüft und eingefärbt, sondern die nächste ;-)
Man darf also nicht mit "ActiveCell" arbeiten, sondern mit "Target" (wozu gibt's das denn sonst in dem Ereignis ;-)
Beispiel:
PS: Select Case gefällt mir einfach besser als paarmal if
[gau]
Man darf also nicht mit "ActiveCell" arbeiten, sondern mit "Target" (wozu gibt's das denn sonst in dem Ereignis ;-)
Beispiel:
Sub Worksheet_Change(ByVal Target As Range)
Select Case UCase(Target.Text)
Case "A"
Target.Interior.ColorIndex = 3
Case "B"
Target.Interior.ColorIndex = 4
Case "C"
Target.Interior.ColorIndex = 5
Case "D"
Target.Interior.ColorIndex = 6
Case "E"
Target.Interior.ColorIndex = 7
Case "F"
Target.Interior.ColorIndex = 8
Case Else
Target.Interior.ColorIndex = 0
End Select
End Sub
PS: Select Case gefällt mir einfach besser als paarmal if
[gau]
Antwort 7 von _gau_
Hmm, noch vergessen: Das UCase hab ich drin, damit Klein/Großschreibung keine Rolle spielt. Ansonsten einfach rausnehmen...
Antwort 8 von Guenter
Hi [gau],
das mit der Markierung in der nächsten Zelle stimmt allerdings nur, wenn in den
Optionen
Bearbeiten
Markierung nach dem Drücken der Eingabetaste verschieben
gewählt ist.
Wenn das nicht der Fall ist, sollte es auch mit ActiveCell gehen.
Gruß
Günter
das mit der Markierung in der nächsten Zelle stimmt allerdings nur, wenn in den
Optionen
Bearbeiten
Markierung nach dem Drücken der Eingabetaste verschieben
gewählt ist.
Wenn das nicht der Fall ist, sollte es auch mit ActiveCell gehen.
Gruß
Günter
Antwort 9 von JonesM
@GAU!
Super, genau was ich suchte!
Vielen Dank.
Jones
Super, genau was ich suchte!
Vielen Dank.
Jones
Antwort 10 von _gau_
@Günter
Naja, ich gehe vom Normalfall aus, und diese Option ist AFAIK standardmäßig bei Excel so eingestellt. Unabhängig davon ist man schließlich mit der extra dafür vorgesehenen Variable Target auf der sicheren Seite.
PS: Ich hab's ja auch erst mit ActiveCell versucht und dann gemerkt, daß irgendwas schief läuft ;-)
mfg, [gau]
Naja, ich gehe vom Normalfall aus, und diese Option ist AFAIK standardmäßig bei Excel so eingestellt. Unabhängig davon ist man schließlich mit der extra dafür vorgesehenen Variable Target auf der sicheren Seite.
PS: Ich hab's ja auch erst mit ActiveCell versucht und dann gemerkt, daß irgendwas schief läuft ;-)
mfg, [gau]
Antwort 11 von _gau_
PPS: Da sieht man aber wieder, wie man bei VBA auf die Schnau... fallen kann. Was bei User/Rechner "A" funktioniert muß bei User/Rechner "B" noch lange nicht so gehen :-(
mfg, [gau]
mfg, [gau]

