Вложено, если проблема компиляции в Excel VBA - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь получить книгу Excel для распечатки X копий Y числа страниц на основе определенных параметров ячейки.У меня был «рабочий» код, однако он отправлял бы слишком много команд печати на принтер, поэтому я пытаюсь сделать так, чтобы он выбрал каждый подходящий лист и просто отправил одну команду пакетной печати.

Я попытался выбрать страницы и сохранить их в массиве, но мне не так уж и повезло, поэтому я решил использовать приведенный ниже код.Код в комментариях - это то, что я изменил из рабочего кода.Каждый раз, когда я иду к его компиляции, я получаю ошибку " Compile: End If без блока If ".Я также добавил комментарий, в котором отладчик заканчивает тем, что выделяет и выдает ошибку компиляции.Я посмотрел на отступы, проверил количество «If» и «End If», убедился, что в моем коде нет ни одной строки «If ... THen ...», и прочесал форумы для чего-то близкого.Все, что я нахожу близким, в конечном итоге не подходит для этой проблемы.

Я ищу руководство и другой взгляд на этот код.Я включаю весь код минус переменные назначения.Я никогда не писал в Stack, так как всегда мог выяснить, что мне нужно, основываясь на других сообщениях, но я добавляю полотенце с этим.Любая помощь будет оценена!Я надеюсь, что это просто глупая ошибка с моей стороны, а не радикальная ошибка.

Application.ScreenUpdating = False

If Not IsEmpty(copies) Then
    For j = 1 To copies
        If vShts = "0" Then
            Sheets("BLANK ORDER").PrintOut
        Else

        '####Beginning of changed code####
        With ActiveWorkbook
        ThisWorkbook.Sheets("GO BACK PAGE 1").Select
        If vShts > 1 Then
            For lShCnt = 2 To vShts
                ThisWorkbook.Sheets("GO BACK PAGE " & lShCnt).Select False
            Next lShCnt
        End If
        With ActiveWorkbook
            ActiveSheet.Range("A1:S39").Select
            Selection.PrintOut preview:=True
        End With
        ThisWorkbook.Sheets(Sheet1.Name).Select
        '####End of changed code####

    End If   '<- This "End If" is where the Debugger highlights it hanging up on
Next j
Else
    If vShts = "0" Then
        Sheets("BLANK ORDER").PrintOut
    Else
        With ActiveWorkbook
            For i = 1 To vShts
                Sheets("GO BACK PAGE " & i).PrintOut
            Next i
        End With
    End If
End If

ThisWorkbook.Sheets(Sheet1.Name).Select

Application.ScreenUpdating = True

1 Ответ

0 голосов
/ 03 января 2019

Это распространенная проблема, с которой сталкиваются многие новички, так или иначе, но не настолько конструктивно «ну, просто следуйте синтаксису языка правильно!», На самом деле существуют реальные методы, позволяющие избежать этой проблемы.

Самый простой из них - это отступ - точнее, последовательность в отступе.

отступ

Проблема начинается здесь:

    If vShts = "0" Then
        Sheets("BLANK ORDER").PrintOut
    Else

    '####Beginning of changed code####
    With ActiveWorkbook

Отступ должен быть увеличен прямо здесь:

    If vShts = "0" Then
        Sheets("BLANK ORDER").PrintOut
    Else

        '####Beginning of changed code####
        With ActiveWorkbook

Ключ к простому и правильному соединению If...End If блоков - или любых блоков, на самом деле,является последовательным отступом.

Всякий раз, когда вы видите «открывающий блок», где следующая строка кода не имеет отступов, вы можете ожидать появления этой проблемы.Как этот With блок, который никогда не завершается и вызывает ошибку компиляции, которую вы получаете - потому что компилятор достиг End If, но ожидал End With:

    With ActiveWorkbook
    ThisWorkbook.Sheets("GO BACK PAGE 1").Select
    ...
End If

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

Меньшие процедуры

Большие процедуры, которые делают много вещей, «сложнее» получить, чем они должны быть.Один из способов облегчить управление большой процедурой - разделить ее на более мелкие процедуры, выполняющие меньше задач.Таким образом, вместо этого:

If condition Then
   'do stuff
   'do more stuff
   'some more stuff
Else
   'do other stuff
End If

Вы можете перетащить содержимое условной ветви в его собственную более узкую, более специализированную процедуру:

If condition Then
    DoStuff
Else
    DoOtherStuff
End If

Вы можете сделать это, введя новый Sub операторы вне макроса / процедуры, в которой вы уже находитесь:

Private Sub DoStuff()
   'do stuff
   'do more stuff
   'some more stuff
End Sub

Private Sub DoOtherStuff()
   'do other stuff
End Sub

Затем вы можете передавать параметры между процедурами, а затем использовать Function процедуры, которые оценивают эти параметры и возвращаютзначение соответственно, и все становится действительно очень интересно, как только вы освоите эти строительные блоки.Продолжай!

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