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

Bedingte Formatierung für Oval

Bedingte Formatierung für Oval
22.04.2009 11:30:59
Simone
Grüß Gott,
Ich habe eine Problem mit einem Oval,
ich möchte Mehrere Farben für das Oval haben.
Wenn M1 =10 dann Gelb
Wenn M1 = 20 dann Rot
Wen...... usw...
Aber ich bekomme nur eine Farbe hin..

Private Sub Worksheet_Activate()
If Range("M1").Value = 10 Then
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 3
Else
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 1
End If
End Sub


WEr kann mir sagen wie ich mehrere Varianten da rein bekomme?
Danke
Simone

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
...mit Select Case abfragen! (RTF)VBE-Hilfe! orT
22.04.2009 11:36:59
Luc:-?
Gruß Luc :-?
AW: ...mit Select Case abfragen! (RTF)VBE-Hilfe! orT
22.04.2009 12:37:46
Rainer
Wie Luc schon geschrieben hatte, mit der Select Case Methode, z.B. so:
PrüfWert = Range("M1").Value
Select Case PrüfWert
Case 10
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 3
Case 20
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 1
Case 30
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 10
End Select
Eine verschachtelte If Else Sequenz hilft aber auch weiter:
If Range("m1").Value = 10 Then
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 3
Else
If Range("m1").Value = 20 Then
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 1
Else
If Range("m1").Value = 30 Then
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = 10
End If
End If
End If
Am einfachsten wäre es allerdings wenn Du das Ergebnis in M1 = FarbNummer setzt. Dann kannst Du das bequem in einer einzigen Schleife programmieren ohne eine komplette Abfrage aller möglichen Fälle durchzuführen. Könnten dann allerdings dabei manchmal recht interessante Farben bei raus kommen. ^^
Gruß
Rainer
Anzeige
Das If...Then...Else-Konstrukt kannst du...
22.04.2009 14:30:08
Luc:-?
...auch so schreiben, Rainer...

With ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor
If Range("m1") = 10 Then
.SchemeColor = 3
ElseIf Range("m1").Value = 20 Then
.SchemeColor = 1
ElseIf Range("m1").Value = 30 Then
.SchemeColor = 10
End If
End With


Select Case ist aber schneller; nur sollte es auch in eine With-Gruppe eingebunden wdn.
Gruß Luc :-?

AW: Das If...Then...Else-Konstrukt kannst du...
22.04.2009 16:38:23
Rainer
Ich weiss ... aber dann macht es keinen Sinn. ;)
Sinn macht das mit If Then Else Verschachtelung wenn es auf Zeit ankommt.
Da tatsächlich die If Then Else Verschachtelung teilweise bis um das Doppelte schneller ist als die Select Case Anweisung. ;)
Frag mich aber bitte nicht woran es liegt, war nämlich eigentlich auch Deiner Ansicht. Bin dann aber in einem Buch auf diese Behauptung gestossen und dann mal eine Schleife mit 2 Mio Durchläufen getestet ... im Extremfall war eben If Then Else um das Doppelte schneller und im schlechtesten Fall gleich schnell wie Select Case. Liegt an den Bedingungen je früher die Bedingung True desto schneller ist If Then Else.
Frag mich aber bitte nicht wieso weshalb oder warum. ^^
Gruß
Rainer
Anzeige
Erstaunlich, meist wird nämlich das Ggteil...
22.04.2009 18:33:02
Luc:-?
...behptet, Rainer...
Vielleicht ist das ja auch eine VBA-Besonderheit...
Allerdings kann das so auch nur fkt, wenn beim Vorliegen der einzelnen Bedingungen Asymmetrie herrscht und die Reihenfolge der Abfragen daran orientiert wird. Wenn Select Case dann auch nicht schneller wird, müssten ja intern stets alle Cases durchlaufen wdn, was ich bei Tests aber nicht verifizieren konnte...(?!)
Gruß Luc :-?
AW: Erstaunlich, meist wird nämlich das Ggteil...
22.04.2009 19:10:13
Rainer
Ich kann es Dir nicht sagen woran es liegt, aber weder die Behauptung noch die Beweisführung sind auf meinem Mist gewachsen, sondern nur entnommen aus dem Buch Excel-VBA, Verlag Addison-Wesley, Author Michael Schwimmer. ;)
Dachte auch erst das es daran liegen würde das bei Select Case immer komplett alle Cases durchlaufen werden, was ich aber genau wie Du nicht im Test feststellen konnte.
Da das Buch neuer ist und sich auch explizit auf Office 2007 bezieht, gehe ich auch mal nicht davon aus das es sich um eine alte Behauptung handelt die mittlerweilen durch neuere Programmierkonzepte überholt wurde.
Gruß
Rainer
Anzeige
AW: bei mir (Excel 2002) ist Select Case schneller
23.04.2009 00:36:54
Daniel
und das bei einem Testszenario mit 60.000 Zeilen und einer Prüfung auf die Zufallsziffern 0-9
das ergebnis ist, wenn immer der 1. Case zieht, dann sind IF-THEN und SELECT CASE gleich schnell.
sind die Cases allerdings gleichwahrscheinlich (jeder Case kommt in etwa gleich häufig vor), dann ist Select Case c.a. doppelt so schnell.
hier mal das Testszenario.
als erstes muss "TestAufbauen" laufen, um die Zufallszahlen zu generieren.
zum Testen dann "Test" starten. Das Ergebnis wird im Direktfenster ausgegeben
über die Konstante y kann eingestellt werden, was getestet werden soll:
1 - alle Cases (zufallszahlen 0-9)
2 - immer der erste Fall (immer Wert 0)
3 - immer ein mittlerr Wert (immer 4)
4 - immer der letzte Fall (ELSE, immer 10)

