Ошибка индекса VBA вне диапазона при использовании всего массива, но не при использовании указанных c элементов из массива - PullRequest
0 голосов
/ 30 января 2020

Предполагается, что это относительно простая функция - книга Excel с выбором листов для заполнения. Если пользователь решит пропустить некоторые из листов, они не будут включены в конечную функцию.

Он также скрывает пару столбцов в указанных c листах, которые содержат информацию, не требуемую в экспортированном формате.

Sub Export()


Dim i As Integer, c As Integer, f As Integer, g As Integer, h As Integer, numberofsheets As Integer

' i is for counting total number of build sheets
' c is used in the while loop to track the current sheet the code is running on
' f is used to denote the row on the excel sheet currently look at
' g tracks the current sheet out of number of sheets marked for build
' h tracks consecutive sheets so the code doesnt run on the same one multiple times
' numberofsheets is the number of sheets required for final build

'printsheets is an array to denote which final sheets are to be exported

Dim sheetname As String             'name of current sheet

numberofsheets = Range("AC2")
ReDim printsheets(numberofsheets) As Variant

h = 1
i = Range("AC3").Value
For g = 1 To numberofsheets                 ' for loop run to create an array equal to number of sheets denoted for build
    c = h
    While (c < i)                           ' while loop to track which sheet is currently looked at
        f = (4 + c)
        sheetname = Range("AC" & f)
            If Range("AB" & f) = "Yes" Then     ' determines whether sheet is used for build
            printsheets(g - 1) = sheetname      ' adds sheet to array if used for build
                If Not sheetname = ("Quality Final") Then           'hides the button columns for basic build sheets, not quality final
                Worksheets(sheetname).Columns("L").EntireColumn.Hidden = True
                h = h + 1
                c = i
                Else: End If
            Else:
            h = h + 1
            c = c + 1
            End If
    Wend
Next g



ThisWorkbook.Sheets(printsheets()).Select


            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, filename:= _
            "C:\Build Sheets\MW\CT\PDF\" & ThisWorkbook.Name & ".pdf" _
            , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
            :=False, OpenAfterPublish:=True



Sheets("Main Menu").Select
End Sub

верхняя часть функционирует отлично, она скрывает столбцы, и благодаря тестированию я вижу, как массив заполняется правильно. Проблема возникает в строке выбора.

Если я укажу указанный элемент c массива, например, printsheets (3), то функция экспортируется нормально, но если я попытаюсь выбрать несколько или весь массив с printsheets () Я получаю ошибку времени выполнения 9, нижний индекс выходит за пределы диапазона.

Я не могу понять, в чем проблема, потому что я могу выбрать часть массива, но никогда не весь лот, который побеждает точку экспорт всего на 1 лист.

Довольно плохо знаком с VBA, так что извините, если я пропустил что-то очевидное!

1 Ответ

2 голосов
/ 30 января 2020

Когда код сталкивается с ошибкой, выберите отладку и найдите ссылку, которую пытаетесь найти в массиве.

Например, в коде поместите курсор на «numberOfsheet» (если это массив, к которому привязан код), щелкните правой кнопкой мыши и выберите «Добавить». Удерживая указатель мыши над «g» (номер элемента в массиве), он должен показать номер, на котором работает в данный момент. Если это не так, напишите в окне отладки (ctrl + g) «Debug.Pring g» и нажмите ввод, чтобы узнать, для какого элемента массива код выполняется точно. По этому номеру вы можете узнать, на каком номере (с помощью add whatch) заклеен код.

Вероятно, таким образом вы обнаружите, что число (i, c, f, g, h или i) больше, чем массив, в котором он пытается найти ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...