对于Excel VBA中的每个循环,我如何引用公式中的单元格地址?

一旦公式被附加到单元格中,我最初注释掉的代码需要用户拖拽公式。 我已经修改了下面的过程,我从一个For each cell循环切换 – 可以这样做已经完成了For each循环结构? 利用Cell.address或类似的东西? 请假设我的variables都已定义。

 Dim client_row As Long 'Dim v As Long Dim v As Variant Dim i As Integer i = 2 client_row = 0 LASTROW2 = Range("B" & Rows.Count).End(xlUp).Row Set rng2 = Range("N2:N" & LASTROW2) ' For Each cell In rng2 ' If cell.Offset(0, -13) <> "" Then ' cell.Formula = "=IFERROR(TEXT(IF(F2=""GBP"",($H2-(IF(LEN($C2)=7,BDH($C2&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH($C2&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/$H2/100,IF(E2=""EQ"",($H2-(IF(LEN($C2)=7,BDH($C2&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH($C2&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/$H2,($H2-(IF(LEN($C2)=7,BDH($C2&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH($C2&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/$H2*100)),""0.00""),""PLEASE REVIEW"")" ' Debug.Print cell ' End If ' Next cell For Each v In rng2 If v.Offset(0, -13) <> "" Then v.Formula = "=IFERROR(TEXT(IF($F" & i & "=""GBP"",($H2-(IF(LEN($C2)=7,BDH($C2&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH($C2&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/$H2/100,IF(E2=""EQ"",($H2-(IF(LEN($C2)=7,BDH($C2&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH($C2&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/$H2,($H2-(IF(LEN($C2)=7,BDH($C2&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH($C2&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/$H2*100)),""0.00""),""PLEASE REVIEW"")" i = i + 1 Debug.Print i End If Next v 

在这种情况下,您可以使用rng2.FormulaR1C1属性。 它允许你指定一个相对引用 ,这意味着你不需要跟踪当前行。

注释部分可以写成如下:

 Set rng2 = Range("N2:N" & LASTROW2) For Each cell In rng2 If cell.Offset(0, -13) <> "" Then cell.FormulaR1C1 = "=IFERROR(TEXT(IF(RC[-8]=""GBP"",(RC[-6]-(IF(LEN(RC[-11])=7,BDH(RC[-11]&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH(RC[-11]&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/RC[-6]/100,IF(RC[-9]=""EQ"",(RC[-6]-(IF(LEN(RC[-11])=7,BDH(RC[-11]&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH(RC[-11]&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/RC[-6],(RC[-6]-(IF(LEN(RC[-11])=7,BDH(RC[-11]&"" ""&""SEDOL"",""PX_LAST"",TODAY()),BDH(RC[-11]&"" ""&""CUSIP"",""PX_LAST"",TODAY()))))/RC[-6]*100)),""0.00""),""PLEASE REVIEW"")" Debug.Print cell End If Next cell 

正如在你的链接问题中所说的,你也可以使用v.Column获取循环中当前单元格的列。 没有像For Each cell In range那样的特殊结构。 cell在这种情况下只是一个指向单元格的对象variables,就像你的例子中的v

为了让你的生活变得简单一些,只需将v声明为Range ,那么IntelliSense就会显示v可能属性和方法。

卢克的回答是设置相对地址的另一个好方法;)