【问题标题】:Word VBA 2010 - Formatting the last paragraph in a table cellWord VBA 2010 - 格式化表格单元格中的最后一段
【发布时间】:2014-03-27 18:26:30
【问题描述】:

我有一个从 MadCap Flare 导出到 Word 2010 的项目,我使用 VBA 脚本来更新文档的格式。我正在尝试检查文档中每个段落的样式,然后如果它与特定样式匹配,则应用多列表级别格式。

它几乎没有问题。当段落作为表格单元格中的最后一段时,就会出现问题。在这种情况下,范围包括单元格标记的结尾(因此范围包括单元格的每个段落),因此更改适用于表格单元格中的每个段落,而不仅仅是最后一个。

我使用的代码如下:

For Each iPara In ActiveDocument.Paragraphs
    With iPara.Range
        If iPara.Style.NameLocal = "div_NoteText" Then
            .ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
            ListGalleries(wdOutlineNumberGallery).ListTemplates(1), _
            ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList, _
            DefaultListBehavior:=wdWord10ListBehavior, ApplyLevel:=1
        End If
    End With
Next

我需要进行哪些更改才能使其适用于表格单元格中的最后一段?

【问题讨论】:

  • 欢迎来到 SO!你的第一个好问题!所以,如果我理解正确的话,如果文档中间有一个表格,有多个单元格,并且第一个单元格有多个段落,你只想修改第一个单元格中的最后一段?但是当前该单元格中的所有段落都受到影响?
  • 感谢您的欢迎和反馈。也许一些图片可以最好地描述这个问题:imgur.com/a/TVSBX 1. 在任何宏运行之前。 2. 宏已正确修改表格单元格中的第二段。 3. 宏正在选择表格单元格中的第三个段落(因为它包括单元格结尾标记,所以它会突出显示所有段落)。 4. 格式已应用,但适用于整个单元格。不是想要的效果。
  • 由于网络限制,我无法查看链接,但我创建了一个 word doc,其中包含 2 列宽 3 行的表格,在单元格 (2,2) 中放置了两个段落,并且您的代码分别处理了这两个段落。如果您打开符号ctrl + shift + * 您在单元格中看到多个段落符号还是只有一个?
  • 在单元格 (2,2) 我有三个段落。打开符号,我看到第一段和第二段之后的段落标记,但不是第三段。第三段只显示单元格标记的结尾,它看起来像一个带有线条的圆圈。
  • 这就是我所期望的。我在 for 循环中添加了MsgBox iPara.Range,它分别列出了每个段落,这让我认为这可能与您的div_NoteText 条件有关。那是内置的 NameLocal 还是别名?

标签: vba ms-word


【解决方案1】:

“单元格结尾”标记是 Chr(13) + Chr(7),因此您可以使用类似于以下的代码检测位于单元格末尾的段落:

Sub Tester()
Dim EOC As String
Dim p As Paragraph
Dim rng As Range

    EOC = Chr(13) & Chr(7)

    For Each p In ActiveDocument.Paragraphs

        If Len(p.Range.Text) > Len(EOC) And p.Range.Text Like "*" & EOC Then
               Set rng = p.Range

               'commenting out next line will select the whole cell
               rng.MoveEnd wdCharacter, -1  

               rng.Select
               MsgBox "Found paragraph at end of cell..."
        End If

    Next p

End Sub

【讨论】:

  • 感谢您提供关于平机会的信息。它肯定会帮助我找到解决方案,明天我将有更多时间进行测试。不幸的是,我对rng.MoveEnd wdCharacter, -1 没有运气,因为它似乎没有取消选择 word 中的 EOC 字符(甚至修改范围,当我只想要最后一段时选择整个单元格)。类似EOC材料:vbaexpress.com/kb/getarticle.php?kb_id=631
  • 在我的测试(使用我发布的代码)中,它可以很好地:在表格末端选择段落时,只选择了单元格 - 没有其他选择。 跨度>
  • 按广告宣传。感谢您的回答和高效的表达。在测试 MoveEnd 方法时,我一定是执行了简单的编码错误。
  • 这太棒了,令人惊讶,解决了我的问题!请注意,chr(7) 不会出现在 Range.Characters 数组中,它只会出现在 Range.Text 字符串中。 Range.End-Range.Start 也不反映这个额外的 chr(7)。
【解决方案2】:

此程序将检查所有段落,首先扫描不在表格中的所有段落,然后检查所有表格,仅将更改应用于每个单元格中的最后一个段落。

检查段落

Sub CheckParagraphs()

For Each iPara In ActiveDocument.Paragraphs
    With iPara.Range
        If Selection.Information(wdWithInTable) = False Then
            If iPara.Style.NameLocal = "div_NoteText" Then
                .ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
                ListGalleries(wdOutlineNumberGallery).ListTemplates(1), _
                ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList, _
                DefaultListBehavior:=wdWord10ListBehavior, ApplyLevel:=1
            End If
        End If
    End With
Next

CheckTables

结束子

检查表

Sub CheckTables()

Dim oPara As Range
Dim count As Integer
For Each t In ActiveDocument.Tables
    For Each r In t.Rows
        For Each c In r.Cells
            With c.Range
                'Only act on the last paragraph
                With .Paragraphs(.Paragraphs.count).Range
                    If .Style.NameLocal = "div_NoteText" Then
                        .ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
                        ListGalleries(wdOutlineNumberGallery).ListTemplates(1), _
                        ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList, _
                        DefaultListBehavior:=wdWord10ListBehavior
                        .SetListLevel Level:=1
                    End If
                End With
            End With
        Next
    Next
Next
End Sub

【讨论】:

  • 我之前也想过像你在这里做的那样把箱子分开,但我还是不知道如何处理桌子箱子。感谢您提供这个精彩的示例,我将在早上使用并进行测试。我唯一担心的是.Paragraphs(.Paragraphs.count).Range 仍将包含 EOC 字符,我还没有弄清楚如何从范围中排除。 rng.MoveEnd wdCharacter, -1myRange.Collapse Direction:=wdCollapseEnd 我没有运气,似乎都没有真正修改范围(我不确定为什么)。明天我会在更多测试后更新。
  • 再次感谢您与我一起解决问题。如您所知,另一个答案非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多