2015-05-28 62 views
1

我在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的解决方案不会真正实现我想要的(但是要感谢任何一种方式)。

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

+0

你确定所有的工作表命名正确吗? – nutsch

+0

你得到这个错误是哪一行? – TMH8885

+0

欢迎来到Stack Overflow!我编辑过你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

0

我假设你试图把工作表名称放入它对应的工作表中?如果是这样,问题是您正在使用Select而不是ActivateWorksheet焦点。

由于您使用的是Cells而没有限定符,因此它指的是ActiveSheet,它在代码中未被更改,因此成为问题。

两个解决方案:

  • 使用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第一。应尽可能避免激活和选择。它们放慢速度,使代码与强健的相反。

最后,正如@nutsch指出的那样,有更简单的方法可以对此做些简单的事情,但值得知道为什么你的代码无法工作。

+0

谢谢,这些代码工作喜欢魅力。但是,再次,当我将代码复制粘贴到新的工作簿中时,它也按照它的意图运行。我真的很困惑,为什么代码有时会工作,有时不会。 –

0

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

dim sht as worksheet 

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