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

Alternative zu IF-Schleife

Alternative zu IF-Schleife
24.09.2013 07:31:39
Chris
Hallo VBAler,
folgendes Makro färbt mir im Range I alle Einträge mit "n.b." rot und setzt mir im range AJ zusätzlich den jeweilige Zelleninhalt auf den Inhalt der Zelle aus Range A & "n.b. - 0". Läuft soweit gut, leider aufgrund der IF-Schleife viel zu langsam.
Wie kann man das Makro umschreiben, so dass es genau dasselbe macht, aber deutlich schneller läuft...
sub x()
with this workbook.worksheets("Kunden")
For I = 7 to range("I800").end(xlup).row
if .cells(i,9).value ="n.b." then
.cells(i,1).interior.colorindex = 3
.cells(i,36).value = cells(i,1).value & "-" & cells(i,9).value & "0"
end if
next i
end with
Chris

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 08:19:33
fcs
Hallo Chris,
versuche es mal mit folgender Ergämzung. Die If-Anweisungen kannst du ja schlecht ersetzen, denn du willst ja prüfen. Ständige Bildschirmaktualisierung, Ereignismakros und Neuberechnungen können Makros jedoch extrem verlangsamen.
Gruß
Franz
Sub x()
Dim StatusCalc as Long
'Makrobremsen lösen
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
With ThisWorkbook.Worksheets("Kunden")
For i = 7 To Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
End If
Next i
End With
'Makrobremsen zurücksetzen
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
End Sub

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 09:37:08
Chris
Hallo Franz,
danke, läuft nun wesentlich schneller. Kannst du mir die Zeilen mal kurz erklären:
Dim StatusCalc as Long
'Makrobremsen lösen
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation
.Calculation = xlCalculationManual
End With
Und bei der Gelegeneit: Ich habe diese Makro auf einen Button innerhalb einer Userform gelegt. Bei Klick soll geprüft werden, ob ToggleButton40 True oder false ist, und dann sollen die Zellen jeweils rot oder grün gefärbt werden. Der erste Teil (färbe rot läuft, nicht jedoch der zweiter "färbe grün" bei ToggleButton40 = false)´
If togglebutton40=true then
With ThisWorkbook.Worksheets("Kunden")
For i = 7 To Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
else
if togglebutton40=false then
With ThisWorkbook.Worksheets("Kunden")
For i2 = 7 To Range("I800").End(xlUp).Row
If .Cells(i2, 9).Value = "n.b." Then
.Cells(i2, 1).Interior.ColorIndex = 4
.Cells(i2, 36).Value = Cells(i2, 1).Value & "-" & Cells(i2, 9).Value & "1"
End If
Next i2
End With
end if
end if
next i
end with
end if
end sub

Anzeige
Erklärung und Togglebutton...
24.09.2013 09:47:20
EtoPHG
Hallo Chris,
Um eine Erklärung der Codezeilen zu erhalten, setze den Cursor im VB-Editor auf ein Keyword (z.B. EnableEvents) und drücke F1!
Das Problem mit dem Togglebutton kannst du durch Ergänzung der 2 Codezeile erreichen, nämlich
' statt
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
' schreibe
If ToggleButton40 Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
Else
.Cells(i, 1).Interior.ColorIndex = 4
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "1"
End if
Gruess Hansueli

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 09:57:41
Rudi
Hallo,
Sub AAA()
'Makrobremsen lösen
With Application
StatusCalc = .Calculation
.EnableEvents = False
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
With ThisWorkbook.Worksheets("Kunden")
For i = 7 To .Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then
If togglebutton40 = True Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
Else
.Cells(i2, 1).Interior.ColorIndex = 4
.Cells(i2, 36).Value = Cells(i2, 1).Value & "-" & Cells(i2, 9).Value & "1"
End If
End If
Next i
End With
'Makrobremsen zurücksetzen
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
End Sub

Gruß
Rudi

Anzeige
Woher kommt denn i2, Rudi?!! ;-) (owT)
24.09.2013 10:03:24
EtoPHG

