我想遍历Word文档段落中的“对象”。假设该段仅包含字符和图像。
我找到了一种遍历字符的方法:
For Each lCharacter In pParagraph.Range.Characters
...
Next
我还找到了一种遍历图像的方法:
For Each lInlineShape In pParagraph.Range.InlineShapes
...
Next
不幸的是,这些循环无法让我知道图像在文本中的位置。
我想要的是依次遍历每个“对象”(字符,图像或其他东西),找到它的种类并相应地做一些事情。
有办法吗?
(实际上,我找到了一个线索:似乎第一个循环在有图像时给了我一个字符“ /” ...但是我无法检查“ /”是否表示有一个字符图片,或者文本中实际包含字符“ /”)。
答案 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
另一种虽然不是非常可靠的方法,但将是在问题所示的循环中获取对象的Start
或End
属性并进行比较,以确定内容的顺序出现。
此方法的问题在于,如果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