Ошибка компиляции макроса Excel VBA: ожидаемый конец подпрограммы - PullRequest
0 голосов
/ 28 сентября 2018

Попытка назначить мой код кнопке, которая работает автономно в VBA, но при добавлении ее к кнопке я получаю следующую ошибку:

Ошибка компиляции: Ожидаемый конец подпрограммы

Мой код выглядит следующим образом:

Sub Button1_Click()

Private Sub filename_cellvalue()
    Dim Path As String
    Dim filename As String
    Path = Environ("userprofile") & "\Desktop\Invoices\"
    filename = Range("K13")
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, filename:=Path & filename & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub

VBA является новым для меня, поэтому любая помощь будет принята с благодарностью.Благодаря.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018
Sub Button1_Click()

Private Sub filename_cellvalue()

Sub операторы объявляют область действия процедуры.Синтаксис выглядит следующим образом:

{accessibility} Sub {name} ({args})
    {statements}
End Sub

Где модификатор {accessibility}, список параметров {args} и {statements} в теле являются необязательными (обратите внимание, что без модификатора доступа процедура неявно Public - тогда как во многих других языках [включая VB.NET] неявное значение по умолчанию - Private; лучше всего указывать здесь явное).

Такой синтаксис делает вложенные Sub заявления недопустимыми:

Sub DoSomething()
    Sub Illegal()
    End Sub
End Sub

Поэтому, когда компилятор встречает оператор Sub, все, что следует, рассматривается как часть тела процедуры, вплоть до следующего End Sub токена.

ЕслиОбработчик Button1_Click является допустимым, его нужно правильно завершить до того, как Sub filename_cellvalue начинается:

Sub Button1_Click()
End Sub

Private Sub filename_cellvalue()
    '...
End Sub

В противном случае неполный оператор Sub Button1_Click() необходимо удалить.

При этом filename_cellvalue является плохим идентификатором для процедуры: Sub процедуры делают что-то , их имена должны начинаться с глагола.ExportAsPDF было бы более подходящим, например.Обратите внимание на имя PascalCase, в отличие от lower_snake_case: символ подчеркивания имеет особое значение в VBA, о чем свидетельствует Button1_Click.

Подчеркивание отделяет источник интерфейса / события от члена интерфейса / имени события: Button1_Click вызывается, когда объект Button1 вызывает свое событие Click, и присвоение этой процедуре чего-либо другого разорвало бы ссылкумежду объектом и обработчиком событий: процедура никогда не будет запускаться в ответ на Click на Button1.Использование подчеркивания в процедурах, не являющихся обработчиками, особенно если public, будет вызывать проблемы (читай: больше ошибок компиляции), когда вы входите в более продвинутые концепции объектно-ориентированного программирования, включающие интерфейсы и полиморфизм.

0 голосов
/ 28 сентября 2018

Вы объявляете процедуру дважды: Sub Button1_Click() и Sub filename_cellvalue().

Вы должны удалить одну.Если вы добавляете код в событие кнопки, удалите Sub filename_cellvalue()

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