数组下标超出范围。

3
我正在创建一个宏,它将从一个更大的工作簿中选择工作表,将这些工作表移动并保存为一个新的工作簿,然后继续进行下一组操作。
我已经创建了一个伪"数组",其中包含起始和结束值(由工作表索引号指定)。
在完成保存文件的部分之后,在下一个工作表集合被提取之前,我遇到了一个"下标超出范围"的错误。
以下是我的代码。如果能帮助解决这个错误,将不胜感激。
Dim Start As Integer
Dim Finish As Integer
Dim SR As Integer  
Dim SC As Integer
Dim ER As Integer
Dim EC As Integer
SR = 2
SC = 5
ER = 2
EC = 6
Start = Sheets("REF").Cells(SR, SC).Value
Finish = Sheets("REF").Cells(ER, EC).Value
Dim sheetArray() As Double
Dim i As Integer
Dim c As Integer
i = 0
c = Start
lastrow = Cells(100, SC).End(xlUp).Row

Do Until SR = lastrow

    Do Until c > Finish
        ReDim Preserve sheetarray (0 to i)
        i = i + 1
        c = c + 1
    Loop

    Sheets(sheetarray).Copy
    ActiveWorkbook.SaveAs Filename:= _ XXXXXXXXXXXXXXXXXX

    C = Start
    i = 0
    SR = SR + 1
    ER = ER + 1
Loop

编辑:美国中部时间下午4:35

目前,相关的代码块与上面的内容匹配,直到行 lastrow = Cells(100, SC).End(xlUp).Row

在 SR 等于 lastrow 之前执行

ReDim sheetArray(i)

Do Until c > Finish
    ReDim Preserve sheetArray(i)
    sheetArray(i) = c
    i = i + 1
    c = c + 1

Loop



Sheets(sheetArray).Copy
ActiveWorkbook.SaveAs Filename:= _
    XXXXXXXXXXXXX

c = Start
i = 0
SR = SR + 1
ER = ER + 1

循环


1
工作表索引从1开始。 - Sorceri
哪一行出现了错误? - Yaegz
我在第"Sheets(sheetarray).copy"行遇到了错误,但是它运行一次循环后,创建了第一个工作簿。 - A. Hayes
在开始另一个循环之前,您需要释放加载到sheetarray的原始值,然后再尝试创建它。 - Scott Holtzman
Scott,我该怎么做?从我的研究中发现,似乎没有任何方法可以解决我的错误。我已经尝试了此页面上创建/保存文件后插入的各种代码,但仍未解决我的问题。 - A. Hayes
显示剩余3条评论
2个回答

0
你需要三件事情:
  1. 在加载每个工作表索引之前重新定义数组,因为现在的方式是每次循环都会不断地构建,因此您将在第二轮开始时得到“下标超出范围”错误 - 因为数组基本上具有例如,从第一次开始的1 3 5,然后是从第二个开始的1 3 5 3 7,其中来自第一次的1 3 5 然后是来自第二个的3 7
  2. 每次设置数组的值。你只设置了数组元素。
  3. 限定要从哪个工作簿复制工作表,因为每次复制工作表时,它都会将活动工作簿设置为新复制的工作簿。

像这样构建您的Do Loop块:

Do Until SR = lastrow

    ReDim sheetArray(0) 'or you can put i here since you set it to zero at the bottom

    Do Until c > Finish

        ReDim Preserve sheetArray(i)
        sheetArray(i) = c

        i = i + 1
        c = c + 1

    Loop

    Workbooks("myWkb").Sheets(sheetArray).Copy 'where myWkb is the workbook name you need ... you can also use ThisWorkbook (meaning the workbook where the code is running) but this is not best practice
    ActiveWorkbook.SaveAs Filename:="XXXXXXXXXXXXXXXXXX"

    c = Start
    i = 0
    SR = SR + 1
    ER = ER + 1

Loop

我相信我仍然会得到相同的错误。我在“lastrow = Cells....(xlUp).Row”之后更改了我的代码以匹配您发布的内容,但在相同行上仍然出现了相同的错误。此外,它现在无法第一次完成循环以创建我之前获取的一个文件。 - A. Hayes
确保您的变量类型匹配(double vs. integer等)。 - Scott Holtzman
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - A. Hayes
我现在又可以生成第一本书了,但是我仍然遇到了之前的同样错误。我还将我的数组从double改为integer。感谢您的建议。 - A. Hayes
1
我已经解决了我的问题。在我的VBA运行后,它会查找活动工作簿(即新创建的工作簿)。由于没有找到它要查找的值,所以它抛出了一个错误。感谢您的帮助。 - A. Hayes
显示剩余2条评论

0
据我所见,问题在于您只是调整了sheetArray的维度,但没有放置任何内容。因此,数组内的值都是零。然后,您要求Excel复制sheets(0),这是超出范围的,因为工作表编号从1开始。
您可以通过在数组中编写要复制的工作表的索引来解决此问题:
Do Until c > Finish
    ReDim Preserve sheetarray (0 to i)
    sheetarray(i) = c ' <~~~~ or something else, according to your goal
    i = i + 1
    c = c + 1
Loop

附言:最好将sheetArray设置为整数数组(而不是双精度浮点数),因为它的元素是工作表的索引...但是,即使使用双精度浮点数,如果数组的内容正确设置,它也应该可以正常工作。


我再次在同一行遇到了相同的问题,无法生成我之前用“损坏”的代码得到的第一本书。 - A. Hayes
@A.Hayes,您能否发布调整后的代码?我不确定您正在将哪些索引放入或想要放入数组中。但是,如果您在其中放入一些现有的索引,我相信它应该可以工作,因为我已经测试过了 :) - A.S.H
@A.Hayes 我建议您验证放入数组中的每个工作表索引的存在,只需在 sheetArray(i) = c 后添加 Debug.Print Sheets(c).Name 即可。这样您就可以验证数组中放入的是否是正确的值。 - A.S.H
我已经解决了我的问题。在我的VBA运行后,它会查找活动工作簿(即新创建的工作簿)。由于没有找到它要查找的值,所以它抛出了一个错误。感谢您的帮助。 - A. Hayes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接