AW: Alternative zu IF-Schleife
24.09.2013 10:30:35
fcs
Hallo Chris,
Dim StatusCalc as Long 'Merker-Variable für den aktuellen Status des Berechnungs-Modus
'Makrobremsen lösen
With Application
.EnableEvents = False 'Deaktiviert Ereignismakros
'Die im Tabellenblatt definierten Ereignismakros WorkSheet_Change usw.  werden nicht ausgeführt. _
'Wenn keine Ereignismakros vorhandne sind, dann kann man diese Option natürlich weglassen.
StatusCalc = .Application.Calculation 'aktuellen Status merken
.Calculation = xlCalculationManual 'Berechnungsmodus auf manuell setzen.
'In den Tabellenblättern werden keine Berechnungen mehr automatisch durchgeführt
End With
Sowhl die Ereignismakros als auch das ständige Neuberechnen der Tabellenblätter kann die Ausfü _
hrung eines Makros extrem verlangsamen.

bei der Logik der If-Prüfungen hast du dich irgendwie total verheddert.
'entweder so
With ThisWorkbook.Worksheets("Kunden")
For i = 7 To Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then
If togglebutton40 = True Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
Else
.Cells(i, 1).Interior.ColorIndex = 4
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "1"
End If
End If
Next i2
End With
'oder so
With ThisWorkbook.Worksheets("Kunden")
If togglebutton40 = True Then
For i = 7 To Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
End If
Next i
Else
For i2 = 7 To Range("I800").End(xlUp).Row
If .Cells(i2, 9).Value = "n.b." Then
.Cells(i2, 1).Interior.ColorIndex = 4
.Cells(i2, 36).Value = Cells(i2, 1).Value & "-" & Cells(i2, 9).Value & "1"
End If
Next i2
End If
End With
Gruß
Franz

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 12:34:54
Chris
Hallo Franz,
vielen Dank - beide laufen!
Nun hab ich als VBA-Beginner noch Fragen:
Die Logik der IF-Prüfung: wir nehmen mein makro, was nicht läuft: Wenn ich mir das in Worten nachspreche klingt das für mich völlog logisch:
Wenn Knopf40 = true (also heringedrückt), dann mache das und das
SONST WENN Knop40 = false (nicht nicht heringedrückt), dann mache das und das..
am Ende löse ich dann der Reihenfolge nach VON UNTEN alle IFs, Fors und Withs auf....
Völlig logisch...finde ich :-)
..nun hat der VBA-Editor keinen Bock auf mein Makro.
Wieso funktioniert meines nicht? Ich hab das offensichtlich Defizite im grundaufbau von IF-SChleifen...
Ich weiss, es gibt eine Hilfe, aber mir hilft sie leider wenig...Wenn jemand einfach erklärt bringt mir das mehr...
Deine Makro finde ich auch völlig logisch, sagen dasselbe aus wie meines...oder nicht?
Danke,
Chris

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 12:36:21
Chris
Hallo Franz,
vielen Dank - beide laufen!
Nun hab ich als VBA-Beginner noch Fragen:
Die Logik der IF-Prüfung: wir nehmen mein makro, was nicht läuft: Wenn ich mir das in Worten nachspreche klingt das für mich völlog logisch:
Wenn Knopf40 = true (also heringedrückt), dann mache das und das
SONST WENN Knop40 = false (nicht nicht heringedrückt), dann mache das und das..
am Ende löse ich dann der Reihenfolge nach VON UNTEN alle IFs, Fors und Withs auf....
Völlig logisch...finde ich :-)
..nun hat der VBA-Editor keinen Bock auf mein Makro.
Wieso funktioniert meines nicht? Ich hab das offensichtlich Defizite im grundaufbau von IF-SChleifen...
Ich weiss, es gibt eine Hilfe, aber mir hilft sie leider wenig...Wenn jemand einfach erklärt bringt mir das mehr...
Deine Makro finde ich auch völlig logisch, sagen dasselbe aus wie meines...oder nicht?
Danke,
Chris

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 12:50:09
Rudi
Hallo,
dein Makro läuft nur, wenn der Togglebutton=true ist.
Ich hab dir das mal eingerückt. Dann siehst du es besser.
If togglebutton40 = True Then '1.If
With ThisWorkbook.Worksheets("Kunden")
For i = 7 To Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then   '2.If
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
Else 'bezieht sich auf 2.If
If togglebutton40 = False Then '3.If
With ThisWorkbook.Worksheets("Kunden")
For i2 = 7 To Range("I800").End(xlUp).Row
If .Cells(i2, 9).Value = "n.b." Then  '4.If
.Cells(i2, 1).Interior.ColorIndex = 4
.Cells(i2, 36).Value = Cells(i2, 1).Value & "-" & Cells(i2, 9).Value & "1"
End If  'Ende 4.If
Next i2
End With
End If        'Ende 3.If
End If          'Ende 2.If
Next i
End With
End If                'Ende 1.If
Gruß
Rudi

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 15:02:27
Chris
Hallo Rudi,
wenn sich ELSE auf das 2. IF bezieht, heißt das, dass es die Anweisung ELSE IF ja nicht geben dürfte, bzw. der Code hinter ELSE IF nicht ausgeführt wird.
Also in Worten gibt es "sonst wenn" in vba nicht....
Richtig? kann ich mir jedoch nicht vorstellen..
Wieso bezieht sich ELSE auf das zweite if?*kompliziert*
Chris

