All Forums
 Категория Visio
 Форум Вопросы и ответы
 Привязка макроса к кнопке
Author Previous Topic Topic Next Topic  

SuperTed

Russia
7 Posts

Posted - 03/01/2004 :  02:12:13
Уважаемые господа!

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

Tumanov

Russia
1198 Posts

Posted - 03/01/2004 :  17:27:04
==========================================================
Привожу фрагмент из какого-то другого топика с тем же названием
==========================================================
Есть такая проблема:
Не могу привязать Макрос к кнопке на тулбаре.
В файле plan.vss содержится модуль Module1,
в нем процедура WiseMacro.
В этом же модуле создается Тулбар, с
единственной кнопкой. Пишу, как белый человек:
Action="WiseMacro"
ну и выдается ошибка на метод Action :(
пробовал по разному и добивался либо ругни на
Action либо говорит Ok, но нажимаю на кнопку
а видимых эфффектов нет (к слову в макросе
открывается формочка).
Скажите мой милый All как же все таки правильно
писать. Заранее спасиб.

Я не совсем правильно объяснил
Привожу листинг:
' ----------module1--------
Public Sub CreateCommandBar()
' попытка работы с CommandBar
Dim cbrCommandBars As Office.CommandBars
Dim cbrCommandBar As Office.CommandBar
Dim cbbCommandBarButton As Office.CommandBarButton
Dim vsoApplication As Visio.Application
Dim strCommandBarName As String

On Error GoTo CreateCommandBar_Err

Set vsoApplication = Application
strCommandBarName = "WiseCommandBar"

Set cbrCommandBars = vsoApplication.CommandBars

' Add a new CommandBar object that only exists through
' this session of Visio.
Set cbrCommandBar = cbrCommandBars.Add(strCommandBarName)

' Do not allow users to modify the new CommandBar.
cbrCommandBar.Protection = msoBarNoCustomize

' Add a button to the bar.
Set cbbCommandBarButton = cbrCommandBar.Controls.Add( _
Type:=msoControlButton)

' Make it run a VBA Macro.
With cbbCommandBarButton
.Caption = "VBA Macro"
.TooltipText = "WiseMacro"

' Use the Tag property for context switching and
' for use with the FindControl method.
.Tag = "cbbVBAMacro"

' Get an internal icon for the button.
.FaceID = 7076

' Use OnAction to run a VBA macro contained in
' this document.
cbbCommandBarButton
.AddOnName
.OnAction = "plan.Modules.Module1.WiseMacro"
' .OnAction = "Stencil1.Array Shapes"
End With

' Set a reference to the CommandBar button
' in the event handling class.
Set mmsoEventClass.MyCommandBarButton = _
cbbCommandBarButton

Exit Sub

CreateCommandBar_Err:
MsgBox Err.Description

End Sub
'........
В этом же модуле процедура WiseMacro


Tumanov
--------------------------------------------------------------------------------
Два варианта - либо с модулями что-то перемудрили, либо ошибка в другом месте.
Вот такой код у меня отлично работает:

Public Sub CreateCommandBar()
' попытка работы с CommandBar
Dim cbrCommandBars As Office.CommandBars
Dim cbrCommandBar As Office.CommandBar
Dim cbbCommandBarButton As Office.CommandBarButton
Dim vsoApplication As Visio.Application
Dim strCommandBarName As String

Set vsoApplication = Visio.Application
strCommandBarName = "WiseCommandBar"
Set cbrCommandBars = vsoApplication.CommandBars
Set cbrCommandBar = cbrCommandBars.Add(strCommandBarName)
cbrCommandBar.Protection = msoBarNoCustomize
Set cbbCommandBarButton = cbrCommandBar.Controls.Add( _
Type:=msoControlButton)
With cbbCommandBarButton
.Caption = "VBA Macro"
.TooltipText = "WiseMacro"
.Tag = "cbbVBAMacro"
.FaceID = 7076
.OnAction = "ThisDocument.ttt"
End With
Exit Sub

CreateCommandBar_Err:
MsgBox Err.Description

End Sub
Sub ttt()
MsgBox "Работает"
End Sub

От Вашего отличается только тем, что макрос сидит не в vss, а в ThisDocument.
Еще может быть сказывается следующее:
Если Тулбар один раз создался, то вторая попытка создать такой же тулбар приводит к ошибке (такой тулбар уже есть). Например, в процессе выполнения макроса создается тулбар, затем через несколько строк сидит код, который вызывает ошибку и макрос сваливается. Потом Вы чините код, убираете ошибку. Вы повторно запускаете макрос, но теперь уже он будет сваливаеться каждый раз при создании тулбара.


WiseChen
--------------------------------------------------------------------------------

>Еще может быть сказывается следующее:
>Если Тулбар один раз создался, то вторая попытка создать такой же >тулбар приводит к ошибке (такой тулбар уже есть). Например, в >процессе выполнения макроса создается тулбар, затем через несколько >строк сидит код, который вызывает ошибку и макрос сваливается. Потом >Вы чините код, убираете ошибку. Вы повторно запускаете макрос, но >теперь уже он будет сваливаеться каждый раз при создании тулбара.
Ну я как бы удаляю тулбар, созданный в предыдущий раз.
>От Вашего отличается только тем, что макрос сидит не в vss,
>а в ThisDocument.
Да, спасибо, если макрос в документе vsd все работает. Однако проблемы это к сожалению не решило.
Вся идея в том чтобы иметь один файл vss на все мои документы, соответственно макросы хранить надо именно в vss
Все попытки привязать макрос из plan.vss у меня потерпели неудачу.
Go to Top of Page

SuperTed

Russia
7 Posts

Posted - 03/01/2004 :  22:21:40
Конечно, огромное спасибо за содержательный ответ.

Но если честно просто не верится, что для столь простой (типовой,
явной и логичной) задачи в Visio не предусмотрено встроенной операции. Может быть я не совсем правильно спросил.

Попробую вот так.
Создан файл для автоматизации следующих действий. На форме вводятся
данные о проекте, по командной кнопке данные из формы разносятся по
нужным полям в таблицах и на схеме. Далее данный файл после удачной обкатки помещается в папку и оттуда копируется в папку с конкретным проектом. В скопированном файле вносятся нужные данные, сохраняются и забываются. В следующую папку проекта опять копируется файл из исходной (скажем шаблонной) папки и там опять вводятся конкретные данные по проекту. Так как после обкатки шаблонного файла он будет предоставлен моим коллегам, которые мягко скажем только недавно из-за кульмана вылезли и слыхом не слыхивали о VBA то для упрощения вызова формы запроса данных по проекту хотелось бы создать кнопочну на тулбаре (желательно с улыбающейся рожицем :)), чтобы недалекие товарищи не вздумали нажимать Alt+F11 и не дай бог еще рассматривать плоды чужого интелектуального труда.

Не подумайте я не циник, но даже в жизни стараюсь делать примерно так On Error Goto туда где ошибок быть не может.

Заранее благодарен!
Go to Top of Page

lantari

Russia
20 Posts

Posted - 03/03/2004 :  11:43:56
У меня в Visio 2002 (10.0.525) тип(объект) "Office.CommandBars" вызывает ошибку, т.е. приведенный выше код не работает. Написал код создания панели с кнопкой используя тип(объект) "Toolbars". Пока макрос вызывался из документа (.vsd) все работало нормально. Решил перенести код в шаблон (.vss). Панель с кнопкой создается, если в коде использовать в качестве родительского документа (который создает панель) используется страница для рисования, но кнопка погашена (disable) и ни какой макрос запустить не может; если в качестве родительского документа используется шаблон, то панель лишь мигнет на экране и тут же пропадает.

Sub Document_DocumentOpened(ByVal Doc As IVDocument)
Set WorkTrafaret = Application.ActiveDocument
If (Application.Documents.Count = 1) And (Application.ActiveDocument = "CDR.vss") Then
Set WorkDocument = Application.Documents.Add("")
Else
Set WorkDocument = Application.Documents(1) 'ActiveDocument
End If
AddToolbar

End Sub


Sub AddToolbar()
Dim uiObj As UIObject
Dim toolbarsObj As Toolbars
Dim toolbarObj As Toolbar
Dim toolbarItemsObj As ToolbarItems
Dim toolbarItemObj As ToolbarItem

'* If ThisDocument.CustomToolbars Is Nothing Then
If WorkDocument.CustomToolbars Is Nothing Then
If Visio.Application.CustomToolbars Is Nothing Then
Set uiObj = Visio.Application.BuiltInToolbars(0)
Else
Set uiObj = Visio.Application.CustomToolbars.Clone
End If
Else
'* Set uiObj = ThisDocument.CustomToolbars
Set uiObj = WorkDocument.CustomToolbars
End If

Set toolbarsObj = uiObj.ToolbarSets.ItemAtID(Visio.visUIObjSetDrawing).Toolbars

Set toolbarObj = toolbarsObj.Add
With toolbarObj
.Caption = "Visualka Draw"
.Position = Visio.visBarFloating
.Left = 300
.Top = 200
.Protection = Visio.visBarNoHorizontalDock + Visio.visBarNoVerticalDock
.Visible = True
.Enabled = True
End With

Set toolbarItemObj = toolbarObj.ToolbarItems.Add


With toolbarItemObj
.CntrlType = Visio.visCtrlTypeBUTTON
.FaceID = Visio.visIconIXCUSTOM_DIAMOND
.AddOnName = "CDR.Modules.mdlMain.Start"
End With

'* ThisDocument.SetCustomToolbars uiObj
WorkDocument.SetCustomToolbars uiObj

End Sub

Вообще задача такая: Нужно что бы при открытии шаблона появлялась панелька с кнопками, при нажатии на которые выполнялись макросы из шаблона.
Подскажите, pls.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/03/2004 :  15:59:00
Вот и предыдущий товарищ (WiseChen) тоже пытался макрос в трафарет (vss) засунуть и вроде тоже не получилось. Я не знаю, может, если помучиться, то может и можно это сделать, но не проще ли попробовать другой вариант?
Можно ведь специфические рисунки строить не на основе трафарета, а на основе шаблона (vst). А в нем уже есть все окружение, в том числе и страница рисунка, в которую можно сунуть макрос. Тогда панелька с макросами будет появляться не при открытии vss на любом рисунке, а при создании нового рисунка на основе этого специального vst или при открытии рисунка, созданного на основе такого vst.
Если такое не понравится, то можно навеску тулбара вынести в Add-in, который будет обрабатывать все события открытия документа Visio и, если этот документ содержит нужный vss, навешивать тулбар.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)