Sub test()
Const x = 60000
Const y = 1
Debug.Print "If-Then: " & Format(IFTHEN(x, y), "0.000")
Debug.Print "Select : " & Format(SelectCase(x, y), "0.000")
End Sub



Sub TestAufbauen()
Columns(1).FormulaLocal = "=Ganzzahl(Zufallszahl()*10)"
Columns(1).Formula = Columns(1).Value
Columns(2).Value = 0
Columns(3).Value = 4
Columns(4).Value = 11
End Sub



Function IFTHEN(anz As Long, sp As Integer) As Double
Dim arr
Dim i As Long
Dim T As Double
arr = Range("A1:e" & anz)
T = Timer
For i = 1 To UBound(arr, 1)
If arr(i, sp) = 0 Then
arr(i, 5) = 9
ElseIf arr(i, sp) = 1 Then
arr(i, 5) = 8
ElseIf arr(i, sp) = 2 Then
arr(i, 5) = 7
ElseIf arr(i, sp) = 3 Then
arr(i, 5) = 6
ElseIf arr(i, sp) = 4 Then
arr(i, 5) = 5
ElseIf arr(i, sp) = 5 Then
arr(i, 5) = 4
ElseIf arr(i, sp) = 6 Then
arr(i, 5) = 3
ElseIf arr(i, sp) = 7 Then
arr(i, 5) = 2
ElseIf arr(i, sp) = 8 Then
arr(i, 5) = 1
ElseIf arr(i, sp) = 9 Then
arr(i, 5) = 0
Else
arr(i, 5) = 99
End If
Next
IFTHEN = Timer - T
End Function



Function SelectCase(anz As Long, sp As Integer) As Double
Dim arr
Dim i As Long
Dim T As Double
arr = Range("A1:E" & anz)
T = Timer
For i = 1 To UBound(arr, 1)
Select Case arr(i, sp)
Case 0
arr(i, 5) = 9
Case 1
arr(i, 5) = 8
Case 2
arr(i, 5) = 7
Case 3
arr(i, 5) = 6
Case 4
arr(i, 5) = 5
Case 5
arr(i, 5) = 4
Case 6
arr(i, 5) = 3
Case 7
arr(i, 5) = 2
Case 8
arr(i, 5) = 1
Case 9
arr(i, 5) = 0
Case Else
arr(i, 5) = 99
End Select
Next
SelectCase = Timer - T
End Function


Gruß, Daniel

