Wie kann man zwei Variablen in einer For-Schleife hochzählen lassen (in VBA ) ?
Ich möchte mithilfe von VBA eine bedingte Formatierung (Hintergrundfarbe) von einzelnen Zellen(jede zweite im Bereich von 2 - 34) innerhalb einer Spalte durchführen. Ist der Wert der entsprechenden Spalte gleich des Wertes in der Zelle links daneben (B), soll die Zelle einen grünen Hintergrund bekommen, ansonsten gelb. Die Spaltenbezeichnungen wollte ich mithilfe einer For-Schleife hochzählen lassen. Wie kann ich dies möglichst einfach realisieren?
Ich bin gerade dabei VBA zu erlernen und dementsprechend noch unerfahren.
5 Antworten
Du brauchst keine zweite Variable und daher auch keine zweite For-Schleife.
Einfach:
If Range("c"& i ).Value=Range("b"& i ).Value
und das
For n= ...
...
Next n
weglassen.
Du musst den Teil hinter dem Else am besten in eine neue Zeile packen und dann mit End If abschließen. Die Schleife an sich sollte aber funktionieren.
Also so:
If Range("c" & i).Value = Range("b" & n).Value Then Range("c" & i).Interior.Color = vbGreen Else Range("c" & i).Interior.Color = vbYellow End If
Ich denke aber, dass du nicht den Effekt haben willst, den deine Funktion macht. Du willst wahrscheinlich vergleichen, ob der Wert in Spalte B genauso ist, wie der Wert in Spalte C und dann halt die Zellen in Spalte C entweder Grün oder Gelb hinterlegen. Wenn das der Fall ist, brauchst du aber nur eine Schleife und nicht zwei ineinander geschachtelte Schleifen. Statt dem n kannst du dann zum Vergleich auch einfach das i nehmen.
So, wie du es machst, wird im ersten Durchlauf die 12 aus der Zelle C2 mit jedem Wert aus der Spalte B verglichen und die Farben werden immer wieder überschrieben. Der letzte Vergleich (C2 mit B34) bleibt dann stehen, wird also Gelb. Das passiert mit jeder Zelle in C. Die werden alle Gelb, weil halt der letzte Vergleich immer mit B34 ist)
Also das, was ich denke, was du vorhast, würde so gehen:
For i = 2 to 34 Step 2 If Range("c" & i).Value = Range("b" & i).Value Then Range("c" & i).Interior.Color = vbGreen Else Range("c" & i).Interior.Color = vbYellow End If Next i
Alternativ kannst du dein Problem natürlich auch ohne VBA lösen, indem du einfach die Werte von der Spalte B mit C vergleichst. Z.B. in D2 die Formel =WENN(B2=C2;1;0) und dann nach 1 oder 0 filtern oder meinetwegen eine bedingte Formatierung für 1 oder 0 einstellen.
So wie du es gemacht hast, funktioniert es schon. Du hast nur das "End If" vergessen ;)
Übersichtlicher ist es übrigens, wenn du jede For-Schleife entsprechend einrückst:
For i = 2 To 34 Step 2
For n = 2 To 34 Step 2
' deine Prozedur
Next n
Next i
Dann weißt du immer, wo du gerade arbeitest. In deinem Fall nicht so wichtig, aber später dann schon.
Außerdem ist die Zuweisung i = 2 und n = 2 vor Beginn der Schleifen nicht nötig, er initiiert diese Variablen automatisch mit dem Startwert der Iteration.
Reicht nicht eine Schleife über alle Zeilen, in der geschaut wird, ob der Wert in Spalte B dem aus Spalte C entspricht?
Den Else-Zweig kannst du dir komplett schenken, wenn du die komplette Tabelle vor der Schleife gelb einfärbst.
x = x+1
y = y+1
next