如何从模板调用visio宏

时间:2010-03-08 17:24:53

标签: vb6 macros visio

我为Visio编写了一些宏。现在我将这些复制到名为Macros.vss的模板中 我现在该如何调用我的宏?

1 个答案:

答案 0 :(得分:1)

这完全取决于宏的功能以及您希望如何调用它们。我将假设它们只是将在活动的Visio页面中执行某些操作的宏。

默认情况下,在Visio VBA中,任何没有参数的公共subs都会添加到Visio Tools-> Macros菜单中,在包含宏的文档(在本例中为Macros)命名的文件夹中,然后按模块分隔为文件夹名称。如果您是唯一使用宏的人,那么您可能不需要做任何其他事情。

但是,既然你把它们放在一个vss文件中,我会假设你想把它们分发给其他人。

当以编程方式添加时,Visio以及工具栏和按钮的工作方式有一些有趣的(有趣的是我的意思是令人恼火)。不幸的是,当您使用UIObject和Toolbar以及ToolbarItem类创建工具栏时,Visio将假设您调用的代码驻留在活动图形中,并且不能位于模板中。所以我可以给你一些关于使用这些类的指导,但基本上它包括分发.vst模板和你的.vss文件,只有.vst文件中的一个必需子。

因此,您可以将代码附加到.vss文件中的形状母版,而不是使用自定义工具栏,这些代码在将代码放到图形文档上时执行代码(使用CALLTHIS和结构图中的EventDrop事件)。使用这种方法,我只有一个使用callthis调用的子函数,它将一个shape对象作为参数,执行一些代码,然后删除形状(如果我不再需要它)。

最后,您可以通过编程方式操作Visio UI,为宏添加工具栏和按钮。下面是一些示例代码,基本上就是我使用我开发的解决方案的方式。正如我上面提到的,使用此方法最重要的部分是拥有一个文档模板(.vst),它包含一个以字符串作为参数的子代码(下面的代码必须命名为RunStencilMacro)。该字符串应为“DocumentName.ModuleName.SubName”。此子必须从文档中取出DocumentName,并获取该文档的Document对象句柄。然后它必须使用ModuleName.SubName部分对该文档执行ExecuteLine。你必须逐步完成代码并弄清楚一些事情,但是一旦你掌握了正在发生的事情就应该有意义。

我不确定使用VBA以交互方式执行宏的任何其他方法。我认为exe和COM插件可能没有工具栏的这个问题......

Private Sub ExampleUI()
    Dim UI As Visio.UIObject
    Dim ToolbarSet As Visio.ToolbarSet
    Dim Toolbars As Visio.Toolbars
    Dim Toolbar As Visio.Toolbar
    Dim ToolbarItems As Visio.ToolbarItems
    Dim ToolbarItem As Visio.ToolbarItem
    Dim TotalToolBars As Integer

    Dim Toolbarpos As Integer

    Const ToolbarName = "My Toolbar"

    ' Get the UIObject object for the toolbars.
    If Visio.Application.CustomToolbars Is Nothing Then
        If Visio.ActiveDocument.CustomToolbars Is Nothing Then
            Set UI = Visio.Application.BuiltInToolbars(0)
        Else
            Set UI = Visio.ActiveDocument.CustomToolbars
        End If
    Else
       Set UI = Visio.Application.CustomToolbars
    End If

    Set ToolbarSet = UI.ToolbarSets.ItemAtID(visUIObjSetDrawing)
    ' Delete toolbar if it exists already
    TotalToolBars = ToolbarSet.Toolbars.Count
    For i = 1 To TotalToolBars
        Set Toolbar = ToolbarSet.Toolbars.Item(i - 1)
        If Toolbar.Caption = ToolbarName Then
            Toolbar.Visible = False
            Toolbar.Delete
            Exit For
        End If
    Next

    ' create toolbar
    Set Toolbar = ToolbarSet.Toolbars.Add
    Toolbar.Caption = ToolbarName

    Dim IconPos As Long ' counter to determine where to put a button in the toolbar

    IconPos = IconPos + 1

    Dim IconFunction As String
    IconFunction = """Macros.Module1.SubName"""

    Set ToolbarItem = Toolbar.ToolbarItems.AddAt(IconPos)
    With ToolbarItem
        .AddOnName = "RunStencilMacro """ & IconFunction & """"
        .Caption = "Button 1"
        .CntrlType = Visio.visCtrlTypeBUTTON
        .Enabled = True
        .state = Visio.visButtonUp
        .Style = Visio.visButtonIcon
        .Visible = True
        .IconFileName ("16x16IconFullFilePath.ico")
    End With

    ' Now establish the position of this toolbar
    With Toolbar
        .Position = visBarTop 'Top overall docking area
        .Left = 0 'Puts it x pixels from the left
        .RowIndex = 13
        .Protection = visBarNoCustomize
        Toolbar.Enabled = True
        .Visible = True
    End With

    Visio.Application.SetCustomToolbars UI
    Visio.ActiveDocument.SetCustomToolbars UI
End Sub
相关问题