使用 VBA 宏在 Word 中水平对齐(分布)图像
Posted
技术标签:
【中文标题】使用 VBA 宏在 Word 中水平对齐(分布)图像【英文标题】:Align (distribute) images horizontally in Word with VBA macro 【发布时间】:2021-05-30 07:48:26 【问题描述】:这是我第一次在 VBA 中编写宏。我的目标是编写一个 VBA 宏,它将自动对齐(分布)Word 文档中的所有图像(彼此相邻),并在每张图片的每一面。如果没有足够的空间容纳另一张图片,我需要它转到下一行(就在之前的图片下方)并继续水平对齐图片。
我在互联网上搜索了很多,但我没有找到实现此目的的方法......
注意:我的宏已经包含使所有图像具有相同高度(同时保持相同纵横比)的代码,所以我认为尺寸应该不是问题...
这是我想要实现的一个小例子:
我尝试使用此链接中的水平对齐代码:https://www.excelcampus.com/vba/align-space-distribute-shapes/
但我得到了以下结果: 边距很奇怪,形状无限对齐,而不是进入下一行...
我的代码:
Dim lCnt As Long
Dim dTop As Double
Dim dLeft As Double
Dim dWidth As Double
Const dSPACE As Double = 8 'Set space between shapes in points
lCnt = 1
Dim image As Shape
If ActiveDocument.Shapes.Count > 0 Then
For Each image In ActiveDocument.Shapes
With image
.WrapFormat.Type = wdWrapSquare
.LockAspectRatio = msoTrue
.Height = InchesToPoints(3)
If lCnt > 1 Then
.Top = dTop
.Left = dLeft + dWidth + dSPACE
End If
dTop = .Top
dLeft = .Left
dWidth = .Width
End With
lCnt = lCnt + 1
Next
End If
End Sub
提前致谢!
【问题讨论】:
你自己尝试了什么? 我建议您使用表格并将表格属性设置为不自动调整大小。为了视觉布局的兴趣,您可以使行具有不同数量的单元格,就像您的示例一样。关闭表格边框。我建议使用表格,否则,您的代码将必须过于复杂,以允许不同大小的图片和剩余的页面宽度。 @FaneDuru 我已经更新了我的问题,所以现在它包含了我的代码和更多信息...... 使用表格,其中 1 列的宽度与您指示的页面宽度相同,并且每行的高度相同。您的代码需要担心的只是将图片并排放置在一个单元格中,其余的由表格处理。你。 您可以使用您的实际代码创建两个新变量totalWidth
和totalHeight
。您必须将totalWidth
与可打印页面进行比较,并使totalWidth
为零,Top
等于totalHeight
加上dSpace
。当然,您之前必须计算理论totalWidth
,如果超过页面宽度,则使用新的图片行。
【参考方案1】:
将您的图片插入到具有固定单元格尺寸的表格中不会达到您想要的效果,因为这些图片显然没有相同的纵横比。您需要做的是将它们转换为内联形状,以便 Word 可以处理换行。例如:
Sub Demo()
Application.ScreenUpdating = False
Dim iShp As InlineShape
With ActiveDocument
Do While .Shapes.Count > 0
.Shapes(1).ConvertToInlineShape
Loop
For Each iShp In .InlineShapes
With iShp
.LockAspectRatio = True
.Height = InchesToPoints(3)
If .Range.Characters.Last.Next <> " " Then .Range.InsertAfter " "
End With
Next
End With
Application.ScreenUpdating = True
End Sub
您可以通过更改段落行间距来调整图像之间的垂直间距。还要注意,水平对齐可以通过在左、居中和两端对齐的段落格式之间切换来进行。
【讨论】:
非常感谢!我对你的回答感到惊讶,我从中学到了很多新东西!我还有一个问题......有什么方法可以指定图像之间的水平空间,而不是在每张图像后插入一个空格? «有什么方法可以指定图像之间的水平间距,而不是在每张图像后插入一个空格?»不适用于内嵌形状。当然,您可以使用不同大小的空格(例如,通过更改字体名称和/或大小)和/或使用多个空格。 嗯,很高兴知道这一点……非常感谢您的帮助! 很抱歉打扰您,但我还有一个问题......我目前正在为我的宏添加更多附加选项,我遇到了这个问题:每次运行宏时,它在每个图像之后添加额外的空间...是否有任何选项可以删除图像之后的空格或类似的东西,所以我可以在每次运行宏时将多个空格重置为 0?我知道如何要求用户输入,所以我会做 for 循环来添加一定数量的空格,我唯一的问题是删除之前宏调用生成的空格... 修改后的代码中的 IF 测试(即 If .Range.Characters.Last.Next " " Then)应该可以工作,无论您在图像之间插入多少空格。【参考方案2】:由于您是 VBA 新手,如果您要采用 Table 方法,我想分享一些代码。下面的代码创建了一个宽度固定的单行表,除非您更改单个单元格,否则不会按宽度扩展。仅出于演示目的,我将相同的图片插入到每个单元格中以演示图像会根据单元格宽度自动调整大小。
Sub TableOfPictures()
Dim doc As Word.Document, rng As Word.Range
Dim Tbl As Word.Table, C As Long
Set doc = ActiveDocument
Set rng = Selection.Range
Set Tbl = rng.Tables.Add(rng, 1, 2, Word.WdDefaultTableBehavior.wdWord8TableBehavior)
Tbl.rows(1).Cells(1).Width = InchesToPoints(2)
Tbl.rows(1).Cells(2).Width = InchesToPoints(4.5)
For C = 1 To 2
Tbl.rows(1).Cells(C).Range.InlineShapes.AddPicture ("Y:\Pictures\Mk45 Gun Proj_Blast.jpg")
Next
End Sub
【讨论】:
酷,这绝对是一种有趣的方法,可以根据我的需要进行调整。我不知道表格可以用于解决这样的问题......非常感谢您的帮助和想法!以上是关于使用 VBA 宏在 Word 中水平对齐(分布)图像的主要内容,如果未能解决你的问题,请参考以下文章
如何使用大小类和自动布局在 Xib 中水平对齐两个 UI 按钮