Anzeige
Sagte's ja, Asymmetrie mit nach Häufigkeit...
23.04.2009 02:29:31
Luc:-?
...geordneter Reihenfolge gg Symmetrie (Ungleich- gg Gleichverteilung)... ;-)
Gruß Luc :-?
AW: bei mir (Excel 2002) ist Select Case schneller
23.04.2009 01:14:26
Daniel
und das bei einem Testszenario mit 60.000 Zeilen und einer Prüfung auf die Zufallsziffern 0-9
das ergebnis ist, wenn immer der 1. Case zieht, dann sind IF-THEN und SELECT CASE gleich schnell.
sind die Cases allerdings gleichwahrscheinlich (jeder Case kommt in etwa gleich häufig vor), dann ist Select Case c.a. doppelt so schnell.
hier mal das Testszenario.
als erstes muss "TestAufbauen" laufen, um die Zufallszahlen zu generieren.
zum Testen dann "Test" starten. Das Ergebnis wird im Direktfenster ausgegeben
über die Konstante y kann eingestellt werden, was getestet werden soll:
1 - alle Cases (zufallszahlen 0-9)
2 - immer der erste Fall (immer Wert 0)
3 - immer ein mittlerr Wert (immer 4)
4 - immer der letzte Fall (ELSE, immer 10)

Sub test()
Const x = 60000
Const y = 1
Debug.Print "If-Then: " & Format(IFTHEN(x, y), "0.000")
Debug.Print "Select : " & Format(SelectCase(x, y), "0.000")
End Sub



Sub TestAufbauen()
Columns(1).FormulaLocal = "=Ganzzahl(Zufallszahl()*10)"
Columns(1).Formula = Columns(1).Value
Columns(2).Value = 0
Columns(3).Value = 4
Columns(4).Value = 11
End Sub



Function IFTHEN(anz As Long, sp As Integer) As Double
Dim arr
Dim i As Long
Dim T As Double
arr = Range("A1:e" & anz)
T = Timer
For i = 1 To UBound(arr, 1)
If arr(i, sp) = 0 Then
arr(i, 5) = 9
ElseIf arr(i, sp) = 1 Then
arr(i, 5) = 8
ElseIf arr(i, sp) = 2 Then
arr(i, 5) = 7
ElseIf arr(i, sp) = 3 Then
arr(i, 5) = 6
ElseIf arr(i, sp) = 4 Then
arr(i, 5) = 5
ElseIf arr(i, sp) = 5 Then
arr(i, 5) = 4
ElseIf arr(i, sp) = 6 Then
arr(i, 5) = 3
ElseIf arr(i, sp) = 7 Then
arr(i, 5) = 2
ElseIf arr(i, sp) = 8 Then
arr(i, 5) = 1
ElseIf arr(i, sp) = 9 Then
arr(i, 5) = 0
Else
arr(i, 5) = 99
End If
Next
IFTHEN = Timer - T
End Function



Function SelectCase(anz As Long, sp As Integer) As Double
Dim arr
Dim i As Long
Dim T As Double
arr = Range("A1:E" & anz)
T = Timer
For i = 1 To UBound(arr, 1)
Select Case arr(i, sp)
Case 0
arr(i, 5) = 9
Case 1
arr(i, 5) = 8
Case 2
arr(i, 5) = 7
Case 3
arr(i, 5) = 6
Case 4
arr(i, 5) = 5
Case 5
arr(i, 5) = 4
Case 6
arr(i, 5) = 3
Case 7
arr(i, 5) = 2
Case 8
arr(i, 5) = 1
Case 9
arr(i, 5) = 0
Case Else
arr(i, 5) = 99
End Select
Next
SelectCase = Timer - T
End Function


Gruß, Daniel

Anzeige
AW: bei mir (Excel 2002) ist Select Case schneller
23.04.2009 09:59:02
Rainer
@ Daniel
Du hast da was missverstanden. ;)
Es ging nicht darum ob Select Case schneller als ein ElseIf-Aufbau ist, sondern darum das eine If Then Else Verschatelung bei Prüfung einer einzigen Bedingung schneller sein kann als Select Case.
ElseIf scheint intern anders abgehandelt zu werden wie das gleiche Konstrukt mit If Then Else Verschachtelung.
Gruß
Rainer
AW: Bau doch mal ein Testszenario auf
24.04.2009 00:48:31
Daniel
und lade es hier hoch, dann kann man es doch einfach ausprobieren
Gruß, Daniel
AW: warum if
22.04.2009 23:34:09
Daniel
Hi
in diesem Fall kann man das aber auch ganz anders lösen:

Dim Farbe(30) as integer
Farbe(10) = 3
Farbe(20) = 1
Farbe(30)=10
ActiveSheet.Shapes("Oval 2 " & InI).Fill.ForeColor.SchemeColor = Farbe(Range("M1").Value)


und braucht gar keine IF-Abfrage
Gruß, Daniel

Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige