Author |
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 у меня потерпели неудачу.
|
|
|
SuperTed
Russia
7 Posts |
Posted - 03/01/2004 : 22:21:40
|
Конечно, огромное спасибо за содержательный ответ.
Но если честно просто не верится, что для столь простой (типовой, явной и логичной) задачи в Visio не предусмотрено встроенной операции. Может быть я не совсем правильно спросил.
Попробую вот так. Создан файл для автоматизации следующих действий. На форме вводятся данные о проекте, по командной кнопке данные из формы разносятся по нужным полям в таблицах и на схеме. Далее данный файл после удачной обкатки помещается в папку и оттуда копируется в папку с конкретным проектом. В скопированном файле вносятся нужные данные, сохраняются и забываются. В следующую папку проекта опять копируется файл из исходной (скажем шаблонной) папки и там опять вводятся конкретные данные по проекту. Так как после обкатки шаблонного файла он будет предоставлен моим коллегам, которые мягко скажем только недавно из-за кульмана вылезли и слыхом не слыхивали о VBA то для упрощения вызова формы запроса данных по проекту хотелось бы создать кнопочну на тулбаре (желательно с улыбающейся рожицем :)), чтобы недалекие товарищи не вздумали нажимать Alt+F11 и не дай бог еще рассматривать плоды чужого интелектуального труда.
Не подумайте я не циник, но даже в жизни стараюсь делать примерно так On Error Goto туда где ошибок быть не может.
Заранее благодарен! |
|
|
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. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/03/2004 : 15:59:00
|
Вот и предыдущий товарищ (WiseChen) тоже пытался макрос в трафарет (vss) засунуть и вроде тоже не получилось. Я не знаю, может, если помучиться, то может и можно это сделать, но не проще ли попробовать другой вариант? Можно ведь специфические рисунки строить не на основе трафарета, а на основе шаблона (vst). А в нем уже есть все окружение, в том числе и страница рисунка, в которую можно сунуть макрос. Тогда панелька с макросами будет появляться не при открытии vss на любом рисунке, а при создании нового рисунка на основе этого специального vst или при открытии рисунка, созданного на основе такого vst. Если такое не понравится, то можно навеску тулбара вынести в Add-in, который будет обрабатывать все события открытия документа Visio и, если этот документ содержит нужный vss, навешивать тулбар. |
|
|
|
Topic |
|
|
|