使用 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 列的宽度与您指示的页面宽度相同,并且每行的高度相同。您的代码需要担心的只是将图片并排放置在一个单元格中,其余的由表格处理。你。 您可以使用您的实际代码创建两个新变量totalWidthtotalHeight。您必须将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 中水平对齐(分布)图像的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 3中水平对齐缩略图到中心

在 React 中水平方向对齐图像和文本

在python中水平移动小提琴图

如何使用大小类和自动布局在 Xib 中水平对齐两个 UI 按钮

如何在 PagedGridView 中水平对齐中心的加载图标?

如何在反应中水平对齐2行?