【VBA实战】在Visio中自动生成组成图

组成图,通常在写功能设计时做功能划分时使用。基本固定书写格式为:“xx模块由xx、xx、xx等几个功能组成。功能组成图如下所示。”因为其形状像一个爪子,又称“爪子图”。

这么固定的格式和显示,自然要通过vba来自动实现来才好。Demo代码如下:

Sub 绘制组成图()

    Dim rectBase As Shape
    Dim rectSub(100) As Shape
    Dim connector(100) As Shape
    
    
    'Enable diagram services
    Dim DiagramServices As Integer
    DiagramServices = ActiveDocument.DiagramServicesEnabled
    ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150
    Dim content As Variant
    Dim clen As Long
    Dim basex, basey, cstart As Double
      
    content = Array("数据汇集分发功能", "数据接收", "数据处理", "数据转换", "数据分发")
    clen = UBound(content) '数组最大可用下标

    Dim UndoScopeID1 As Long
    UndoScopeID1 = Application.BeginUndoScope("绘图并调整格式")
    
    basex = 4
    basey = 8
    Set rectBase = ActiveWindow.Page.Drop(Application.Documents.Item("BASIC_M.VSSX").Masters.ItemU("Rectangle"), basex, basey)
    rectBase.CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = "60 mm"
    rectBase.CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = "15 mm"
    rectBase.CellsSRC(visSectionCharacter, 0, visCharacterFont).FormulaU = "249"
    rectBase.CellsSRC(visSectionCharacter, 0, visCharacterAsianFont).FormulaU = "249"
    rectBase.CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = "14 pt"
    rectBase.Characters = content(0)
    
    cstart = basex - (clen - 1) / 2
    
    For i = 1 To clen
        
        '绘制子矩形,设置大小
        Set rectSub(i) = ActiveWindow.Page.Drop(Application.Documents.Item("BASIC_M.VSSX").Masters.ItemU("Rectangle"), cstart + i - 1, basey - 2)
        rectSub(i).CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = "15 mm"
        rectSub(i).CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = "60 mm"
        
        '设置组成项内容格式
        rectSub(i).Characters = content(i)
        rectSub(i).CellsSRC(visSectionCharacter, 0, visCharacterFont).FormulaU = "249"
        rectSub(i).CellsSRC(visSectionCharacter, 0, visCharacterAsianFont).FormulaU = "249"
        rectSub(i).CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = "14 pt"
        
        '连接
        Set connector(i) = ActiveWindow.Page.Drop(Application.ConnectorToolDataObject, 0, 0)
        Dim vsoCell1 As Visio.Cell
        Dim vsoCell2 As Visio.Cell
        Set vsoCell1 = connector(i).CellsU("BeginX")
        Set vsoCell2 = rectBase.CellsSRC(7, 0, 0)
        vsoCell1.GlueTo vsoCell2
        Set vsoCell1 = connector(i).CellsU("EndX")
        Set vsoCell2 = rectSub(i).CellsSRC(7, 2, 0)
        vsoCell1.GlueTo vsoCell2

        
    Next i
    
    Application.EndUndoScope UndoScopeID1, True
    
    'Restore diagram services
    ActiveDocument.DiagramServicesEnabled = DiagramServices
    
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值