2016-03-31 170 views
1

我目前正在编写一个自动化goalseek的代码,但我遇到了语法问题。Excel VBA:迭代多个范围

我声明3个变量:

Dim X as Range 
Dim Y as Range 
Dim Z as Range 

Set X as Range(....) 
Set Y as Range(....) 
Set Z as Range(....) 

For each cell in X,Y,Z 
X.GoalSeek Goal:=Y, ChangingCell:=Z 
Next cell in X,Y,Z 

这是伪代码,但我希望它由一个在每个范围中X,Y,Z中的细胞进行迭代之一。

这些是列范围。

问:我如何让范围为X,Y,Z的每个单元迭代放入goalseek函数?所以如果每个范围有5个单元格,它将运行5次。

+0

有可能是一个问题(某人)隐藏在内。你可以帮我找到它,所以我们可以回答它:http://stackoverflow.com/tour – Ralph

+0

对不起,修正它 – AltoidsBenefitsH

回答

1
  1. For ... Each不允许逗号in后分隔的参数,所以你必须出示“一”的范围吧...

    如果你想说For Each cell ...则必须使用范围分解成细胞
  2. 他们.Cells财产

  3. For ... Each然后你应该用循环变量(cell)代替XY,工作Z

Sub Test() 
Dim X As Range, Y As Range, Z As Range 
Dim C As Range 

    Set X = [A1] 
    Set Y = [B1:B2] 
    Set Z = [C1:C3] 

    For Each C In Union(X.Cells, Y.Cells, Z.Cells) 
     MsgBox C.AddressLocal 
    Next C 
End Sub 

Union(...)替代语法将

For Each C In Union(X, Y, Z).Cells 

这可能使它更清晰,你tieing 3米范围在一起,然后解决他们的每一个细胞...味道的问题可能

编辑 要形成你的(大小相等)的三倍范围,并将它们送入单一的功能,计算范围Y偏移量和Z到X的假设下

例如

Sub Test() 
Dim X As Range, Y As Range, Z As Range 
Dim C As Range 
Dim OYR As Long, OYC As Long, OZR As Long, OZC As Long 

    Set X = [A1:A5] 
    Set Y = [B3]  'no need to provide full range, starting point will do 
    Set Z = [C5] 

    ' calculating offsets 
    OYR = Y(1, 1).Row - X(1, 1).Row + 1 
    OYC = Y(1, 1).Column - X(1, 1).Column + 1 

    OZR = Z(1, 1).Row - X(1, 1).Row + 1 
    OZC = Z(1, 1).Column - X(1, 1).Column + 1 

    ' iterate thru all cells of X and their equally ofsett partners in Y and Z 
    For Each C In X.Cells 
     MsgBox C.AddressLocal & " " & C(OYR, OYC).AddressLocal & " " & C(OZR, OZC).AddressLocal 
    Next C 

End Sub 
+0

所以,我们说我想X + Y = Z与X = [A1:A5] Y = [B1: B5] Z = [C1:C5]联合运算符允许我创建这样的联合范围[A1:C1]?如何输入该范围内的每个单元格的位置,以便可以在goalseek公式中使用它? – AltoidsBenefitsH

+0

你的问题是迭代通过3个不同范围的所有单元......在循环内所有3个范围的每个单元“出现”为C ...所以如果你想为这些单元中的每个单元调用一个函数“GoalSeek”只需用'GoalSeek C'替换'MsgBox ...'...... – MikeD

+0

AAHH ...是您的问题,为相同大小的范围形成TRIPLES(A,B,C)并将这些TRIPLES提供给函数? – MikeD