Supportnet Computer
Planet of Tech

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 :-)


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


Antwort 3 von Guenter

Hallo,

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

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:

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

Antwort 9 von JonesM

@GAU!
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]

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]

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: