Excel VBA:引用Worksheet.Cells()中的列索引

时间:2018-06-29 19:37:58

标签: excel vba excel-vba

我意识到这个主题已经以不同的形式提出了无数次,但是我仍然需要一点帮助来解决这个问题。

我在Excel 2016中有一个启用宏的电子表格(.xlsm)。

我有一个使用该呼叫的旧Sub

wsList.Cells(6, "B").Value

多次引用不同列中的数据。 wsList是工作簿中的工作表对象。

为避免每次列顺序更改时都要经历所有这些调用,我尝试在子目录顶部定义列字母索引,例如

Dim CollEmployeeEmail As String  
...  
CollEmployeeEmail = Chr(34) & "B" & Chr(34)
...
wsList.Cells(6, CollEmployeeEmail).Value

但这给了我一个运行时错误'13':类型不匹配错误。

现在,我意识到Cells()属性期望将Integers作为行和列索引,并且我可以将字母列索引转换为整数(例如,“ B” = 2)。 此外,这表明,由于Cells(6,“ B”)正常工作,而Cells(6,CollEmployeeEmail)无法工作,因此Excel在Cells()中将“ B”解释为整数时将其解释为整数。 (将CollEmployeeEmail用作索引会导致类型不匹配错误,因为这是一个字符串)

这使我感到困惑,我想确认一下,这种行为实际上是由于Excel的解释,如果不是,则是这种行为的原因。 也许这也是关于最佳实践的建议。

感谢您的耐心和理解!

4 个答案:

答案 0 :(得分:4)

正如其他人指出的那样,只需使用CollEmployeeEmail = "B"。原因是B周围的双引号创建了一个等于B的字符串变量。 CollEmployeeEmail = Chr(34) & "B" & Chr(34)创建一个字符串变量,该变量等于B,并用双引号"B"包围。

enter image description here

我建议始终在公共模块中枚举工作表的列。这样,当您更改工作表列的结构时,您要做的就是更新所有枚举。您还可以使用intellisense轻松按名称引用列。

enter image description here

Public Enum OrdersColumns
    ordCustomerName = 1
    ordCount
    ordAverage
    ordSales
    ordQuantity
    ordDiscount
    ordProfit
End Enum

您甚至可以设置Enums来迭代。参见Chip Pearson - Enum Variable Type

Public Enum OrdersColumns
    [_First] = 1
    ordCustomerName = 1
    ordCount
    ordAverage
    ordSales
    ordQuantity
    ordDiscount
    ordProfit
    [_Last] = 8
End Enum

enter image description here

立即窗口

For n = OrdersColumns.[_First] to OrdersColumns.[_Last] : _
   Debug.Print Cells(1,n).Value  : _
Next

Columns(OrdersColumns.ordCount ).Select

答案 1 :(得分:3)

CollEmployeeEmail = Chr(34) & "B" & Chr(34)替换为CollEmployeeEmail = "B"

答案 2 :(得分:2)

尝试

Dim CollEmployeeEmail As String  
...  
CollEmployeeEmail = "B"
...
wsList.Cells(6, CollEmployeeEmail).Value

答案 3 :(得分:2)

感谢您的回答。当您编写它时,它看起来似乎很明显,但这当然不适合我。

解决方案的确是将CollEmployeeEmail = Chr(34) & "B" & Chr(34)替换为CollEmployeeEmail = "B",并删除了Chr(34)引号。

@TinMan:非常感谢您提供详尽的答案和有关枚举的提示。非常有用。