Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Do While Schleife funktioniert nicht

Do While Schleife funktioniert nicht
13.05.2014 16:57:48
peter
Hey Leute,
ich versuche gerade ein kleines Problem zu lösen, dabei geht es um Folgendes:
Ich habe eine Seite mit Kontrollhäkchen. Diesen habe ich einen Zellenbezug auf einem anderen Arbeitsblatt gegeben, also eine einfache Tabelle mit 10 Werten untereinander, die entweder WAHR oder FALSCH anzeigen. Jetzt möchte ich ein VBA Makro nach dem Motto, wenn WHAR ist, dann mache das, schreiben. Aber, es sollen alle 10 Einträge direkt nacheinander abgearbeitet werden, sprich zu Beginn die erste Zelle, wenn WAHR dann bla, falls FALSCH, nächste Zeile abfragen, wenn WAHR DANN ... und so weiter, natürlich sollte auch, wenn WAHR erfüllt war, in der nächsten Zeile weiter gemacht werden. Nach 10 Zeilen soll das Ganze aufhören.
Ich bin mir relativ sicher, dass das gut mit einer While Schleife zu lösen wäre, aber ich komme irgendwie nicht so ganz drauf, was an meinem Ansatz nicht stimmt … :
Mein Ansatz:
Public Sub test()
Dim i As Integer
i = 3
Do While Worksheets("test").Cells(i, 2).Value = "WAHR"
If i = 10 Then
Exit Sub
End If
Worksheets("test").Cells(i, 5).Value = "bla"
i = i + 1
Loop
End Sub
Vor allem, das Komische ist, dass kein Fehler oder sonstiges ausgegeben wird, es passiert einfach nichts ... Vielen Dank für jederlei Hinweis!
Gruß
Peter

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Do While Schleife funktioniert nicht
13.05.2014 17:03:01
Daniel
Hi
du prüfst, ob in den Zellen der Text "WAHR" steht.
In den Zellen, die mit den Kontrollkästchen verknüpft sind, steht aber kein Text, sondern ein Wahrheitswert mit WAHR oder FALSCH.
diese Wahrheitswerte fragt man in VBA so ab:
Do While Worksheets("test").Cells(i, 2).Value = TRUE
allerdings frage ich mich, ob hier wirklich VBA von nöten ist oder ob nicht folgende Formel in Spalte E dasselbe Ergebnis liefern würde:
=Wenn(B3;"bla";"")
Gruß Daniel

AW: Do While Schleife funktioniert nicht
13.05.2014 17:17:51
EtoPHG
Hallo Peter,
Mal ein paar Grundlagen
Der Begriff WAHR in einer Zelle ist kein Text und darum auch nicht mit "WAHR" vergleichbar.
WAHR ist ein Boolean Wert (True/False, bzw. WAHR/FALSCH).
Dein Do While Schlaufe bricht beim ersten nicht-WAHR bzw. FALSCH ab, egal was nachher noch kommt, darum ist dieses Konstrukt hier auch völlig fehl am Platz.
Da du schon weisst, dass 10 Werte getestet werden müssen, nimm ein For-Next Konstrukt.
z.B.:
Public Sub test()
Dim lRow As Long
With Worksheets("test")     ' Mit diesem Blatt
For lRow = 3 To 13      ' Von Zeile 1 - 13
.Cells(lRow, 5).ClearContents   ' Löschen bevor setzen
If .Cells(lRow, 2) Then .Cells(lRow, 5) = "bla"     ' kurz Version
' oder Text der Zelle auswerten
If .Cells(lRow, 2).Text = "WAHR" Then .Cells(lRow, 5) = "bla"
Next lRow
End With
End Sub
Gruess Hansueli

Anzeige
AW: Do While Schleife funktioniert nicht
13.05.2014 23:57:44
peter
Hey Hansueli,
vielen Dank für deinen Hinweis, jetzt hat alles top geklappt! Daher wollte ich das Modell auf eine zweite Problemstellung übertragen, dabei funktioniert das allerdings leider nicht, nur warum?
Ich möchte auf mehreren Arbeitsblättern, die so durchnummeriert sind, Tabelle_1_D, Tabelle_2_D usw., den Inhalt löschen. Folgendes habe ich dafür definiert:
Public Sub clearData()
Dim count As Long
Application.ScreenUpdating = False
For count = 1 To 8
Call clear(count)
Next count
End Sub
Public Function clear(ByVal count As String)
Dim Sheet As String
On Error GoTo Error
Sheet = "Tabelle_" + count + "_D"
With Worksheets(Sheet)
.Range("A2:D2").Select
.Range(Selection, Selection.End(xlDown)).ClearContents
.Range("A2").Select
End With
Exit Function
Error:
Call casError
End Function
Was mache ich falsch? Hat das was mit Variablen-Unverträglichkeit String/Long zu tun oder woran liegt? (Davor bin auch so vorgegangen und es funktioniert). Danke!
Gruß
Peter

