目录
一、思路
因为Word中的Visio对象也是Word中的域,所以在遍历的时候既可以遍历文档中的域(fields),也可以遍历 文档中的图片(inlineshapes)。本文是用遍历域的方法:
1.遍历文档中的域fd
2.判断每一个域fd
如果域代码中包含【EMBED Visio.Drawing.】,则说明是Visio对象,可以进行后续处理。
3.二进制存储
对于这个域的图片的二进制内容【fd.InlineShape.Range.EnhMetaFileBits】,使用【ADODB.STREAM】对象进行如下操作:
(1)以二进制方式打开【ADODB.STREAM】对象
(2)将这个域的图片的二进制内容【fd.InlineShape.Range.EnhMetaFileBits】写入(write)【ADODB.STREAM】对象
(3)将写入的内容存储为文件【savetofile】
(4)关闭【ADODB.STREAM】对象
二、示例代码
1.代码
Sub 批量导出Visio图()
Dim aDoc As Document
Dim fd As Field
Dim aDos As Object
Dim k As Long
Dim fDia As FileDialog
Dim saveFolder As String
'Dim fileType As String
Dim fileName As String
Dim t0 As Single
t0 = Timer
Set aDoc = ActiveDocument
Set aDos = CreateObject("ADODB.STREAM")
Set fDia = Application.FileDialog(msoFileDialogFolderPicker)
With fDia
.Title = "选择图片存储位置(文件夹):"
If .Show Then
saveFolder = .SelectedItems(1)
'fileType = Trim(InputBox("请输入支持的图片格式后缀(如png、jpeg、jpg、gif等):", "图片格式", "jpg"))
For Each fd In aDoc.Fields
If fd.Code Like "*EMBED Visio.Drawing.*" Then
k = k + 1
fileName = saveFolder & "\" & k & ".emf"
With aDos
.Open
.Type = 1
.write fd.InlineShape.Range.EnhMetaFileBits
.savetofile fileName
.Close
End With
Debug.Print Format(k, "第0个Visio图片存储完成!")
End If
Next
End If
End With
Set aDoc = Nothing
Set aDos = Nothing
Set fDia = Nothing
MsgBox Format(k, "完成 共处理了0个Visio图片 用时:") & Timer - t0 & "秒"
End Sub
2.运行效果
(1)示例文件
![](https://i-blog.csdnimg.cn/blog_migrate/3b728e15c1e147a9f4567a804f409679.jpeg)
(2)复制代码-运行
![](https://i-blog.csdnimg.cn/blog_migrate/3226f9d51fc62c0ad5462f8cb5d09b02.jpeg)
(3)选择存储位置
![](https://i-blog.csdnimg.cn/blog_migrate/bd4062b015e514e4d3806a9134ea8fa4.jpeg)
(4)存储完成
![](https://i-blog.csdnimg.cn/blog_migrate/6062b6f14fd2c27ab2ff55f2ad8d04d2.jpeg)
(5)查看文件
![](https://i-blog.csdnimg.cn/blog_migrate/fa00e71d952a7f0a5a066b04a26b1c0b.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/daa26d439932f559e2abc16e9f8db848.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/bd64220ef83d9c3a74e780b2bbf76316.jpeg)
三、注意
Word VBA中通过【ADODB.STREAM】对象存储图片只支持【.emf】格式,需要【.jpg】格式需要借助其他API函数处理。此处没有进行转换。
可以将这些图片通过其他批处理方式,转换一下格式即可。