OnAction VBA Excel не может вызвать макрос

Я создал макрос vba для сбора данных Банка Англии.

В моем макросе есть кнопка, которая удаляет строку данных с одного листа вместе с целым другим листом.

    Dim btn As button
    Dim btnName As String
    Dim actionStr As String
    btnName = buttonText & "_" & sheetName ' Use sheet name for unique identifier
    Set btn = ws.Buttons.Add(ws.Cells(buttonRow, buttonColumn).Left, ws.Cells(buttonRow, buttonColumn).Top,       ws.Cells(buttonRow, buttonColumn).Width, ws.Cells(buttonRow, buttonColumn).Height)

    
    With btn
        .OnAction = "'" & buttonMacro & " """ & sheetName & """'"
        .Caption = buttonText
        .Name = btnName

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

На данный момент я понятия не имею, что может быть причиной этой ошибки, и буду признателен за любой совет — спасибо!

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

Вы прочитали сообщение об ошибке? возможно, макрос был удален из книги (это может произойти, если вы случайно сохранили его как расширение файла, не являющееся макросом — проверьте, что он действительно все еще существует с помощью редактора VBA), или макросы могут быть отключены. Проверьте настройки Центра управления безопасностью или включите макросы при открытии файла...

Tragamor 08.08.2024 18:38

Мне удалось систематически воспроизвести эту ошибку, выполнив следующие действия: (1) Создайте новую книгу (2) Добавьте новый модуль и вставьте этот упрощенный код (3) Запустите CreateButton (4) Проверьте кнопку, чтобы убедиться в этом работает. (5) Сохраните и закройте книгу. (5) Снова откройте книгу и нажмите кнопку. (6) После этого вы должны увидеть то же сообщение об ошибке, что и OP. (Microsoft 365 MSO (версия 2406, сборка 16.0.17726.20078), 64-разрядная версия)

DecimalTurn 08.08.2024 19:15

Вы не показываете весь код и сложно понять, где ошибка. Каково содержимое переменной buttonMacro? Где существует обсуждаемый макрос? В стандартном модуле или в листовом? В любом случае, конструкция "'" & buttonMacro & " """ & sheetName & """'" мне кажется странной...

FaneDuru 08.08.2024 19:16
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
3
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось в моем комментарии, это похоже на ошибку. Я впервые вижу этот трюк с заключением имени макроса и параметра в одинарные кавычки. Если бы вы спросили меня, я бы сказал, что невозможно передать аргумент через OnAction для кнопки листа. Этот метод, который вы использовали, представляет собой интересный хак, но он ненадежен, поскольку закрытие и повторное открытие файла Excel приводит к поломке кнопки.

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

  1. Создать новую книгу
  2. Добавьте новый модуль и вставьте этот упрощенный код
  3. Беги CreateButton
  4. Проверьте кнопку, чтобы убедиться, что она работает
  5. Сохраните и закройте книгу
  6. Снова откройте книгу и нажмите кнопку
  7. Затем вы должны увидеть то же сообщение об ошибке, что и OP.

(Microsoft 365 MSO (версия 2406, сборка 16.0.17726.20078), 64-разрядная версия)

Обходным решением было бы просто не передавать никаких аргументов, а использовать Application.Caller, чтобы извлечь имя листа из имени кнопки:


Sub CreateButton2()
   
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)
   
    Dim Btn As Button
    Set Btn = ws.Buttons.Add(0, 0, 100, 25)
    
    With Btn
        .OnAction = "=TestMacro2"
        .Caption = "Test2"
        .Name = "TestButton2_" & ws.Name
    End With

    Set Btn = Nothing

End Sub


Sub TestMacro2()

    MsgBox Right(Application.Caller, Len(Application.Caller) - InStr(Application.Caller, "_"))

End Sub

Огромное вам спасибо, я просто сэкономил несколько часов возни!

Adam Brookes 12.08.2024 17:15

Другие вопросы по теме