2017-02-17 119 views
0

我正在写进入不同的床单和有词“目标文件”和“VAR”行执行GoalSeek代码。完成我第一片材之后,代码移动到所述第二片材,并促使error 1004。它说我对Do ... Loop函数引用不再有效。为什么会这样?GoalSeek内循环 - 运行时错误1004:引用无效

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

意味着有一个异常......很多可能的原因。即goalseeking范围内没有一个公式,其计算公式并不依赖于'ChangingCell',后者是空的,公式过于复杂,计算未能找到解决办法,等等...... –

回答

0

我认为这可能是您的问题:

您在开始初始化y

dim y as long 

默认情况下它的值是0。您在循环

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

对于第一板中做这样的假设,然后y=0,1,2,3,...,12循环停止。 那么你要离开y=12并移动到你的下一个表。

因此,对于第二张表,您将进入Do循环,并显示错误信息y=12。你应该修改你的代码如下:

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

如果你使用一个Do While ... Loop相反,你可能已经注意到了这迟早会因为从来没有被作为条件不成立进入循环。

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

真的不过,对于一个循环这个简单,一个For循环将永远是更容易比Do环路诊断...

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

感谢!你的建议确实帮助了很多。代码正在工作! – kchungg