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

For Next Schleife bricht nach einem Durchgang ab

Forumthread: For Next Schleife bricht nach einem Durchgang ab

For Next Schleife bricht nach einem Durchgang ab
Frank
Hallo wertes Forum,
sicher ist es ein leichtes mein Anliegen zu lösen, aber ich stehe gerade auf dem Schlauch. Ich möchte die Zielwertsuche in einer Schleife durchlaufen lassen und haben anstatt der festen Werte wie bspw. B8 Cells(i,2) hingeschrieben, leider geht das nicht so wie ich mir das denke. Anbei noch ein Bild. Ich denke der Sytax für Range ist irgendwie falsch....
https://www.herber.de/bbs/user/73789.jpg
Könntet Ihr mir bitte auf die Sprünge helfen? Vielen Dank und viele Grüße
Frank
Anzeige
AW: For Next Schleife bricht nach einem Durchgang ab
01.03.2011 17:06:01
Rudi
Hallo,
für eine einzelne Zelle nur Cells() ohne Range() drumrum.
Gruß
Rudi
AW: For Next Schleife bricht nach einem Durchgang ab
01.03.2011 18:06:42
Frank
Hallo Rudi,
danke für deine Antwort, das habe ich auch schon versucht, aber da erscheint nach einem Durchgang Laufzeitfehler 1004 - Anwendungs- oder objektorientierter Fehler.
Könntest du bitte noch einmal schauen?
Vielen Dank und viele Grüße
Frank
Anzeige
AW: For Next Schleife bricht nach einem Durchgang ab
02.03.2011 10:45:35
Uwe
Guten Tag, Frank,
nach Deiner Hochgeladenen arbeitsmappe steht in der Spalte 22 (Spalte "V") keine Formel. Wenn du die Spalte 10 (Spalte "J") meinst, dann läuft die Schleife und liefert Werte. Die Werte selbst allerdings zeigen, dass da noch irgendetwas von der Programmlogik schief läuft.
Gruß,
Uwe
P.S.
Zur Frage der Zellenadressierung, wenn sie denn mit dem Objekt Range durchgeführt wird:
Range("J" & i).GoalSeek Goal:=delta, ChangingCell:=Range("B" & i)
Cells(i, "J").GoalSeek Goal:=delta, ChangingCell:=Cells(i, "B")
Cells(i, 10).GoalSeek Goal:=delta, ChangingCell:=Cells(i, 10)
Alle drei Version bewirken die gleiche Aktion mit den selben Zellenwerten. Bei der dritten sind die wenigsten internen programmtechnischen Intergretationen erforderlich, daher ist diese bei der Programmierung vorzuziehen.
Zu Referenzierungsangaben auf Elemente (Objekte, Variablen):
Generell und vereinfacht formuliert gilt, dass man auf die übergeordneten Struktur (das Objekt), in der ein Elemtent enthalten ist, durch den Vorsatz des Objektnamensnamens vor dem untergeorneten Objekt-/Elementnamen setzt und beide durch einen Punkt voneinander trennt.

With Cells(i, 4)
esu = .Value
zeta = Cells(i, 10)
.Interior.Color = 5296274
If j = 2 Then GoTo Zeta_überspringen
If zeta > zeta_value Then
.Value = 25
SolverOk SetCell:=Cells(i, 5), MaxMinVal:=3, ValueOf:=zeta_value, ByChange:=. _
Value
SolverSolve UserFinish:=True
delta = delta - 0.01
zeta_value = 0.35
j = j + 1
.Offset(0, 1).Font.Bold = True
End If
Zeta_überspringen:
If esu 
Die With-Anweisung bewirkt, dass vor jedem Punkt in diesem Block als Objekt die Zelle in der i-ten Zeile und vierten Spalte zu setzen ist, z.B. eben:

