Vba 下标超出范围,数组变量

Vba 下标超出范围,数组变量,vba,excel,Vba,Excel,我是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) = "Minne

我是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的解决方案并不能真正实现我想要的(但无论如何都要感谢)


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

可能是工作表名称问题。您有多少工作表不需要更新?你能做些什么

dim sht as worksheet

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

我假设您正在尝试将工作表名称放入它对应的工作表中?如果是这样,问题是您正在使用
选择
而不是
激活
来突出
工作表

由于您使用的是没有限定符的
单元格
,因此它引用的
活动表
在代码中没有更改,因此成为一个问题

两种解决方案:

  • 使用
    激活
    ,这将使
    单元格
    正常工作
  • 通过在调用之前添加一个图纸对象,限定对
    单元格的调用
选项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,因为它不需要首先激活
工作表
。在可能的情况下,您的目标应该始终是避免激活和选择。它们降低了速度,使代码与健壮相反


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

你确定所有工作表都正确命名了吗?你在哪一行发现了这个错误?你的代码应该做什么?因为现在它正在寻找名为“BC”、“卡尔加里”、“埃德蒙顿”等的工作表,并将该工作表上单元格(1,2)的值更改为工作表的名称@下面的nutsch解决方案也可以实现同样的效果。但我不确定这正是你想要做的,因为你在问题中没有具体说明。谢谢,那些代码很有魅力。但话说回来,当我今天将代码复制粘贴到新工作簿中时,它也按预期运行。我真的很困惑,为什么代码有时有效,有时无效。