下标超出范围,数组variables

我是VBA的初学者,我一直在挠头,试图弄清楚我的代码有什么问题:

Sub DataTransfer(): Dim position As Integer, location (1 To 9) As String location(1) = "BC" location(2) = "Calgary" location(3) = "Edmonton" location(4) = "Major Projects" location(5) = "Minneapolis" location(6) = "Saskatchewan" location(7) = "Seattle" location(8) = "Toronto" location(9) = "Winnipeg" For position = 1 To 9 Worksheets(location(position)).Select Cells(1, 2).Value = location(position) Next position End Sub 

编辑:对于我的问题的含糊不清。 我最终想要做的是实际上能够将第三条最后一行(将城市名称写入工作表)更改为我想要的任何函数,以便按照我认为合适的方式修改工作表。 这实际上是我开始解决问题的一个更大的子程序的一部分。 这些工作表是散布在其他工作表之间的,所以不幸的是,@ nutsch的解决scheme不会真正达到我想要的(但是要感谢任何一种方式)。

我遇到的最大的问题是,这个确切的代码有时会按预期工作,其他时间在第四行返回“下标超出范围”错误。

我假设你正在试图把工作表的名字放到它对应的工作表中? 如果是这样,问题是你正在使用Select而不是Activate给予Worksheet焦点。

成为一个问题,因为您正在使用没有限定符的Cells格,所以它引用了在您的代码中未被更改的ActiveSheet

两种解决scheme

  • 使用Activate ,这将使Cells工作就像你想要的。
  • 通过在表单对象之前确定对Cells的调用。

选项1

 Sub DataTransfer(): Dim position As Integer, location(1 To 9) As String location(1) = "BC" location(2) = "Calgary" location(3) = "Edmonton" location(4) = "Major Projects" location(5) = "Minneapolis" location(6) = "Saskatchewan" location(7) = "Seattle" location(8) = "Toronto" location(9) = "Winnipeg" For position = 1 To 9 Worksheets(location(position)).Activate Cells(1, 2).Value = location(position) Next position End Sub 

选项2

 Sub DataTransfer(): Dim position As Integer, location(1 To 9) As String location(1) = "BC" location(2) = "Calgary" location(3) = "Edmonton" location(4) = "Major Projects" location(5) = "Minneapolis" location(6) = "Saskatchewan" location(7) = "Seattle" location(8) = "Toronto" location(9) = "Winnipeg" For position = 1 To 9 'this line really does nothign now Worksheets(location(position)).Select Worksheets(location(position)).Cells(1, 2).Value = location(position) Next position End Sub 

我更喜欢选项2,因为它不需要先激活Worksheet 。 应尽可能避免激活和select。 他们放慢了速度,使代码与强健的相反。

最后,正如@nutsch所指出的那样,有更简单的方法来做同样的事情,但值得知道为什么你的代码不工作。

可能是工作表名称问题。 你有多less工作表,不需要更新? 你能做吗?

 dim sht as worksheet for each sht in activeworkbook.sheets sht.cells(1,2)=sht.name next