word 数组 转 指针_Word之VBA丨文档中的图片怎样批量加边框?

不称深度指南,只愿浅度指北

很多时候,我们在 Word 中添加的图片,大部分都是类似下面这样“白底黑图”的:

fe7f6fb9c9d8fe9822888e44fed9209d.png

如果图片内容是一段文字,就更加大了我们对文章的理解难度。

这时,我会给它添加一个边框(你也可以留意我的近期文章,凡是白底的图片,都会添加灰色边框线),使用 Word 自带的添加边框功能即可:

47e15e91e01a8379cf89cb67c6b23a26.png

但如果图片过多的话,一个一个手动添加,还是太麻烦。作为一个「伪程序员」来说,这是不能忍的。如果有这样一个按钮,点一下就可以完成,那就太棒了!

这里分享一些小北我的构建过程,你可以参考学习。当然,滑动到文章底部,会有详细的代码。

 有时高版本软件也不好  图片样式调整无法使用录制宏

首先解释一个概念,嵌入式图形,指那些可视作文本的图形:

167fe2edabd91a85e9650ca784a4a5d1.png

为避免在调整文字时,图片发生移动,我们通常会使用这种格式。

但在启动 Word 宏录制时,你无法选中此类图片:

00c106b9f2f746464aa7c3d5c4c661f3.gif

也就谈不上对图片格式的调整了。

经过一番查询,最终发现,在高版本中不支持此方式:

7eed4a3396a7eaaebee78fe12d3cac75.png

因此,我们需要在后缀名为 doc 的文件中录制宏

 改用循环  获取选区所有图片

首先,一般情况下,我们并不会给整篇文档的所有图片添加边框,而是某些特定区域的图片,因此,我们需要设置仅获取选区中的图片。

而如何获取图片,在录制的宏中代码如下:

fb195a69a0e083950f7575aef419be8a.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。

 哪个程序没有BUG呢  一点小问题

到上面这步,我们已经基本完成了。

但在实际使用中,你可能会发现,选区自动添加了灰色的底纹,且无法通过 Word 功能去除:

71cbc80648e484e2abcb63a41640db69.png

深灰为后续选取部分,浅灰为代码自动添加部分

因此,我们可以将选区重置为光标型,那么选区中就不包含任何内容啦,就可以避免这个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 —— THE END —— afbb0da23eb17e55da8d1ef29e4cee0b.gif 点赞点的多,有人送跑车 40b2001d5400eeb00694d928e3b83516.png
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值