AW: Alternative zu IF-Schleife
24.09.2013 15:26:23
EtoPHG
Hallo Chris,
Nochmals anders ausgedrückt:
Ein If Then Anweisungen Else Anweisungen End If Konstrukt muss immer in sich abgeschlossen sein. In Anweisungen können wieder If Then - Else - End If-Konstrukte auftauchen, aber die Verschachtelungen dürfen sich nicht überschneiden!
Dein 1. If hat kein Else Zweig und damit werden alle Anweisunge in seinem Then Zweig nur dann durchlaufen, wenn die Bedingung togglebutton40 = True zutrifft.
Frage: Warum hast du meinen Vorschlag nicht ausprobiert. Nämlich nur die inneren 2 Codezeilen in ein If-Then-Else-End If Konstrukt zu verpacken ?
Gruess Hansueli

Anzeige
AW: Alternative zu IF-Schleife
24.09.2013 15:28:57
Rudi
Hallo,
das hast du nicht verstanden.
Wenn vor dem ELSE ein End If stünde, wäre das 2.If abgeschlossen und Else würde sich auf das erste If beziehen. Da das aber nicht er Fall ist, bezieht sich Else auf das 2.If.
Nochmal zur Verdeutlichung der Reihenfolge der Abarbeitung:
       If togglebutton40 = True Then '1.If
        
       With ThisWorkbook.Worksheets("Kunden")
       For i = 7 To Range("I800").End(xlUp).Row
       If .Cells(i, 9).Value = "n.b." Then '2.If
       .Cells(i, 1).Interior.ColorIndex = 3
       .Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
       Else 'bezieht sich auf 2.If
       If togglebutton40 = False Then '3.If
       With ThisWorkbook.Worksheets("Kunden")
       For i2 = 7 To Range("I800").End(xlUp).Row
       If .Cells(i2, 9).Value = "n.b." Then '4.If
       .Cells(i2, 1).Interior.ColorIndex = 4
       .Cells(i2, 36).Value = Cells(i2, 1).Value & "-" & Cells(i2, 9).Value & "1"
       End If 'Ende 4.If
       Next i2
       End With
       End If 'Ende 3.If
       End If 'Ende 2.If
       Next i
       End With
       End If

Gruß
Rudi

zur letzten Verwirrung...
24.09.2013 16:33:11
Rudi
Hallo,
kann man den Code auch noch erheblich verkürzen.
  With ThisWorkbook.Worksheets("Kunden")
    For i = 7 To .Range("I800").End(xlUp).Row
      If .Cells(i, 9).Value = "n.b." Then
          .Cells(i, 1).Interior.ColorIndex = togglebutton40 + 4
          .Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & togglebutton40 + 1
      End If
    Next i
  End With


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß
Rudi

