2015-10-26 7 views
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 

EDIT: 16: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 

Loop

+1

Индексные листы начинаются с 1 – Sorceri

+0

Какая строка дает вам ошибку? – Yaegz

+0

Я получаю ошибку в строке «Листы (листы) .copy», но после того, как она пробегает цикл один раз, создается первая книга. –

ответ

0

Вам понадобятся три вещи :

  1. ReDim массив перед загрузкой каждого индекса листа, потому что, как вы есть сейчас это будет просто держать здание на каждом цикле и, таким образом, вы получите ошибку, начиная со второй петли Subscript out of range - потому что массив имеет в основном , в качестве примера, 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 
+0

Я считаю, что я все еще получаю ту же ошибку. Я изменил свой код после «lastrow = Cells .... (xlUp) .Row», чтобы соответствовать тому, что вы разместили, и я получаю ту же ошибку в той же строке. Кроме того, он не завершит цикл в первый раз, чтобы создать один файл, который я раньше делал. –

+0

убедитесь, что ваши типы переменных совпадают (double vs. integer и т. Д.) –

+0

Я считаю, что мои типы переменных совпадают, если только мой 'sheetArray' не должен быть двойным? Я попытался сменить значение на целое число, а также изменить 'i' и' c' для двойного соответствия массиву, и я все еще сталкиваюсь с той же ошибкой в ​​той же строке. –

0

Как я мог видеть это, проблема в том, что вы просто регулировать размер вашего 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), поскольку его элементы являются индексами листов ... Однако даже с удвоениями он должен работать, если содержимое массива установлено правильно.

+0

Я снова сталкиваюсь с одной и той же проблемой в той же строке, с тем, что не смог сгенерировать первую книгу, которую я получал раньше с моим «сломанным» кодом. –

+0

@ A.Hayes, можете ли вы отправить отредактированный код? Я не уверен, какие индексы вы вкладываете или хотите помещать внутри массива. Однако, если вы внесете в него некоторые существующие индексы, я уверен, что он должен работать, потому что я его протестировал :) –

+0

См. Мое оригинальное сообщение для скорректированного кода –

Смежные вопросы