2015-05-13 6 views
0

У меня есть этот отладочный код, который не будет заполнять имена рабочих листов для печати в формате PDF. Я получаю ошибку индексации вне диапазона. Есть идеи?сценарий вне диапазона нужна помощь

Application.ScreenUpdating = False 

Sheets("Macros").Select 

Dim strPath As String, strFileName As String 
Dim i As Integer, y As Integer, x As Integer 
Dim WkstNames() As Variant 
Dim iCount As Integer, iWkstCount As Integer 
Dim printrange As Range 
Set printrange = Range("P222:P248") 
Dim p() As Variant 

iCount = 1 
iWkstCount = ThisWorkbook.Sheets.Count 

ReDim WkstNames(1 To iWkstCount) 
ReDim p(1 To 27) 

For y = 1 To iWkstCount 
    For x = 1 To 27 
    printrange.Rows(p(x)).Select 
    If ActiveCell = "True" Then WkstNames(y) = Sheets(iCount).Name 
    iCount = iCount + 1 
    Next x 
Next y 

Sheets(WkstNames).Select ' error occurs here 

ответ

0

Причина довольно простая на самом деле. Вы обновляете свой массив в начале и ваша строка WkstNames(y) = Sheets(iCount).Name не выполняется, и, следовательно, вы получаете по крайней мере одно пустое значение в массиве.

Попробуйте и пропустите массив после его создания. Используйте этот код

For i = LBound(WkstNames) To UBound(WkstNames) 
    Debug.Print WkstNames(i) 
Next i 
Worksheets(WkstNames).Select 

Вы заметите, что хотя бы одно значение пустое и, следовательно, Excel не может найти лист.

рабочий пример будет что-то вроде

Dim WkstNames(1 To 2) As String 
WkstNames(1) = "Sheet1" 
WkstNames(2) = "Sheet2" 
Worksheets(WkstNames).Select 

примера (Followup от комментариев)

Это просто пример, чтобы показать, как вы можете выбрать лист (ы) без объявления массива заранее ,

Sub Sample() 
    Dim Ar 
    Dim wsName As String, sDelim As String 

    sDelim = "|" 

    With ThisWorkbook 
     For i = 1 To .Sheets.Count 
      If .Sheets(i).Name Like "Sheet*" Then 
       If wsName = "" Then 
        wsName = .Sheets(i).Name 
       Else 
        wsName = wsName & sDelim & .Sheets(i).Name 
       End If 
      End If 
     Next i 

     If InStr(1, wsName, sDelim) Then 
      Ar = Split(wsName, sDelim) 
     Else 
      Ar = wsName 
     End If 

     .Sheets(Ar).Select 
    End With 

End Sub 
+0

Таким образом, мне нужно было бы назвать все 27 листов, если бы тогда были инструкции в рабочем примере? Конечно, есть более простой способ сделать это вручную? – AgBanker

+0

Да, есть более простой способ, а не затемнение массива перед рукой. Обновлено сообщение –

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