使用if语句和结构化引用的每个循环的Excel vba

时间:2016-01-27 23:27:44

标签: excel vba

我想基于使用结构化引用的同一表中另一列的值来更改表的列中的值。到目前为止,我有类似的东西:

Sub Test
For Each cell In Worksheets("FNM_DB").Range("DB_SS[Resource_Loc_Type]")
 If cell.Value = "TH" Then
   Worksheets("FNM_DB").Range("DB_SS[Resource]") = Worksheets("FNM_DB").Range("DB_SS[SOURCE_AND_SINK_NAMES]")
  End If
  Next cell
End Sub

我知道如果没有结构化引用,我可以做到这一点,但我希望代码更具可读性。有没有办法循环所有的值?我知道@指的是一个特定的行,但我不知道如何在这个实例中使用它。

2 个答案:

答案 0 :(得分:2)

以上陈述

  

@符号引用当前行,但该语法仅适用于工作表单元格,而不适用于VBA。

false

有效

[tblActualsWithFacts[@1c]].Select 

这些工作

Range("tblActualsWithFacts[@1c]").Select 

For i = 1 to 12
    Range("tblActualsWithFacts[" & i & " c]").Select
Next i 

然而,上述技术的组合,即连接使用“@”的结构化参考不起作用,因此 NOT 工作

For i = 1 to 12
   Range("tblActualsWithFacts[@" & i & " c]").Select
Next i 

答案 1 :(得分:0)

虽然可以在VBA中使用结构化引用,但寻址当前行是不同的。 @符号引用当前行,但该语法仅适用于工作表单元格,而不适用于VBA。

如果您担心可读性,我不确定长语法是否有用。我的建议是创建表示表列名与当前列的偏移量的变量。像这样:

Sub test()
Dim Height As Integer, Width As Integer, Result As Integer
Result = 3
Height = 1
Width = 2

For Each cel In Worksheets("Sheet1").Range("SizingTable[Colour]")
    If cel.Value = "red" Then
        cel.Offset(0, Result) = cel.Offset(0, Height) * cel.Offset(0, Width)
    End If
Next cel

End Sub

enter image description here