Добрый день, возникла проблема или недопонимание. Я в определенной книге Excel в VBA написал макрос, который добавляет в контекстное меню один пункт. Модуль вызвал из раздела "Эта книга" в дереве слева. Вот макрос: [vba]
Код
'Создание пункта для контекстного меню Sub AddPopupMenu() Dim cb As CommandBar: On Error Resume Next For Each cb In Application.CommandBars If cb.Type = msoBarTypePopup Then cb.Reset ' сброс меню к настрокам по умолчанию With cb.Controls.Add(msoControlButton, , , 1, True) .Name = "ShowSvodInfo" .Caption = "Перейти к расшифровке": .FaceId = 487 .OnAction = "clickDecrypt" End With End If Next cb End Sub
Далее в этом же модуле при запуске экселя выполняю этот макрос: 'Вызов макросов при открытии книги Private Sub Workbook_Open() Call AddPopupMenu End Sub
[/vba]
Пункт добавляется и отрабатывает, все хорошо, НО, если открывать новые книги эксель, то этот пункт в контекстном меню ячейки добавлен и там и соответственно при нажатии на этот пункт возникает проблема. Если я закрываю эту мою книгу с макросом для добавления пункта меню и затем в пустой книге нажимаю на добавленный пункт, то у меня октрывается книга, в которой макрос. Как мне этого избежать?
Нужно, чтобы это меню добавилость только в одной определенной книге.
Добрый день, возникла проблема или недопонимание. Я в определенной книге Excel в VBA написал макрос, который добавляет в контекстное меню один пункт. Модуль вызвал из раздела "Эта книга" в дереве слева. Вот макрос: [vba]
Код
'Создание пункта для контекстного меню Sub AddPopupMenu() Dim cb As CommandBar: On Error Resume Next For Each cb In Application.CommandBars If cb.Type = msoBarTypePopup Then cb.Reset ' сброс меню к настрокам по умолчанию With cb.Controls.Add(msoControlButton, , , 1, True) .Name = "ShowSvodInfo" .Caption = "Перейти к расшифровке": .FaceId = 487 .OnAction = "clickDecrypt" End With End If Next cb End Sub
Далее в этом же модуле при запуске экселя выполняю этот макрос: 'Вызов макросов при открытии книги Private Sub Workbook_Open() Call AddPopupMenu End Sub
[/vba]
Пункт добавляется и отрабатывает, все хорошо, НО, если открывать новые книги эксель, то этот пункт в контекстном меню ячейки добавлен и там и соответственно при нажатии на этот пункт возникает проблема. Если я закрываю эту мою книгу с макросом для добавления пункта меню и затем в пустой книге нажимаю на добавленный пункт, то у меня октрывается книга, в которой макрос. Как мне этого избежать?
Нужно, чтобы это меню добавилость только в одной определенной книге.neon_tmn
Сообщение отредактировал neon_tmn - Воскресенье, 22.01.2017, 09:52
Доброе время суток. Тогда вам нужно усложнить конструкцию кода. В модуле книги написать обработчики событий Activate и Deactivate. В первом - создание пункта в контекстном меню (с проверкой если ещё не существует). Во втором удаление, так как переключились в другую книгу. Возможно, задействовать другие события Open, Close. Чётко не скажу, срабатывает ли Atcivate при открытии книги, и Deactivate при закрытии. Успехов. P. S. Код оформите, пожалуйста, соответствующими тэгами (# в панели кнопок сообщения).
Доброе время суток. Тогда вам нужно усложнить конструкцию кода. В модуле книги написать обработчики событий Activate и Deactivate. В первом - создание пункта в контекстном меню (с проверкой если ещё не существует). Во втором удаление, так как переключились в другую книгу. Возможно, задействовать другие события Open, Close. Чётко не скажу, срабатывает ли Atcivate при открытии книги, и Deactivate при закрытии. Успехов. P. S. Код оформите, пожалуйста, соответствующими тэгами (# в панели кнопок сообщения).anvg
Во втором удаление, так как переключились в другую книгу.
Идею я понял и сам так пробовал, но долго отрабатывает поиск соответствующего пункта. я ищу так: [vba]
Код
Dim УдаляемыйПункт As CommandBarControl Dim Меню As CommandBar For Each Меню In Application.CommandBars ' для каждого меню If Меню.Type = msoBarTypePopup Then For Each УдаляемыйПункт In Меню.Controls ' каждый элемент меню If InStr(1, УдаляемыйПункт.TooltipText, "Перейти к расшифровке") Then УдаляемыйПункт.Visible = ShowItemMenu Exit For End If Next УдаляемыйПункт End If Next Меню
[/vba]
К тому же я не могу понять, как сделать проверку, из какой книги запускается макрос.
Во втором удаление, так как переключились в другую книгу.
Идею я понял и сам так пробовал, но долго отрабатывает поиск соответствующего пункта. я ищу так: [vba]
Код
Dim УдаляемыйПункт As CommandBarControl Dim Меню As CommandBar For Each Меню In Application.CommandBars ' для каждого меню If Меню.Type = msoBarTypePopup Then For Each УдаляемыйПункт In Меню.Controls ' каждый элемент меню If InStr(1, УдаляемыйПункт.TooltipText, "Перейти к расшифровке") Then УдаляемыйПункт.Visible = ShowItemMenu Exit For End If Next УдаляемыйПункт End If Next Меню
[/vba]
К тому же я не могу понять, как сделать проверку, из какой книги запускается макрос.neon_tmn
Как бы сделать, чтобы Sub Workbook_Open() срабатывал только в той книге, в которой он написан в модуле Книги. А не во всех открываемых заново книгах.
Как бы сделать, чтобы Sub Workbook_Open() срабатывал только в той книге, в которой он написан в модуле Книги. А не во всех открываемых заново книгах.neon_tmn
В том же модуле "Эта книга" написал макрос при смене листа: [vba]
Код
Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox "Name of Sheet:" & Sh.Name End Sub
[/vba]
Он работает только в пределать текущей книги. Если я открою другую книгу, то там это событие работать не будет. В Private Sub Workbook_Open() у меня выполняется собитие вызывающее макрос для создания этого пункта меню. При открытии других книг этот макрос уже не выполняется. Просто, я так понимаю, что создание пункта меню влияет на все приложение в целом.
В том же модуле "Эта книга" написал макрос при смене листа: [vba]
Код
Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox "Name of Sheet:" & Sh.Name End Sub
[/vba]
Он работает только в пределать текущей книги. Если я открою другую книгу, то там это событие работать не будет. В Private Sub Workbook_Open() у меня выполняется собитие вызывающее макрос для создания этого пункта меню. При открытии других книг этот макрос уже не выполняется. Просто, я так понимаю, что создание пункта меню влияет на все приложение в целом.neon_tmn
Идею Вашу понял, хорошая идея. В модуле создал переменную, как вы описали. Затем в модуле книги соответственно прописал все остальное. Теперь при активации книги у меня появляется ошибка "run-time error '424' object required" на строке [vba]
Идею Вашу понял, хорошая идея. В модуле создал переменную, как вы описали. Затем в модуле книги соответственно прописал все остальное. Теперь при активации книги у меня появляется ошибка "run-time error '424' object required" на строке [vba]
Sub AddToMenu() ' добавляем элемент меню в контекстное меню Ячейка Dim cb As CommandBar Dim i& Call DeleteFromMenu: Set cb = CommandBars("Cell") For i = 1 To 1000: DoEvents: Next With cb.Controls.Add(Type:=msoControlButton, Before:=1) .Caption = "А" .OnAction = "p" .FaceId = 29 End With cb.Controls(2).BeginGroup = True End Sub Sub DeleteFromMenu() On Error Resume Next CommandBars("Cell").Controls("А").Delete Err.Clear On Error GoTo 0 End Sub
[/vba] В модуль книги [vba]
Код
Private Sub Workbook_Activate() AddToMenu End Sub
Private Sub Workbook_Deactivate() DeleteFromMenu End Sub
[/vba]
В общий модуль [vba]
Код
Sub AddToMenu() ' добавляем элемент меню в контекстное меню Ячейка Dim cb As CommandBar Dim i& Call DeleteFromMenu: Set cb = CommandBars("Cell") For i = 1 To 1000: DoEvents: Next With cb.Controls.Add(Type:=msoControlButton, Before:=1) .Caption = "А" .OnAction = "p" .FaceId = 29 End With cb.Controls(2).BeginGroup = True End Sub Sub DeleteFromMenu() On Error Resume Next CommandBars("Cell").Controls("А").Delete Err.Clear On Error GoTo 0 End Sub
[/vba] В модуль книги [vba]
Код
Private Sub Workbook_Activate() AddToMenu End Sub
Private Sub Workbook_Deactivate() DeleteFromMenu End Sub
Private Sub Workbook_Deactivate() DeleteFromMenu End Sub
То есть каждый раз создавать или удалять этот пункт меню. в принципе не скажу, что по времени это сильно затратно, но все таки хотелось бы просто скрывать или показывать. Это возможно? Если скрывать/показывать нельзя, то сделать добавление и удаление.
Private Sub Workbook_Deactivate() DeleteFromMenu End Sub
То есть каждый раз создавать или удалять этот пункт меню. в принципе не скажу, что по времени это сильно затратно, но все таки хотелось бы просто скрывать или показывать. Это возможно? Если скрывать/показывать нельзя, то сделать добавление и удаление.neon_tmn
Вариант. Только в 2016 ведёт странно. Если первым открыть этот файл, то механизм не работает (пункт не скрывается). Если же файл открывается вторым, то поведение, как описывалось. Нет времени разбирать почему.
Вариант. Только в 2016 ведёт странно. Если первым открыть этот файл, то механизм не работает (пункт не скрывается). Если же файл открывается вторым, то поведение, как описывалось. Нет времени разбирать почему.anvg