Vba 下标超出范围,数组变量
我是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
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
我假设您正在尝试将工作表名称放入它对应的工作表中?如果是这样,问题是您正在使用
选择
而不是激活
来突出工作表
由于您使用的是没有限定符的单元格
,因此它引用的活动表
在代码中没有更改,因此成为一个问题
两种解决方案:
- 使用
,这将使激活
正常工作单元格
- 通过在调用之前添加一个图纸对象,限定对
单元格的调用
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解决方案也可以实现同样的效果。但我不确定这正是你想要做的,因为你在问题中没有具体说明。谢谢,那些代码很有魅力。但话说回来,当我今天将代码复制粘贴到新工作簿中时,它也按预期运行。我真的很困惑,为什么代码有时有效,有时无效。