Um die 'Verwirrung' zu komplettieren, ...
25.09.2013 14:00:18
Luc:-?
…Chris;
natürlich gibt's auch ein „Sonst Wenn“, nämlich ElseIf … Then (zusammengeschrieben), welches sich im Gegensatz zu Else: If … Then direkt dem letzten nicht abgeschlossenen If unterordnet, während im 2.Fall ein neues If … Then-Konstrukt im Else-Zweig des letzten nicht abgeschlossenen If begonnen wird.
In J[ava]Script würden solche Verschachtelungen übrigens eher so aussehen (falls du an {…} gewöhnt bist):
if (a==b){
aktion1a;
if (b!=c){
aktion1b;
}
}
else {
aktion2;
}
Gruß Luc :-?

AW: Alternative zu IF-Schleife
24.09.2013 09:53:11
Chris
Hallo Franz,
danke, läuft nun wesentlich schneller. Kannst du mir die Zeilen mal kurz erklären:
Dim StatusCalc as Long
'Makrobremsen lösen
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation
.Calculation = xlCalculationManual
End With
Und bei der Gelegeneit: Ich habe diese Makro auf einen Button innerhalb einer Userform gelegt. Bei Klick soll geprüft werden, ob ToggleButton40 True oder false ist, und dann sollen die Zellen jeweils rot oder grün gefärbt werden. Der erste Teil (färbe rot läuft, nicht jedoch der zweiter "färbe grün" bei ToggleButton40 = false)´
If togglebutton40=true then
With ThisWorkbook.Worksheets("Kunden")
For i = 7 To Range("I800").End(xlUp).Row
If .Cells(i, 9).Value = "n.b." Then
.Cells(i, 1).Interior.ColorIndex = 3
.Cells(i, 36).Value = Cells(i, 1).Value & "-" & Cells(i, 9).Value & "0"
else
if togglebutton40=false then
With ThisWorkbook.Worksheets("Kunden")
For i2 = 7 To Range("I800").End(xlUp).Row
If .Cells(i2, 9).Value = "n.b." Then
.Cells(i2, 1).Interior.ColorIndex = 4
.Cells(i2, 36).Value = Cells(i2, 1).Value & "-" & Cells(i2, 9).Value & "1"
End If
Next i2
End With
end if
end if
next i
end with
end if
end sub

AW: Alternative zu IF-Schleife
24.09.2013 11:09:11
Kawensmann
Hallo,
zwei kurze Ergänzungen zu den Lösungen:
1. Wenn "Range("I800"..." sich auch auf das Blatt "Kunden" bezieht, gehört wohl noch ein Punkt davor (sonst nimmt er hier das aktive Blatt ...)
2. Die Prüfung auf die letzte Zeile:

Range("I800").end(xlup).row
gehört nicht in die For-Schleife. Die Zeile sollte vorher ermittelt und in einer Variablen gespeichert werden, sonst sucht er die Zeile ja bei jedem Durchlauf.
also besser:
Dim lngRow As Long
With ThisWorkbook.Worksheets("Kunden")
lngRow = .Range("I8000").End(xlUp).Row
For i = 7 To lngRow

Gruß
Kawensmann

AW: Alternative zu IF-Schleife
24.09.2013 11:37:44
EtoPHG
Hallo Kawesmann,
Zitat:gehört nicht in die For-Schleife. Die Zeile sollte vorher ermittelt und in einer Variablen gespeichert werden, sonst sucht er die Zeile ja bei jedem Durchlauf.

Da irrst du dich aber gewaltig! Der Endwert einer For-Schlaufe wird genau 1 mal (bei Eintritt) festgelegt und ändert sich nie, selbst dann wenn du ihn innerhalb der Schlaufe per Code verändern würdest!
Gruess Hansueli

AW: Alternative zu IF-Schleife
24.09.2013 11:54:53
Kawensmann
Da irrst du dich aber gewaltig!
Ruhig Brauner, du hast ja Recht ...
Gruß
Kawensmann

For i=7 to .Range(....
24.09.2013 14:35:09
Rudi
Hallo,
das kannst du ruhig so schreiben.
Geh mal eine For-Schleife per F8 durch. Die For-Zeile wird nie mehr durchlaufen.
Gruß
Rudi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige