最近,我在工作中遇到这样一个任务:我们有一个上千页的word文档,其中每隔几页就插入了一张图片,可以理解为公司logo。现在准备把这个文档发送给某个客户使用,但发送之前需要替客户将所有的logo删除。
没错,就是这么糟心的一个工作。
现在摆在面前的就是两条路,一个就是“干!!”,撸起袖子一张一张的删,上千页的文档,一天的时间总是可以搞定的。但对于这个方法,想想就难受,绝对是既耗精神又费眼力。
于是我便试图摸索第二种方法,看看能不能利用word自带的VBA,写一段简短的代码批量删除这些图片。
Shapes 和 inLineShapes
通过查找各种资料,发现word文档中的图片一般都存放在文档的Shapes 和 inLineShapes这两个属性中,对应的变量类型分别是Shape 和 inLineShape。
Shape 对象代表文档中的图形对象,也就是选择了文字环绕选项中的“衬于文字下方”和“浮于文字上方”的图片。这些图片的位置可以自由拖动。
InlineShape 代表文档中的嵌入式图形对象,也就是选择了文字环绕选项中的“嵌入型”、“四周型”、“紧密型”、“穿越型”和“上下型”的图片。
所谓嵌入式图形对象,是指将图像作为文字处理,在排版上以文字的方式进行排版。
批量删除图片
知道了图片的存储位置,就可以利用word自带的VBA编写相关代码了。找不到的请自行百度。
删除Shape类型的图片
Sub shanChuShape()
Dim myShape As Shape
For Each myShape In ActiveDocument.Shapes
myShape.Delete
Next
End Sub
删除inLineShape类型的图片
Sub shanChuInLineShape()
Dim myInlineShape As InlineShape
For Each myInlineShape In ActiveDocument.myInlineShapes
myInlineShape.Delete
Next
End Sub
以上都是简单的全部删除,除此之外还可以通过例如AlternativeText字段对需要删除的图片进行判断。AlternativeText字段的内容一般是插入的图片的全名。
Sub shanChuInLineShape()
Dim myInlineShape As InlineShape
For Each myInlineShape In ActiveDocument.myInlineShapes
If myInlineShape.AlternativeText = "E:\logo.png" Then #判断是不是logo图片
myInlineShape.Delete
End If
Next
End Sub
对于Shapes图片需特别注意!!
对于Shape类型的图片,因为VBA自身存在的bug,不能找到一个就直接删除一个,这会导致无法删除全部的图片。需要先将他们全部找出,然后在一个个删除。
Sub shanChuShape()
Dim myShape As Shape
Dim arr()
Dim k
k = 0
For Each myShape In ActiveDocument.Shapes #第一步:找到所有的Shape
ReDim Preserve arr(k)
arr(k) = myShape.Name
k = k + 1
Next
For k = 0 To UBound(arr) #第二步:逐个删除
ActiveDocument.Shapes(arr(k)).Delete
Next
End Sub