很多时候,我们在 Word 中添加的图片,大部分都是类似下面这样“白底黑图”的:
![fe7f6fb9c9d8fe9822888e44fed9209d.png](https://i-blog.csdnimg.cn/blog_migrate/b2543e771999b918b2973e2c42f540d0.png)
如果图片内容是一段文字,就更加大了我们对文章的理解难度。
这时,我会给它添加一个边框(你也可以留意我的近期文章,凡是白底的图片,都会添加灰色边框线),使用 Word 自带的添加边框功能即可:
![47e15e91e01a8379cf89cb67c6b23a26.png](https://i-blog.csdnimg.cn/blog_migrate/e8b0027c09e62fb3431fa16d44af96d7.png)
但如果图片过多的话,一个一个手动添加,还是太麻烦。作为一个「伪程序员」来说,这是不能忍的。如果有这样一个按钮,点一下就可以完成,那就太棒了!
这里分享一些小北我的构建过程,你可以参考学习。当然,滑动到文章底部,会有详细的代码。
有时高版本软件也不好 图片样式调整无法使用录制宏首先解释一个概念,嵌入式图形,指那些可视作文本的图形:
为避免在调整文字时,图片发生移动,我们通常会使用这种格式。
但在启动 Word 宏录制时,你无法选中此类图片:
![00c106b9f2f746464aa7c3d5c4c661f3.gif](https://i-blog.csdnimg.cn/blog_migrate/587e30da5a45286f2cb6e40175d11b56.gif)
也就谈不上对图片格式的调整了。
经过一番查询,最终发现,在高版本中不支持此方式:
![7eed4a3396a7eaaebee78fe12d3cac75.png](https://i-blog.csdnimg.cn/blog_migrate/14d71303c8bfb87f8ac02e260bdd0142.png)
因此,我们需要在后缀名为 doc 的文件中录制宏。
改用循环 获取选区所有图片首先,一般情况下,我们并不会给整篇文档的所有图片添加边框,而是某些特定区域的图片,因此,我们需要设置仅获取选区中的图片。
而如何获取图片,在录制的宏中代码如下:
![fb195a69a0e083950f7575aef419be8a.png](https://i-blog.csdnimg.cn/blog_migrate/e1ebb3c67f87299adea024f33fa308a3.png)
使用的是索引方式,但我们需要设置所有的图片,而不仅是第一张,因此,需要在选区的所有图片中循环,可以使用 For Each 语句:
For Each InShape In Selection.InlineShapes
With InShape
With .Borders(wdBorderLeft)
.LineStyle = wdLineStyleSingle
.LineWidth = wdLineWidth050pt
.Color = -570376193
End With
'中间省略相似部分
.Borders.Shadow = False
End With
Next
录制宏就可以
添加边框的三要素
边框包含三种基本的属性,样式(实线、虚线)、宽度(粗细)、颜色。
而这些,我们都可以通过录制宏来完成。我比较常用的就是单实线 wdLineStyleSingle,五十度灰 -570376193。
到上面这步,我们已经基本完成了。
但在实际使用中,你可能会发现,选区自动添加了灰色的底纹,且无法通过 Word 功能去除:
深灰为后续选取部分,浅灰为代码自动添加部分
因此,我们可以将选区重置为光标型,那么选区中就不包含任何内容啦,就可以避免这个bug了。
而选区的重置,我们可以这样定义:
Dim 数字 As Integer
Selection.Start = 数字
Selection.End = 数字
但新问题出现了,如果选区已经重置,我们之前获取的图片对象就失效了。因此,需要先将图片存储在内存中,以供后续使用。
我们可以定义一个图形数组,存放这些选区中的图片:
Dim Inshapes() As InlineShape
数组大小 = Selection.InlineShapes.Count
If 数组大小 > 0 Then '防止为选择任何图片出现错误
ReDim Inshapes(1 To 数组大小) '下标从1开始
For i = 1 To 数组大小
Set Inshapes(i) = Selection.InlineShapes(i)
Next
End If
将图片存储到内存后,我们就可以将选区重置为空、循环添加边框啦。
这部分也比较简单,不单独贴代码了。
你真细呀 亿点点细节为方便我们使用、也防止我们不正确的操作引发程序崩溃,我们需要添加一些细节:
01 反馈提示:
在用户未选择区域时提示“未选择”
执行完代码,反馈给用户已完成图片数
02 光标重置位置:
原代码每次执行完,光标都定位在第一个字符后,可设置为选区的开始位置。
03 样式支持自定义:
允许手动设置边框的颜色、宽度、线型,这样就可以根据不同的文章,实现不同的图片边框效果。
但也不能每次都要设置,需要给一个默认值,以减少操作成本。
04 仅图片有效:
嵌入式图形不仅是图片,还有一些其他元素,虽然不常见,如果做个限定更好(可使用inlineshape.type)。05 颜色判断:
可以判断图片的外部是否为白色,可能需要其他的API来完成。
代码&解释 以下为完整代码(某些细节未添加):
Sub 批量添加图片边框()
'本代码由公众号「未央暮城」作者「莫浅北」创建,转载借鉴请备注
Dim ThisStart As Integer
ThisStart = Selection.Start
Dim Inshapes() As InlineShape
Dim ArrCount
ArrCount = Selection.InlineShapes.Count
If ArrCount > 0 Then '防止未选择任何图片出现错误
ReDim Inshapes(1 To ArrCount) '下标从1开始
'存储图片到内存
For i = 1 To ArrCount
Set Inshapes(i) = Selection.InlineShapes(i)
Next
'保存到内存后再重置选区
Selection.Start = ThisStart
Selection.End = ThisStart
Dim inshape
For Each inshape In Inshapes
With inshape
With .Borders(wdBorderLeft)
.LineStyle = wdLineStyleSingle
.LineWidth = wdLineWidth050pt
.Color = -570376193
End With
With .Borders(wdBorderRight)
.LineStyle = wdLineStyleSingle
.LineWidth = wdLineWidth050pt
.Color = -570376193
End With
With .Borders(wdBorderTop)
.LineStyle = wdLineStyleSingle
.LineWidth = wdLineWidth050pt
.Color = -570376193
End With
With .Borders(wdBorderBottom)
.LineStyle = wdLineStyleSingle
.LineWidth = wdLineWidth050pt
.Color = -570376193
End With
.Borders.Shadow = False
End With
Next
With Options
.DefaultBorderLineStyle = wdLineStyleSingle
.DefaultBorderLineWidth = wdLineWidth050pt
.DefaultBorderColor = -570376193
End With
End If
End Sub
其中,只有嵌入式图形才可以使用该代码,非嵌入式图形,请另外录制,或者将其转为嵌入式(不知道如何批量转嵌入?可以底部留言,后续可能会增加这部分代码)
最后的叨逼叨
今天,在路上看到一群小姐姐坐在几辆跑车里(应该是搞活动),心里就想(酸),跑车也没啥好的,都不能防雨。
然后,可能是感动了老天爷,一辆洒水车从路边经过……
司机突然发现被“雨”淋了,赶紧一溜烟跑了,可洒水车后面的就倒霉了,只能跟在洒水车后面一点点蠕动,那叫一个憋屈![5ef3b7aeb00344ebd9dff4932d3a9199.png](https://i-blog.csdnimg.cn/blog_migrate/e644448cb7e2be7cf59c623352c33ca6.png)
![afbb0da23eb17e55da8d1ef29e4cee0b.gif](https://i-blog.csdnimg.cn/blog_migrate/c904fe9817178d66ef99da4cc8c544c4.gif)
![40b2001d5400eeb00694d928e3b83516.png](https://i-blog.csdnimg.cn/blog_migrate/82268c71a0c8e5f16c982e75abac7018.png)