Anzeige
AW: Do While Schleife funktioniert nicht
14.05.2014 09:17:21
Daniel
Hi
zunächst einmal solltest du ausführlicher beschreiben, was "funktioniert nicht" bedeutet:
Gibts ne Fehlermeldung?
Wenn ja: Welche? In welcher Zeile tritt sie auf?, welche Werte haben die Variablen und verwendeten Zellen wenn der Fehler auftritt?
Wenn nein: Was sollte deinem Wunsch nach passieren und was passiert tatsächlich?
kleiner Tip noch:
lass diese pauschalen "On Error Goto Sprungmarke" in den Codes, weg, solange sich der Code noch in der Entwicklungs- oder Erprobungsphase befindet.
diese Fehlersprünge zum Programmende vernichten wichtige Hinweise, die du für eine schnelle Ursachenfindung und Fehlerbehebung benötigst (in welcher Zeile passiert, der Fehler, welche Werte haben die Variablen)
Die Fehlerbehandlungsroutinen kannst du dann einbauen, wenn der Code fertig getestet ist und fehlerfrei läuft.
Wenn im Reglulären Betrieb Fehlerabbrüche auftauchen können, dies aber nicht weiter schlimm ist und das Programm trotzdem weiterlaufen kann (in deinem Fall wäre dass, wenn nicht immer alle der benannten Tabellenblätter vorhanden sind), dann kapselt man diese einzelnen Zeilen in ein On Error Resume Next - On Error Goto 0, damit dann diese einzelne Zeile vom Fehlerabbruch ausgenommen ist.
Was auf den ersten Blick so auffällt:
du verwendest Funktionnamen und Variablenbezeichnungen, die VBA ebenfalls für eigene Funktionen verwendt (Sheet, Clear, Count), sowas kann funktionieren, es kann aber auch zu Verwechslungen und damit zu Problemen führen.
Sicherer ist hier, wirklich eindeutige Variablen- und Funktions- oder Sub-Benennungen zu verwenden, bspw durch die Verwendung von deutschen Namen (VBA spricht englisch), oder durch bestimmte Prä- oder Postfixe.
Beispiel:
Function "clear" -> "funcBlattinhalteLöschen"
Variable "sheet" -> "strMySheet" ("str" weil es sich um eine String-Variable handelt, "My", weil es eine von dir erstellte Variable ist)
noch ein Fehler: das "+" ist das Zeichen für die Addition, für das Verketten von Texten ist das "&" vorgesehen, man kann zwar "+" auch für das Verketten verwenden, allerdings Entscheidet hier Excel aufgrund der verwendeten Variablen, ob Verkettet oder Addiert wird. Besser ist daher, fürs Verketten das "&" zu verwenden.
ein richtiger Fehler ist, dass du die Zellen vor der Bearbeitung selektierst, aber nicht das Tabellenblatt vorher aktiverst.
Zellen selektieren kann man immer nur auf dem gerade aktiven Tabellenblatt, versucht du Zellen auf einem nichtaktiven Tabellenblatt zu aktivieren, dann gibts nen Fehler.
das Selektieren ist aber nicht notwendig:
Public Function clear(ByVal count As String)
on Error Resume next
With Worksheets("Tabelle_" + count + "_D")
.Range(.Range("A2:D2"), .Range("A2:D2").End(xlDown)).ClearContents
End With
On Error Goto 0
End Function
da jetzt deine unterfunktion nur aus einer einzigen effektiven Programmzeile besteht, stellt sich die Frage, obs nicht sinnvoller und übersichtlicher ist, diese in das Hauptmakro zu integrieren:
Public Sub clearData()
Dim myCount As Long
For myCount = 1 To 8
on Error Resume next
With Worksheets("Tabelle_" & myCount & "_D")
.Range(.Range("A2:D2"), .Range("A2:D2").End(xlDown)).ClearContents
End With
On Error Goto 0
Next myCount
End Sub
Gruß Daniel

Anzeige
AW: Do While Schleife funktioniert nicht
14.05.2014 11:03:00
EtoPHG
Hallo Peter,
Auch ganz im Sinne von Daniels Antwort, habe ich folgendes festzustellen:
Noch ein paar Grundlagen mehr:
1. Bezgl. Selects in VBA lies bitte diesen Artikel!
2. Als erste Codezeile gehört in jedes Modul Option Explicit. Das kannst du unter [x] Variablendeklarationen erforderlich in den Extras-Optionen des VBE einstellen!
3. Prozeduren und Funktionen sollten nur dann Public definiert werden, wenn sie wirklich Modul-übergreifend verwendet werden sollen. In deinem Fall also besser das Schlüsselwort Public weglassen.
4. Variablen-Benennungen sollen/dürfen sich nicht mit VBA-Schlüsselwörtern überschneiden. Das kann zu unerwartetem Codeverhalten führen. Z.B. ist Sheet ein VBA-Schlüsselwort! Also besser z.B. mySheet. Ob es sich bei einem Ausdruck um ein Schlüsselwort handelt, kannst du feststellen, wenn du den Cursor im VBE auf/in das Wort setzt und F1 drückst und du anschliessend eine Hilfe für den Ausdruck bekommst.
5. Fehlerbehandlungen vorsichtig/gezielt einsetzen. Lies dazu diesen Artikel! Im Zweifelsfall zuerst weglassen/auskommentieren und damit Testen/Debuggen um ggf. Fehlerquellen zu identifizieren/korrigieren. Später gezielt einbauen.
Codevorschlag, siehe Daniels Antwort.
Gruess Hansueli
Anzeige

19 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige