Как вызвать макрос Visio с трафарета - PullRequest
1 голос
/ 08 марта 2010

Я написал несколько макросов для Visio. Теперь я скопировал их на трафарет Macros.vss Как теперь я могу назвать свои макросы?

1 Ответ

1 голос
/ 10 марта 2010

Все зависит от того, что делают макросы и как вы хотите их называть. Я предполагаю, что это просто макросы, которые будут выполнять что-то на активной странице Visio.

По умолчанию в Visio VBA любые общедоступные подпрограммы без аргументов добавляются в меню Visio Tools-> Macros, в папку с именем документа, содержащего макросы (в данном случае Macros), а затем разделяются на папки по имени модуля. , Если вы единственный, кто использует макросы, вам, вероятно, больше ничего не нужно делать.

Однако, поскольку вы поместили их в файл vss, я предполагаю, что вы хотели бы распространить их среди других людей.

Есть что-то забавное (и под забавным я имею в виду раздражение) в Visio и в том, как работают панели инструментов и кнопки, когда добавляются программно. К сожалению, когда вы создаете панель инструментов с использованием классов UIObject и Toolbar и ToolbarItem, Visio предполагает, что вызываемый вами код находится в активном чертеже и не может быть в трафарете. Поэтому я могу дать вам небольшое руководство по использованию этих классов, но в основном оно состоит в распространении шаблона .vst вместе с вашими файлами .vss, с одним обязательным подпрограммой в файле .vst.

Таким образом, вместо использования настраиваемой панели инструментов, вы можете прикрепить код к мастерам фигур в вашем файле .vss, которые исполняют код, когда они перетаскиваются в чертежный документ (используя CALLTHIS и событие EventDrop в таблице форм). С этим методом у меня просто есть подпрограмма, которая вызывается с использованием callthis, которая принимает объект формы в качестве аргумента, выполняет некоторый код, а затем удаляет форму (если я больше не хочу ее использовать).

И, наконец, вы можете программно управлять пользовательским интерфейсом Visio, чтобы добавить панель инструментов и кнопки для ваших макросов. Ниже приведен пример кода, в основном, как я это делаю с разработанным мною решением. Как я упоминал выше, наиболее важной частью использования этого метода является наличие шаблона документа (.vst), который содержит подпрограмму (с приведенным ниже кодом она должна называться RunStencilMacro), которая принимает строку в качестве аргумента. Эта строка должна быть «DocumentName.ModuleName.SubName». Эта подпрограмма должна извлечь DocumentName из строки и получить дескриптор объекта Document для этого документа. Затем он должен выполнить ExecuteLine для этого документа с частью ModuleName.SubName. Вам придется пройтись по коду и выяснить некоторые вещи, но как только вы поймете, что происходит, это должно иметь смысл.

Я не уверен в каких-либо других способах выполнения макросов в интерактивном режиме с 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
...