Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос только для определенной книги - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос только для определенной книги (Макросы/Sub)
Макрос только для определенной книги
neon_tmn Дата: Воскресенье, 22.01.2017, 09:32 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Добрый день, возникла проблема или недопонимание.
Я в определенной книге 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 - Воскресенье, 22.01.2017, 09:52
 
Ответить
СообщениеДобрый день, возникла проблема или недопонимание.
Я в определенной книге 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
Дата добавления - 22.01.2017 в 09:32
anvg Дата: Воскресенье, 22.01.2017, 09:50 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
Тогда вам нужно усложнить конструкцию кода. В модуле книги написать обработчики событий Activate и Deactivate.
В первом - создание пункта в контекстном меню (с проверкой если ещё не существует).
Во втором удаление, так как переключились в другую книгу. Возможно, задействовать другие события Open, Close. Чётко не скажу, срабатывает ли Atcivate при открытии книги, и Deactivate при закрытии.
Успехов.
P. S. Код оформите, пожалуйста, соответствующими тэгами (# в панели кнопок сообщения).
 
Ответить
СообщениеДоброе время суток.
Тогда вам нужно усложнить конструкцию кода. В модуле книги написать обработчики событий Activate и Deactivate.
В первом - создание пункта в контекстном меню (с проверкой если ещё не существует).
Во втором удаление, так как переключились в другую книгу. Возможно, задействовать другие события Open, Close. Чётко не скажу, срабатывает ли Atcivate при открытии книги, и Deactivate при закрытии.
Успехов.
P. S. Код оформите, пожалуйста, соответствующими тэгами (# в панели кнопок сообщения).

Автор - anvg
Дата добавления - 22.01.2017 в 09:50
neon_tmn Дата: Воскресенье, 22.01.2017, 09:54 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Во втором удаление, так как переключились в другую книгу.


Идею я понял и сам так пробовал, но долго отрабатывает поиск соответствующего пункта. я ищу так:
[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
Дата добавления - 22.01.2017 в 09:54
neon_tmn Дата: Воскресенье, 22.01.2017, 09:59 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Как бы сделать, чтобы Sub Workbook_Open() срабатывал только в той книге, в которой он написан в модуле Книги. А не во всех открываемых заново книгах.
 
Ответить
СообщениеКак бы сделать, чтобы Sub Workbook_Open() срабатывал только в той книге, в которой он написан в модуле Книги. А не во всех открываемых заново книгах.

Автор - neon_tmn
Дата добавления - 22.01.2017 в 09:59
anvg Дата: Воскресенье, 22.01.2017, 10:08 | Сообщение № 5
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Просто добавьте переменную на уровне модуля
[vba]
Код
Private MyPopUpItem As CommandBarControl
[/vba]
Соответственно
[vba]
Код
Sub AddPopupMenu()
    Set MyPopUpItem = cb.Controls.Add(msoControlButton, , , 1, True)
    With MyPopUpItem
    '...

Private Sub Workbook_Activate()
    MyPopUpItem.Visible = True
End Sub

Private Sub Workbook_Deactivate()
    MyPopUpItem.Visible = False
End Sub
[/vba]
 
Ответить
СообщениеПросто добавьте переменную на уровне модуля
[vba]
Код
Private MyPopUpItem As CommandBarControl
[/vba]
Соответственно
[vba]
Код
Sub AddPopupMenu()
    Set MyPopUpItem = cb.Controls.Add(msoControlButton, , , 1, True)
    With MyPopUpItem
    '...

Private Sub Workbook_Activate()
    MyPopUpItem.Visible = True
End Sub

Private Sub Workbook_Deactivate()
    MyPopUpItem.Visible = False
End Sub
[/vba]

Автор - anvg
Дата добавления - 22.01.2017 в 10:08
neon_tmn Дата: Воскресенье, 22.01.2017, 10:15 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
В том же модуле "Эта книга" написал макрос при смене листа:
[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
Дата добавления - 22.01.2017 в 10:15
neon_tmn Дата: Воскресенье, 22.01.2017, 10:30 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Просто добавьте переменную на уровне модуля

Идею Вашу понял, хорошая идея.
В модуле создал переменную, как вы описали.
Затем в модуле книги соответственно прописал все остальное.
Теперь при активации книги у меня появляется ошибка "run-time error '424' object required" на строке
[vba]
Код
MyPopUpItem.Visible = False
[/vba]
 
Ответить
Сообщение
Просто добавьте переменную на уровне модуля

Идею Вашу понял, хорошая идея.
В модуле создал переменную, как вы описали.
Затем в модуле книги соответственно прописал все остальное.
Теперь при активации книги у меня появляется ошибка "run-time error '424' object required" на строке
[vba]
Код
MyPopUpItem.Visible = False
[/vba]

Автор - neon_tmn
Дата добавления - 22.01.2017 в 10:30
RAN Дата: Воскресенье, 22.01.2017, 10:33 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
В общий модуль
[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
[/vba]

Автор - RAN
Дата добавления - 22.01.2017 в 10:33
neon_tmn Дата: Воскресенье, 22.01.2017, 10:43 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Private Sub Workbook_Activate()
AddToMenu
End Sub

Private Sub Workbook_Deactivate()
DeleteFromMenu
End Sub


То есть каждый раз создавать или удалять этот пункт меню. в принципе не скажу, что по времени это сильно затратно, но все таки хотелось бы просто скрывать или показывать. Это возможно?
Если скрывать/показывать нельзя, то сделать добавление и удаление.
 
Ответить
Сообщение
Private Sub Workbook_Activate()
AddToMenu
End Sub

Private Sub Workbook_Deactivate()
DeleteFromMenu
End Sub


То есть каждый раз создавать или удалять этот пункт меню. в принципе не скажу, что по времени это сильно затратно, но все таки хотелось бы просто скрывать или показывать. Это возможно?
Если скрывать/показывать нельзя, то сделать добавление и удаление.

Автор - neon_tmn
Дата добавления - 22.01.2017 в 10:43
anvg Дата: Воскресенье, 22.01.2017, 12:04 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Вариант. Только в 2016 ведёт странно. Если первым открыть этот файл, то механизм не работает (пункт не скрывается). Если же файл открывается вторым, то поведение, как описывалось. Нет времени разбирать почему.
К сообщению приложен файл: localPopUp.xlsb (17.3 Kb)
 
Ответить
СообщениеВариант. Только в 2016 ведёт странно. Если первым открыть этот файл, то механизм не работает (пункт не скрывается). Если же файл открывается вторым, то поведение, как описывалось. Нет времени разбирать почему.

Автор - anvg
Дата добавления - 22.01.2017 в 12:04
neon_tmn Дата: Понедельник, 23.01.2017, 08:30 | Сообщение № 11
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
anvg, RAN, спасибо вам за помощь, вы мне помогли. Буду разбираться дальше.
 
Ответить
Сообщениеanvg, RAN, спасибо вам за помощь, вы мне помогли. Буду разбираться дальше.

Автор - neon_tmn
Дата добавления - 23.01.2017 в 08:30
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос только для определенной книги (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!