2017-02-17 1 views
0

Ich schreibe einen Code, der in verschiedene Blätter und führt GoalSeek auf Zeilen, die das Wort "Obj" und "Var" haben. Nachdem ich mein erstes Blatt fertiggestellt habe, geht der Code auf das zweite Blatt über und gibt den Befehl error 1004 aus. Es sagt meine Referenz für die Do ... Loop Funktion ist nicht mehr gültig. Warum könnte das sein?GoalSeek Inside-Schleife - Laufzeitfehler 1004: Referenz ist nicht gültig

Sub GoalSeek() 

Dim FirstAddress As String 
Dim SecondAddress As String 
Dim Arr As Variant 
Dim Rng As Range 
Dim Rng2 As Range 
Dim y As Long 
Dim i As Long 

Arr = Array("SheetA", "SheetB") 

For i = LBound(Arr) To UBound(Arr) 

    With Worksheets(Arr(i)).Range("A1:BZ500") 

    Set Rng = .Find("Obj", LookIn:=xlValues) 

    If Not Rng Is Nothing Then 

     FirstAddress = Rng.Address 

     Set Rng2 = .Find("Var", LookIn:=xlValues) 

     If Not Rng2 Is Nothing Then 

      SecondAddress = Rng2.Address 

      'Error Occurred Here 
      Do 

       Rng.Offset(0, y + 1).GoalSeek Goal:=0, ChangingCell:=Rng2.Offset(0, y + 1) 

       y = y + 1 

      Loop Until y = 12 

     End If 

    End If 

    End With 

Next i 

End Sub 
+0

bedeutet, dass es eine Anomalie ... viele mögliche Gründe. d. h. der Zielsuchbereich hat keine Formel, seine Formel hängt nicht von der 'ChangingCell' ab, die letztere war leer, die Formel zu kompliziert, die Berechnung konnte keine Lösung finden, etc ... –

Antwort

0

ich denke, das Ihr Problem sein könnte:

Sie y am Anfang initialisieren,

dim y as long 

und standardmäßig den Wert 0 hat. Sie machen diese Annahme während der Schleife

Do 
    Rng.Offset(0, y + 1).GoalSeek Goal:=0, ChangingCell:=Rng2.Offset(0, y + 1) 
    y = y + 1 
Loop Until y = 12 

Für das erste Blatt, y=0,1,2,3,...,12 stoppt dann die Schleife. Dann verlassen Sie y=12 und gehen Sie auf Ihr nächstes Blatt.

Also für das zweite Blatt gehen Sie in die Do Schleife mit y=12 und erhalten einen Fehler. Sie sollten Ihren Code wie folgt ändern:

y = 0 
Do 
    Rng.Offset(0, y + 1).GoalSeek Goal:=0, ChangingCell:=Rng2.Offset(0, y + 1) 
    y = y + 1 
Loop Until y = 12 

Wenn Sie stattdessen eine Do While ... Loop benutzt hatte, würden Sie wahrscheinlich bemerkt haben dies früher, weil die Schleife würde nie selbst als die Bedingung nicht erfüllt wurde eingegeben wurden.

y = 0 
Do While y < 12 
    Rng.Offset(0, y + 1).GoalSeek Goal:=0, ChangingCell:=Rng2.Offset(0, y + 1) 
    y = y + 1 
Loop 

Wirklich obwohl, für eine Schleife dieses einfache, eine For Schleife wird immer leichter zu diagnostizieren als eine Do Schleife ...

For y = 0 to 11 
    Rng.Offset(0, y + 1).GoalSeek Goal:=0, ChangingCell:=Rng2.Offset(0, y + 1) 
Next y 
+0

danke! Ihr Rat hat mir sehr geholfen. Der Code funktioniert jetzt! – kchungg

Verwandte Themen