【问题标题】:Problem when running for, next loop with if statement运行时出现问题,使用 if 语句进行下一个循环
【发布时间】:2020-09-08 08:46:52
【问题描述】:

我正在尝试在 Word VBA 中使用带有 if then 语句的 for next 循环。该代码的目的是,如果Word文档的段落不为空,它将选择文本并将其复制并粘贴到新的Word文档中。如果该段落为空,它将直接转到下一行。

我试过运行代码,每次只能选择整个Word文档中的第一段,我不确定如何让代码运行并继续下一段创建循环。

   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

【问题讨论】:

  • 你为什么这样循环?为什么不使用循环For Each pgraph In ActiveDocument.Paragraphs,然后使用If Len(Trim(pgraph.Range.Text))=0 Then
  • 您的代码,如果有效,会将每个非空段落放入一个单独的新文档中。你确定这是你想要发生的事情吗?
  • 你有两个问题。 1.如前所述,您不了解对象模型这个词。

标签: vba for-loop if-statement word


【解决方案1】:

你有两个问题。

  1. 您不了解 Word 对象模型。
  2. 您假设没有可见文本的段落具有空内容 (""),这是不正确的。

要解决 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) 似乎给出了相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2016-06-22
    • 2012-11-01
    • 2018-05-27
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多