我已经看到一些关于能够使用如下内容通过 vba 更改从属布局的参考。有没有办法使用最新版本的 Visio 通过 VBA 以编程方式更改从属布局?
谢谢
布雷迪
调用 Visio.Application.Addons("OrgC11").Run("/toolbar_vert")
ChatGPT 还说了以下内容:
要使用 VBA 更改 Visio 中下属的布局,可以使用 Shape 对象的 Layout 属性。下面是一个示例代码片段,演示了如何更改 Visio 组织结构图中下属的布局:
vbnetCopy codeSub ChangeSubordinateLayout()
Dim orgChart As Visio.Document
Set orgChart = Application.ActiveDocument
Dim orgChartPage As Visio.Page
Set orgChartPage = orgChart.Pages(1)
Dim orgChartShapes As Visio.Shapes
Set orgChartShapes = orgChartPage.Shapes
Dim topLevelShape As Visio.Shape
Set topLevelShape = orgChartShapes.ItemFromID(1)
Dim subordinates As Visio.Shapes
Set subordinates = topLevelShape.Subordinates
Dim subordinateShape As Visio.Shape
For Each subordinateShape In subordinates
subordinateShape.Layout = VisLayoutTypes.visLORL
Next subordinateShape
End Sub
此代码假设您在活动 Visio 文档的第一页上有一个组织结构图,并且顶级形状的 ID 为 1。该代码循环遍历每个从属形状并将其布局设置为 visLORL,这是一个将下级排列为水平树状结构的布局。您可以将 visLORL 替换为任何其他有效的 VisLayoutTypes 枚举值以使用不同的布局。
调用 Visio.Application.Addons("OrgC11").Run("/toolbar_vert")
您可以使用 VBA 来完成此操作,但我不会称之为“支持”,因为这是使用 Visio 中包含的插件完成的,(据我所知)没有官方文档并且可能会更改或从一个版本删除到下一版本。
据我所知,与常规形状相比,组织结构图形状也很不寻常,并且有很多怪癖。例如,许多与布局和形状类型相关的属性都是只读的/如果在形状表中或通过 VBA 更改,则不会明显更改形状。
话虽这么说,我发现有两种方法可以使用 Visio 2016 来执行此操作,并且还必须选择形状才能使这两种方法发挥作用。
使用参数之一调用“orgC11”插件来安排下属
这可以通过以下行完成
Application.Addons("OrgC11").Run(argument)
,以及我所知道的 OrgC11 安排下属的论点列在这里:
"/gallery_horiz1", "/gallery_horiz2", "/gallery_horiz3", "/gallery_horiz4", "/gallery_horiz5", "/gallery_horiz6"
"/gallery_vert1", "/gallery_vert2", "/gallery_vert3", "/gallery_vert4", "/gallery_vert5", "/gallery_vert6", "/gallery_vert7", "/gallery_vert8"
"/gallery_sidebyside1", "/gallery_sidebyside2", "/gallery_sidebyside3", "/gallery_sidebyside4"
使用组织结构图形状的 ShapeSheet 调用“安排下属”对话框,然后使用 SendKeys() 使用箭头、选项卡和输入键导航并选择所需的布局。
这实际上应该以相反的顺序完成,因为 SendKeys 将命令的按键放入队列中执行,因此看起来像这样:
Sub arrangeSubordinates(shp As Visio.Shape, Optional rearIdx As Integer = -1)
' rearIdx: offset number relative to the last menu item; Default is double side-by-side, horizontal is rearIdx=17
' 11-> vertical #1, 8-> side-by-side #1
Dim keysToSend
keysToSend = Replace(Space(17), " ", "{DOWN}") 'Move to last menu item for a point of reference
If shp Is Nothing Then
Err.Raise vbObjectError + 513, "Module1.arrangeSubordinates", _
"shp is None! Not allowed!"
End If
If shp.CellExists("Actions.ArrangeSubs.Action", 0) Then 'this Action field seems to only exist on org chart shapes
If shp.SectionExists(visSectionAction, 0) Then
If rearIdx > 0 Then
keysToSend = keysToSend & Replace(Space(rearIdx), " ", "{UP}") 'Move to another menu item from the last menu item
End If
keysToSend = keysToSend & "{TAB}{TAB}{ENTER}" 'Confirm layout selection
Debug.Print ("Pre-Dialog " & Left(shp.Text, InStr(1, shp.Text, vbLf)))
SendKeys (keysToSend)
shp.CellsU("Actions.ArrangeSubs.Action").Trigger 'Run dialog with queued keys
Debug.Print ("Post-Dialog")
End If
End If
End Sub
OrgC11 参数的原始来源:http://visguy.com/vgforum/index.php?topic=4286.msg16731#msg16731