可以使用VBA来计算多个表格中的嵌入式图片数量吗?

时间:2019-06-25 14:03:18

标签: vba ms-word

试图确定一些代码,这些代码将根据每个表格中图片的数量自动调整整个文档中表格中的嵌入式图片的大小。一个文档可以包含1到> 10个单独的报告,我的最终目标是使每个单独的报告都适合一页。因此,如果第一份报告中只有一张图片,我会将其调整为75%,如果第二份报告中有两张图片,我会将这两张都调整为〜60%(同时仍将第一份报告的图片保持在75% ), 等等。每个报告都有2个单独的表,并且图片始终位于报告第二个表的第2行中。

现在,我的代码(如图所示)将报告中的所有图片更改为一种特定的尺寸。使用.InlineShapes.Count计数整个文档中的图片总数没有问题,甚至使用ActiveDocument.Tables.Count计数表的总数也没有问题,但是我无法弄清楚如何仅引用其中的图片数量每个表。我曾尝试遍历文档中的所有表格,但是每当我尝试计算表格中图片的数量时,它总是会返回文档中的总数。

Sub resize()
Dim i As Long
With ActiveDocument
    For i = 1 To .InlineShapes.Count
        With .InlineShapes(i)
            .ScaleHeight = 45
            .ScaleWidth = 45
        End With
    Next i
End With
End Sub

2 个答案:

答案 0 :(得分:0)

不得不解决一些编译错误,但是下面的代码是最近几个小时一直在工作的代码。它从文档中的第一个表开始,计算该表中的形状数量,然后将形状调整为不同的比例,具体取决于表中形状的数量。它继续循环遍历文档中的所有表,直到完成为止。感谢Tomalak向正确的方向推进。

Sub Dependent_Resize()

Dim t As Table
Dim i As Integer
Dim j As Integer
Dim k As Integer

For i = 1 To ActiveDocument.Tables.Count
    Set t = ActiveDocument.Tables(i)
    j = t.Range.InlineShapes.Count
    If j = 0 Then
    ElseIf j = 1 Then
        With t.Range.InlineShapes(j)
            .ScaleHeight = 75
            .ScaleWidth = 75
        End With
    ElseIf j = 2 Then
        For k = 1 To j
         With t.Range.InlineShapes(k)
            .ScaleHeight = 60
            .ScaleWidth = 60
        End With
        Next k
    ElseIf j > 2 Then
        For k = 1 To j
        With t.Range.InlineShapes(k)
            .ScaleHeight = 45
            .ScaleWidth = 45
        End With
        Next k
    End If
Next i

End Sub

答案 1 :(得分:0)

使用Option Explicit可以解决编译错误(Option Explicit应该在任何声明之前位于模块顶部),并且可以简化代码:

Option Explicit

Private Const LARGE_IMG As Long = 75
Private Const MEDIUM_IMG As Long = 60
Private Const SMALL_IMG As Long = 45

Sub dependentResize()
    Dim i As Long
    Dim scaleTo As Long
    Dim ilShape As InlineShape

    For i = 1 To ActiveDocument.Tables.Count
        With ActiveDocument.Tables(i).Range
            Select Case .InlineShapes.Count
                Case 1
                    scaleTo = LARGE_IMG
                Case 2
                    scaleTo = MEDIUM_IMG
                Case Else
                    scaleTo = SMALL_IMG
            End Select

            For Each ilShape In .InlineShapes
                With ilShape
                    .ScaleHeight = scaleTo
                    .ScaleWidth = scaleTo
                End With
            Next
        End With
    Next i
End Sub