Я создал макрос 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, но безуспешно, что заставило меня подумать, что проблема может заключаться в другом. Просто странно, учитывая, что вчера все работало
Мне удалось систематически воспроизвести эту ошибку, выполнив следующие действия: (1) Создайте новую книгу (2) Добавьте новый модуль и вставьте этот упрощенный код (3) Запустите CreateButton
(4) Проверьте кнопку, чтобы убедиться в этом работает. (5) Сохраните и закройте книгу. (5) Снова откройте книгу и нажмите кнопку. (6) После этого вы должны увидеть то же сообщение об ошибке, что и OP. (Microsoft 365 MSO (версия 2406, сборка 16.0.17726.20078), 64-разрядная версия)
Вы не показываете весь код и сложно понять, где ошибка. Каково содержимое переменной buttonMacro
? Где существует обсуждаемый макрос? В стандартном модуле или в листовом? В любом случае, конструкция "'" & buttonMacro & " """ & sheetName & """'"
мне кажется странной...
Как упоминалось в моем комментарии, это похоже на ошибку. Я впервые вижу этот трюк с заключением имени макроса и параметра в одинарные кавычки. Если бы вы спросили меня, я бы сказал, что невозможно передать аргумент через OnAction
для кнопки листа. Этот метод, который вы использовали, представляет собой интересный хак, но он ненадежен, поскольку закрытие и повторное открытие файла Excel приводит к поломке кнопки.
Мне удалось систематически воспроизводить эту ошибку, выполнив следующие действия:
- Создать новую книгу
- Добавьте новый модуль и вставьте этот упрощенный код
- Беги
CreateButton
- Проверьте кнопку, чтобы убедиться, что она работает
- Сохраните и закройте книгу
- Снова откройте книгу и нажмите кнопку
- Затем вы должны увидеть то же сообщение об ошибке, что и 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
Огромное вам спасибо, я просто сэкономил несколько часов возни!
Вы прочитали сообщение об ошибке? возможно, макрос был удален из книги (это может произойти, если вы случайно сохранили его как расширение файла, не являющееся макросом — проверьте, что он действительно все еще существует с помощью редактора VBA), или макросы могут быть отключены. Проверьте настройки Центра управления безопасностью или включите макросы при открытии файла...