我意识到这个主题已经以不同的形式提出了无数次,但是我仍然需要一点帮助来解决这个问题。
我在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的解释,如果不是,则是这种行为的原因。 也许这也是关于最佳实践的建议。
感谢您的耐心和理解!
答案 0 :(得分:4)
正如其他人指出的那样,只需使用CollEmployeeEmail = "B"
。原因是B
周围的双引号创建了一个等于B
的字符串变量。 CollEmployeeEmail = Chr(34) & "B" & Chr(34)
创建一个字符串变量,该变量等于B
,并用双引号"B"
包围。
我建议始终在公共模块中枚举工作表的列。这样,当您更改工作表列的结构时,您要做的就是更新所有枚举。您还可以使用intellisense轻松按名称引用列。
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
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:非常感谢您提供详尽的答案和有关枚举的提示。非常有用。