Коллеги, назрел вопрос, и не могу нагуглить релевантный ответ.
Озадачился проблемой создания в текущей книге нового листа со встроенным событийным макросом на двойной клик по любой ячейке:
В теории всё должно работать. Но sub завершается ошибкой 424 "Object required", хотя новый лист создается, и макрос на нем прописывается как задумано. А на экране остается открытое окно VBE с только что созданной процедурой Worksheet_BeforeDoubleClick() - вот этого вообще не ожидал.
Короче, вопросы:
1. Как уйти от ошибки 424?
2. Как скрыть в конце окно VBE от пользователя?
3. Почему, если прописать два оператора set в одну строку:
(переменная prj больше нигде не используется), то при выполнении на этой строке вылезет 9 "Subscript out of range", но если уйти в Debug и шагать по F8 - макрос работает до самого конца, до ошибки 424 (см. выше).
Можно конечно не удалять существующий лист, а просто очистить. Но тут уже дело принципа, хочется разобраться с тонкостями.
Что я упускаю?
Озадачился проблемой создания в текущей книге нового листа со встроенным событийным макросом на двойной клик по любой ячейке:
| Код |
|---|
Private Sub make_prot()
Set wb = ThisWorkbook ' alias
DA = Application.DisplayAlerts
Application.DisplayAlerts = False
For Each sh In wb.Sheets
If sh.Name = "ПРОТОКОЛ" Then sh.Delete ' убили старый протокол
Next
Application.DisplayAlerts = DA
Dim ptr As Worksheet: Set ptr = wb.Sheets.Add(after:=Sheets("ОТЧЕТ")) ' лист пересоздали.
ptr.Name = "ПРОТОКОЛ": ptr.Cells.NumberFormat = "@"
'
' тут пока неважно... пока всё хорошо
'
' а тут начинается интересное
Set prj = ThisWorkbook.VBProject
Set cmp = prj.VBComponents(ptr.CodeName)
With cmp.CodeModule
lm = .CreateEventProc("BeforeDoubleClick", "Worksheet")
.InsertLines lm + 1, "Cancel = True"
.InsertLines lm + 2, "msgbox ""лист создан"""
' и т.д.
End With
End Sub |
Короче, вопросы:
1. Как уйти от ошибки 424?
2. Как скрыть в конце окно VBE от пользователя?
3. Почему, если прописать два оператора set в одну строку:
| Код |
|---|
Set cmp = ThisWorkbook.VBProject.VBComponents(ptr.CodeName) |
Можно конечно не удалять существующий лист, а просто очистить. Но тут уже дело принципа, хочется разобраться с тонкостями.
Что я упускаю?