问题描述
我试图在Word VBA中的if语句中使用for下一循环。该代码的目的是,如果Word文档的段落不为空,它将选择文本并将其复制并粘贴到新的Word文档中。如果该段为空,则将转到下一行。
我尝试运行代码,每次都只能选择整个Word文档中的第一段,而且我不确定如何让代码运行并转到下一段来创建循环。 / p>
Sub selectparawithtext()
Dim opara As Paragraphs
Dim x As Integer
For x = 1 To 24
If Paragraphs <> "" Then
Selection.Expand wdParagraph
Selection.copy
Documents.Add wdNewBlankDocument
Selection.PasteAndFormat (wdFormatOriginalFormatting)
Else
Selection.MoveDown Unit:=wdLine,Count:=1
End If
Next
End Sub
解决方法
您有两个问题。
- 您不了解Word对象模型。
- 您已假定没有可见文本的段落的内容为空(“”),这是不正确的。
要解决1,您需要遍历要使用的故事范围中的段落。
Dim myPara As Paragraph
For Each myPara In ActiveDocument.StoryRanges(wdMainTextStory).Paragraphs
<your code>
Next
文档正文中的段落有快捷方式(例如.contents.paragraphs或仅.paragraphs,但最好理解Word文档由多个故事范围组成,并指定与之相关的故事范围您想工作)。
第二点是单词段落以段落标记字符作为段落文本的一部分终止。因此,段落永远不能为空值,因为它们的最小长度始终为1个字符。
段落的文本是段落的范围对象的一部分。因此,要访问第x段的文本,您将使用
\<document qualifier>.\<storyrange qualifier>.paragraphs.item(x).range.text.
例如
ActiveDocument.StoryRanges(wdmaintextstory).paragraphs.item(x).range.text
值得注意的是,“ Item”是段落对象的默认属性,因此,为什么Paragraphs(x)和Paragraphs.Item(x)会给出相同的结果。