esu = Cells(i, 4).Value
zeta = Cells(i, 10)
Cells(i, 4).Interior.Color = 5296274
If j = 2 Then GoTo Zeta_überspringen
If zeta > zeta_value Then
Cells(i, 4).Value = 25
SolverOk SetCell:=Cells(i, 5), MaxMinVal:=3, ValueOf:=zeta_value, ByChange:= _
Cells(i, 4).Value
SolverSolve UserFinish:=True
delta = delta - 0.01
zeta_value = 0.35
j = j + 1
Cells(i, 4).Offset(0, 1).Font.Bold = True
End If
Zeta_überspringen:
If esu 
Die Objektvariable Value wird, wenn nichts anderes bei eienr Zuweisung geschreiben steht vom Interpreter automatisch angefügt.
Die Anweisung:
Cells(i, 4).Offset(0, 1).Font.Bold = True 

bezieht sich also auf die Zelle in der gleichen Zeile und fünften Spalte.
Anzeige
Was soll das Bild vom Code?
01.03.2011 18:43:33
Reinhard
Hallo Frank,
zeige hier den Code oder besser lad eine aussagekräftige Mappe hoch.
Gruß
Reinhard
AW: Was soll das Bild vom Code?
01.03.2011 18:57:01
Frank
Hallo Reinhard,
klare Worte und keine Absicht meinerseits. Anbei die Mappe, ich bitte um Hilfe, da der Code nicht durchläuft. Auch würde mich interessieren, wie ich Goto Schleifen umgehe.
https://www.herber.de/bbs/user/73791.xlsm
Vielen Dank und viele Grüße Frank
Anzeige
AW: Was soll das Bild vom Code?
01.03.2011 19:41:12
Reinhard
Hallo Frank,
mal kurz mein erster Eindruck. Du benutzt brav Dim das findes ich Klasse. Noch besser wäre es du benutzt Option Explicit, in Extras--Optionen "Variablendeklariatonen erforderlich" anhaken und fertig für neue Mappen.
Das hat hier jeder angehakt.
Du benutzt Cells(x,y)
Deklariere IMMER die Variablen für Cells, also zeilen, Spalten als LONG. Völlig uninteressant ob es nur 5 Zeilen oder 3 Spalten sind.
Das kostet zwar 4 oder so Bytes mehr, was solls, aber es spart dir was wichtigeres, Zeit. Bei 1 Mio Zellen in XL2007 kommt das zum Tragen.
Denn Vba wandelt für Cells() alles was kommt sowieso in Long um, diese zeit verschenkst du.
Dann zum Select, zu 99,9% braucht man das sowenig wie Avctivate.
Beispiel:

Range("A8:AB54").Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
End With
Selection.Font.Bold = False

geht so schneller und übersichtlicher:

With Range("A8:AB54").Interior
.Pattern = xlNone
.TintAndShade = 0
End With
Range("A8:AB54").Font.Bold = False

oder ungeteset so:

With Range("A8:AB54").Interior
.Pattern = xlNone
.TintAndShade = 0
.Parent.Font.Bold = False
End With

Gruß
Reinhard
Anzeige
AW: Was soll das Bild vom Code?
01.03.2011 19:59:08
Frank
Hallo Reinhard,
vielen Dank für deine Hinweise. Ich bin Anfänger in dieser Thematik und immer dankbar, wenn jemand wie du mir eine Hilfestellung gibst. Ich habe verstanden was ich machen soll, aber so richtig klar wie du das meinst "und fertig für neue Mappen" verstehe ich nicht so recht. Mir fehlt dazu einfach der Hintergrund. Könntest du das etwas genauer erklären, bitte? Und wozu dient die Checkbox "Variablendeklarationen erforderlich"?
Zur eigentlichen Thematik: Bricht bei dir das Makro ebenfalls ab, mit der Meldung "Anwendungs oder Objektorientierter Fehler""?
Gruß Frank
Anzeige
AW: Was soll das Bild vom Code?
01.03.2011 20:02:38
Reinhard
Hallo Frank,
gute Einstellung, so habe ich hier auch "gelernt" bzw. bin noch dabei, alles mitnehmen was man an Hilfen bekommt und selbst testeten testen usw. bis man bzw. ich ein Aha-Erlebnis habe, dann sitzt es :-)
Der Haken sorgt dafür, ab jetzt steht atuomatisch in allen neuen mappen in Modulen das Option Explicit drinnen.
Äh, den Code habe ich noch gar nicht getestet.
Gruß
Reinhard
Anzeige
noch offen o.w.T
01.03.2011 20:04:01
Reinhard


