使用 VBA 宏在 Word 中水平对齐分布图像

如何解决使用 VBA 宏在 Word 中水平对齐分布图像

这是我第一次用 VBA 写宏。我的目标是编写一个 VBA 宏,它会自动水平对齐(分布)Word 文档中的所有图像(彼此相邻),并在每张图片的每一面。如果没有足够的空间来容纳另一张图片,我需要它转到下一行(就在之前的图片下方)并继续对图片进行水平对齐。

我在互联网上搜索了很多,但我还没有找到实现这一目标的方法...

注意:我的宏已经包含使所有图像具有相同高度的代码(同时保持相同的纵横比),所以我认为尺寸应该不是问题...

这是我想要实现的一个小例子:

enter image description here

我尝试使用此链接中的水平对齐代码https://www.excelcampus.com/vba/align-space-distribute-shapes/

但我得到了以下结果:

enter image description here

边距很奇怪,形状无限对齐,而不是进入下一行......

我的代码

    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

提前致谢!

解决方法

由于您是 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
,

将您的图像插入具有固定单元格尺寸的表格不会达到您所说的效果,因为这些图像显然没有相同的纵横比。您需要做的是将它们转换为内联形状,以便 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

您可以通过更改段落行间距来调整图像之间的垂直间距。另请注意,可以通过在左、居中和两端对齐的段落格式之间切换来调整水平对齐方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?