在 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
我正在尝试制作一个 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