在 VBA 中获取停靠的 Visio 模具,而不是文档模具

Getting docked Visio stencils, as opposed to the Document stencil, in VBA

我正在尝试制作一个 Visio 宏,它将按字母顺序排列文档中第一个停靠模板中的母版。下面是我的代码。但是,Set vsoDoc = Visio.Documents.ItemFromID(0) 似乎没有引用停靠模板,而是引用文档模板。我如何获得停靠模板?非常感谢任何帮助!

Dim i As Integer
Dim vsoDoc As Visio.Document
Dim vsoDocNew As Visio.Document
Dim dictMasters As New Scripting.Dictionary
Set vsoDoc = Visio.Documents.ItemFromID(0)    'Existing Stencil

Set vsoDocNew = Visio.Documents.AddEx("New Stencil.vss", , visAddStencil)     'New Sorted Stencil

'Get the names of the existing masters and sort them

For i = 1 To vsoDoc.Masters.Count
    Call dictMasters.Add(vsoDoc.Masters(i).Name, vsoDoc.Masters(i))
Next

list = dictMasters.Keys()

Dim First As Integer, Last As Long
Dim x As Long, j As Long
Dim Temp As String

First = LBound(list)
Last = UBound(list)
For x = First To Last - 1
    For j = x + 1 To Last
        If list(x) > list(j) Then
            Temp = list(j)
            list(j) = list(x)
            list(x) = Temp
        End If
    Next j
Next x

'Drop the existing masters into the new stencil based on the sorting

For i = 1 To dictMasters.Count
   Call vsoDocNew.Masters.Drop(dictMasters(list(i - 1)), 0, 0)
Next

我希望制作一个新模板,其母版与停靠模板相同,但按字母顺序排列。但是,生成的新模板是根据按字母顺序排列的文档模板生成的。 Visio.Documents.ItemFromID(0) 正在返回文档模板,但我想获取第一个停靠模板。如何获得停靠模板?

您可以遍历 ActiveWindow.Windows 列表并找到任何 window 其 .Type = visDockedStencilBuiltIn 或者您可以通过 .Document.Name,我认为您可以检查是否通过检查 if (.WindowState And visWSActive) = True

,模板在前面

所以基本上它的工作方式是,模板并没有真正附加到您的文档,而是附加到显示文档的 Window。因此,您必须查看在文档的 window 中打开了哪些子 windows,其中每个子 window 都可以有一个关联的文档(模板)

已解决!通过用下面的代码替换 vsoDoc 变量的赋值,我得到了想要的结果。

For i = 1 To ActiveWindow.windows.Count
    If ActiveWindow.windows(i).Type = visDockedStencilBuiltIn Then
        Debug.Print ActiveWindow.windows(i).Document.Name
        Set vsoDoc = ActiveWindow.windows(i).Document
        Debug.Print vsoDoc.Name
    End If
Next