数组下标超出范围

我正在创build一个macros,它将从较大的工作簿中select工作表,将这些工作表移动并保存为新的工作簿,然后转到下一个工作簿。

我创build了一个具有开始和结束值的伪“数组”(由图纸索引号指定)。

在完成保存文件的部分之后,但是在将会拉下一组工作表的循环之前,遇到“下标超出范围”错误。

以下是我的代码。 任何帮助,这个错误将不胜感激。

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 

编辑:16:35中美洲

目前,相关的代码块通过行lastrow = Cells(100, SC).End(xlUp).Row

直到SR =拉斯特罗

 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 

Loop

这里你需要三件事情:

  1. 在加载每个图表索引之前ReDim数组,因为你现在拥有它的方式将继续在每个循环上构build,因此你会从第二个循环开始获取下Subscript out of range错误 – 因为数组基本上有一个例子,先从1 3 5 ,然后1 3 5 3 7 ,先从1 3 5 ,然后从3 7
  2. 每次设置数组的值。 您只能设置数组的元素
  3. 限定要复制工作表的工作簿,因为每次复制工作表时,都会将活动工作簿设置为新复制的工作簿。

像这样构build您的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 

正如我所看到的那样,问题在于你只是调整了sheetArray的维数,但是你没有在里面放任何东西。 所以基本上,数组内的值都是零。 然后,您要求Excel复印工作表(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 

ps:最好将sheetArray设置为Integer(不是Double)的数组,因为它的元素是表的索引…但是,即使有双精度,如果数组的内容设置正确,它也应该工作。