1

i have written some Macros for Visio. Now I copied these to a Stencil called Macros.vss How can I call my Macros now?

4

1 回答 1

1

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

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

但是,由于您将它们放在 vss 文件中,因此我假设您希望将它们分发给其他人。

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

因此,您可以不使用自定义工具栏,而是将代码附加到 .vss 文件中的形状母版,当它们被拖放到绘图文档上时执行代码(使用 CALLTHIS 和形状表中的 EventDrop 事件)。使用这种方法,我只有一个使用 callthis 调用的子程序,它接受一个形状对象作为参数,执行一些代码,然后删除该形状(如果我不再想要它的话)。

最后,您可以以编程方式操作 Visio UI,为宏添加工具栏和按钮。下面是一些示例代码,基本上是我使用我开发的解决方案的方式。正如我上面提到的,使用此方法最重要的部分是拥有一个文档模板(.vst),其中包含一个以字符串作为参数的子(使用下面的代码,它必须命名为 RunStencilMacro)。该字符串应该是“DocumentName.ModuleName.SubName”。这个 sub 必须从字符串中取出 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
于 2010-03-10T18:10:58.667 回答