在Word段落中遍历文本和图像

时间:2018-12-10 15:56:06

标签: vba ms-word

我想遍历Word文档段落中的“对象”。假设该段仅包含字符和图像。

我找到了一种遍历字符的方法:

For Each lCharacter In pParagraph.Range.Characters
   ...
Next

我还找到了一种遍历图像的方法:

For Each lInlineShape In pParagraph.Range.InlineShapes
   ...
Next

不幸的是,这些循环无法让我知道图像在文本中的位置。

我想要的是依次遍历每个“对象”(字符,图像或其他东西),找到它的种类并相应地做一些事情。

有办法吗?

(实际上,我找到了一个线索:似乎第一个循环在有图像时给了我一个字符“ /” ...但是我无法检查“ /”是否表示有一个字符图片,或者文本中实际包含字符“ /”)。

2 个答案:

答案 0 :(得分:1)

您必须按照某种类别的对象(文档或文档中的段落)将这些内容分解为单独的查询。

您可以在文档级别上查找InlineShapes ...

Dim iShp As Word.InlineShape
For Each iShp In ActiveDocument.InlineShapes
    If iShp.Type = wdInlineShapePicture Then
        'do something
    End If
Next

或者,如果您想在主要组中查看段落,则类似的事情将起作用,并且您可以在...范围内包括对字符的查看...

Dim iShp As Word.InlineShape, oPara As Word.Paragraph
Dim chr As Variant
For Each oPara In ActiveDocument.Paragraphs
    For Each iShp In oPara.Range.InlineShapes
        If iShp.Type = wdInlineShapePicture Then
            'do something
        End If
    Next
    For Each chr In oPara.Range.Characters
        Debug.Print chr
    Next
Next

答案 1 :(得分:0)

Word的对象模型并不是真正考虑到这一点而设计的。可以完成,但是会很慢。使用基础的Word Open XML可以做得更好,并且可能更快。但是...

一种可能性是循环字符并测试Range.InlineShapes.Count。如果字符是InlineShape,则计数将大于0(应为1):

Sub IsCharacterImage()
    Dim c As Word.Range

    For Each c In Selection.Characters
        If c.InlineShapes.Count > 0 Then
            Debug.Print "Is an image"
        Else
            Debug.Print "Is not an image"
        End If
    Next
End Sub

另一种虽然不是非常可靠的方法,但将是在问题所示的循环中获取对象的StartEnd属性并进行比较,以确定内容的顺序出现。

此方法的问题在于,如果Range在文本中具有隐藏字符,域代码或其他不可见的“控制字符”,则这些值可能不准确。因此,总的来说,我倾向于第一种方法...

Sub StartCharImage()
    Dim pParagraph As Word.Paragraph, lcharacter As Word.Range
    Dim linlineshape As Word.InlineShape
    Dim sCharStart As String, sImgStart As String
    Dim aCharStart As Variant, aImgStart As Variant

    Set pParagraph = ActiveDocument.paragraphs(1)
    For Each lcharacter In pParagraph.Range.Characters
       sCharStart = sCharStart & lcharacter.Start & ","
    Next
    sCharStart = Left(sCharStart, Len(sCharStart) - 1)
       Debug.Print sCharStart
    aCharStart = Split(sCharStart, ",")

    For Each linlineshape In pParagraph.Range.InlineShapes
        sImgStart = sImgStart & linlineshape.Range.Start & ","
    Next
    sImgStart = Left(sImgStart, Len(sImgStart) - 1)
    Debug.Print sImgStart
    aImgStart = Split(sImgStart, ",")
End Sub