;
Anzeige
Anzeige

Infobox / Tutorial

For Next Schleife in VBA: So behebst du häufige Probleme


Schritt-für-Schritt-Anleitung

  1. Erstelle ein neues VBA-Modul:

    • Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.
    • Klicke auf Einfügen und wähle Modul.
  2. Schreibe die For Next Schleife:

    Dim i As Long
    Dim delta As Double
    Dim zeta_value As Double
    
    For i = 1 To 10
       ' Hier deine Berechnungen und Zielwertsuche einfügen
       Cells(i, 10).GoalSeek Goal:=delta, ChangingCell:=Cells(i, 2)
    Next i
  3. Teste den Code:

    • Stelle sicher, dass alle verwendeten Zellen formatiert sind und die Daten korrekt sind.
    • Führe den Code aus, um sicherzustellen, dass die Schleife wie erwartet funktioniert.

Häufige Fehler und Lösungen

  • Laufzeitfehler 1004: Wenn du nach einem Durchgang den Fehler "Anwendungs- oder objektorientierter Fehler" erhältst, überprüfe, ob die Zellenadressierung korrekt ist. Vermeide die Verwendung von Range() für Einzelzellen. Stattdessen nutze Cells(i, j).

  • Keine Werte in den Zellen: Vergewissere dich, dass die Zellen, die du referenzierst, tatsächlich Werte enthalten. Das Fehlen von Werten in einer Zelle kann dazu führen, dass die Schleife nicht korrekt durchläuft.


Alternative Methoden

Eine effektive Möglichkeit, die For Next Schleife zu optimieren, ist die Verwendung von With-Anweisungen. Dies reduziert die Anzahl der Codezeilen und verbessert die Lesbarkeit:

With Cells(i, 2)
   .GoalSeek Goal:=delta, ChangingCell:=Cells(i, 10)
End With

Zusätzlich kannst du auch Do While-Schleifen in Betracht ziehen, wenn die Anzahl der Durchgänge nicht vorherbestimmt ist.


Praktische Beispiele

Hier ist ein einfaches Beispiel für die Verwendung einer For Next Schleife in VBA:

Sub Zielwertsuche()
    Dim i As Long
    Dim delta As Double
    delta = 10 ' Beispielwert

    For i = 1 To 10
        Cells(i, 10).GoalSeek Goal:=delta, ChangingCell:=Cells(i, 2)
    Next i
End Sub

In diesem Beispiel wird die Zielwertsuche für die Zellen in der 10. Spalte durchgeführt, wobei die Werte in der 2. Spalte geändert werden.


Tipps für Profis

  • Option Explicit verwenden: Aktiviere die "Variablendeklarationen erforderlich" Option in den VBA-Optionen, um sicherzustellen, dass alle Variablen deklariert sind. Das hilft, Fehler zu vermeiden und die Lesbarkeit zu verbessern.

  • Vermeide Select und Activate: Arbeite direkt mit den Zellen, um die Ausführungsgeschwindigkeit zu erhöhen. Zum Beispiel:

    Cells(i, 2).Value = 25
  • Fehlerbehandlung einfügen: Füge eine Fehlerbehandlungsroutine hinzu, um Fehler während der Ausführung zu erfassen und zu reagieren.


FAQ: Häufige Fragen

1. Was ist eine For Next Schleife?
Die For Next Schleife ist eine Schleifenstruktur in VBA, die es ermöglicht, einen Codeblock eine bestimmte Anzahl von Malen auszuführen.

2. Wie kann ich Laufzeitfehler in meiner Schleife vermeiden?
Überprüfe alle Zellreferenzen und stelle sicher, dass die Zellen, auf die zugegriffen wird, tatsächlich Werte enthalten. Vermeide die Verwendung von Range für Einzelzellen und nutze stattdessen Cells().

3. Was ist der Unterschied zwischen Cells und Range?
Cells wird verwendet, um auf Zellen über ihre Zeilen- und Spaltennummer zuzugreifen, während Range für einen Bereich von Zellen verwendet wird. Bei der Verwendung von Einzelzellen ist Cells oft die bessere Wahl.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige