最新版本的 Visio 是否支持 vba 更改组织结构图从属布局

问题描述 投票:0回答:1

我已经看到一些关于能够使用如下内容通过 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
1个回答
2
投票

您可以使用 VBA 来完成此操作,但我不会称之为“支持”,因为这是使用 Visio 中包含的插件完成的,(据我所知)没有官方文档并且可能会更改或从一个版本删除到下一版本。

据我所知,与常规形状相比,组织结构图形状也很不寻常,并且有很多怪癖。例如,许多与布局和形状类型相关的属性都是只读的/如果在形状表中或通过 VBA 更改,则不会明显更改形状。

话虽这么说,我发现有两种方法可以使用 Visio 2016 来执行此操作,并且还必须选择形状才能使这两种方法发挥作用。

  1. 使用参数之一调用“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"
    
  2. 使用组织结构图形状的 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

© www.soinside.com 2019 - 2024. All rights reserved.