1. 为什么需要VB宏批量生成流程图?
每次手动在Visio里拖拽图形、调整位置、输入文字,是不是觉得特别浪费时间?我最早做项目文档时,经常要画几十个相似的流程图,光是复制粘贴就耗掉大半天。后来发现Visio自带的VB宏功能简直是办公效率神器——它能像盖章一样批量生成标准化图形,还能自动排列和对齐。
举个例子,上周我需要为团队制作20个审批流程模板。如果手动操作,每个模板至少需要15分钟,而用宏编程只需要:
- 准备好流程节点数据
- 执行一次宏脚本
- 20份带中文标注的流程图瞬间生成
实测下来,复杂流程图的制作时间能从小时级压缩到分钟级。特别适合需要频繁产出标准化流程图的场景,比如:
- 软件开发的需求文档
- 质量管理的SOP文件
- 项目管理的审批流程
- 培训教材的步骤说明
2. 宏编程前的准备工作
2.1 启用Visio开发者选项
很多朋友找不到宏按钮,其实需要先开启开发者模式:
- 点击"文件"→"选项"
- 选择"自定义功能区"
- 在右侧勾选"开发工具"复选框
- 现在菜单栏会出现"开发工具"选项卡
注意:Visio 2010默认安装可能不包含VB组件,如果运行宏报错,需要单独安装Visual Studio Tools for Office Runtime。
2.2 认识流程图基础元素
写宏代码前要了解Visio的图形命名规则:
- BASFLO_M.VSS:基础流程图模具文件
- Process:矩形流程节点
- Decision:菱形判断节点
- Subprocess:带折叠标记的子流程
- Container:可折叠的分组容器
建议先手动拖几个图形到画布,观察它们的属性名称。我在第一次尝试时,就曾因把"Decision"错写成"Judgement"导致脚本报错。
3. 手把手编写第一个流程图宏
3.1 创建基础流程链
下面这段代码会生成包含4个主流程和2个子流程的标准结构:
Sub DrawBasicFlow() Dim pg As Page Set pg = ActivePage ' 获取图形模板 Dim stencil As Document Set stencil = Application.Documents.OpenEx( _ Application.GetBuiltInStencilFile( _ visBuiltInStencilFlowchart, visMSMetric), _ visOpenRO) ' 定义图形对象 Dim processMaster As Master Dim decisionMaster As Master Set processMaster = stencil.Masters("Process") Set decisionMaster = stencil.Masters("Decision") ' 放置第一个流程节点 Dim shape1 As Shape Set shape1 = pg.Drop(processMaster, 5, 10) shape1.Text = "开始申请" ' 添加判断节点(自动连接右侧) Dim shape2 As Shape Set shape2 = pg.DropConnected(decisionMaster, shape1, visAutoConnectDirRight) shape2.Text = "审批通过?" ' 添加分支流程 Dim shape3 As Shape Set shape3 = pg.DropConnected(processMaster, shape2, visAutoConnectDirRight) shape3.Text = "执行操作" Dim shape4 As Shape Set shape4 = pg.DropConnected(processMaster, shape2, visAutoConnectDirDown) shape4.Text = "退回修改" End Sub3.2 添加智能连接线
手动画连接线既麻烦又容易错位,用AutoConnect方法可以自动生成带箭头的连线:
' 在流程节点间创建带箭头的连接线 Dim connectorMaster As Master Set connectorMaster = stencil.Masters("Dynamic Connector") shape1.AutoConnect shape2, visAutoConnectDirRight, connectorMaster shape2.AutoConnect shape3, visAutoConnectDirRight, connectorMaster shape2.AutoConnect shape4, visAutoConnectDirDown, connectorMaster4. 进阶技巧:从Excel批量生成流程图
真正的效率爆发点是让宏读取外部数据。我常用Excel作为数据源,比如这样一张表:
| 节点类型 | 节点文本 | 连接目标 | 方向 |
|---|---|---|---|
| Process | 提交申请 | 审批流程 | 右 |
| Decision | 金额>5000? | 主管审批 | 下 |
| Process | 专员处理 | - | 右 |
对应的宏代码改造如下:
Sub FlowFromExcel() Dim excelApp As Object Set excelApp = CreateObject("Excel.Application") ' 打开当前目录下的数据文件 Dim wb As Object Set wb = excelApp.Workbooks.Open(ThisDocument.Path & "\flow_data.xlsx") ' 读取工作表数据 Dim sheet As Object Set sheet = wb.Sheets(1) ' 创建字典存储已生成的图形 Dim shapesDict As Object Set shapesDict = CreateObject("Scripting.Dictionary") ' 遍历Excel行数据 Dim i As Integer For i = 2 To sheet.UsedRange.Rows.Count Dim nodeName As String nodeName = sheet.Cells(i, 2).Value ' 放置新图形 Dim newShape As Shape Select Case sheet.Cells(i, 1).Value Case "Process" Set newShape = ActivePage.Drop(processMaster, i*2, 10) Case "Decision" Set newShape = ActivePage.Drop(decisionMaster, i*2, 10) End Select newShape.Text = nodeName shapesDict.Add nodeName, newShape ' 建立连接关系 If sheet.Cells(i, 3).Value <> "" Then Dim targetShape As Shape Set targetShape = shapesDict(sheet.Cells(i, 3).Value) Select Case sheet.Cells(i, 4).Value Case "右" newShape.AutoConnect targetShape, visAutoConnectDirRight Case "下" newShape.AutoConnect targetShape, visAutoConnectDirDown End Select End If Next i wb.Close False excelApp.Quit End Sub这个方案特别适合流程经常变动的场景。我们法务部门现在每次更新审批规则,只需要修改Excel表格,重新运行宏就能立即生成最新流程图。