【问题标题】:Replace text in multiple cells in a table on Microsoft Word using VBA使用 VBA 替换 Microsoft Word 表格中多个单元格中的文本
【发布时间】:2020-10-15 06:07:29
【问题描述】:

我在 Microsoft Word 中有一个大表,我想突出显示最后一列中的一组单元格,并将其中的文本从“当前”更改为“已更改”。我知道您可以只使用复制和粘贴或使用查找/替换,但我每天会多次这样做,因此只需突出显示并单击一个按钮就会非常有用。

我在 Excel 中有一些 VBA,可以在电子表格上正常工作,但在 Word 中似乎不工作。

Sub WordEdit()

    Dim x As Range
    For Each x In Selection
    If x.Value <> "" Then x.Value = "Changed"
    Next

End Sub

我不是 VBA 专家,因此我们将不胜感激。谢谢。

【问题讨论】:

  • 到目前为止你尝试过什么?您是否尝试过录制宏并对其进行编辑?您是否使用对象浏览器查找相关对象,或使用 F1 在文档中查找内容?
  • 尝试在 Word 上录制宏,但它只编辑了我选择的第一个单元格。查看了我用来帮助创建上述 VBA 的文档,但它似乎不适用于 Word。完成了无数的谷歌搜索并查看了堆栈溢出,但这一切似乎都是针对 Excel 的,而我尝试的任何方法似乎都不适用于 Word。
  • 宏记录器使用 Selection 对象记录所有内容。然后为了概括代码以便它可以在任何地方工作,您通常将所有内容切换到 Range 对象。要查找特定于 Word 的 VBA,请在搜索词中添加引号中的“Word”和 -Excel(带减号)。
  • @JohnKorchok 谢谢,我会看一下 Range 对象,看看我能不能得到任何结果。
  • 录制宏可为您提供所需的语法和研究的起点。您录制的宏会显示在 Word 中您设置了Text 属性,而不是Value。在对象浏览器中查找Selection,您会发现它包含一个Cells 集合。选择Cells 的帮助将带您进入 Word VBA 文档,您将在其中学习如何循环浏览集合。作为一名 IT 顾问,您应该习惯于逻辑思考问题并使用可用的研究工具。

标签: vba ms-word


【解决方案1】:

以下将选择中的“当前”一词更改为“已更改”。请注意,对于此宏,您必须将单词作为选择的一部分。它不需要在最后一列,也不需要在表格中;它确实需要在选择中。

Sub ChangeSelectionCurrentToChanged()
    ' Charles Kenyon 13 Oct 2020
    Dim rng As Range
    '
    Set rng = Selection.Range
    With rng.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "Current"
        .Replacement.Text = "Changed"
        .Execute Replace:=wdReplaceAll
    End With
    Set rng = Nothing
End Sub

如果“当前”一词位于文档中任何表格的最后一列,则以下宏会将“当前”一词更改为“已更改”。选择什么并不重要。

Sub ChangeCurrentToChanged()
    ' Charles Kenyon 13 Oct 2020
    Dim rng As Range
    Dim iColumns As Long
    Dim iRows As Long
    Dim iCount As Long
    Dim oTable As Table
    '
    For Each oTable In ActiveDocument.Tables
        Let iColumns = oTable.Columns.Count
        Let iRows = oTable.Rows.Count
        For iCount = 1 To iRows
            Set rng = oTable.Cell(iCount, iColumns).Range
            With rng.Find
                .ClearFormatting
                .Replacement.ClearFormatting
                .Text = "Current"
                .Replacement.Text = "Changed"
                .Execute Replace:=wdReplaceAll
            End With
        Next iCount
    Next oTable
    Set oTable = Nothing
    Set rng = nothing
End Sub

以下宏会将当前表(插入点所在的表)最后一列中的“Current”更改为“Changed”。

Sub ChangeCurrentToChangedSelectedTable()
    ' Charles Kenyon 13 Oct 2020
    Dim rng As Range
    Dim iColumns As Long
    Dim iRows As Long
    Dim iCount As Long
    Dim oTable As Table
    '
    Set oTable = Selection.Tables(1)
        Let iColumns = oTable.Columns.Count
        Let iRows = oTable.Rows.Count
        For iCount = 1 To iRows
            Set rng = oTable.Cell(iCount, iColumns).Range
            With rng.Find
                .ClearFormatting
                .Replacement.ClearFormatting
                .Text = "Current"
                .Replacement.Text = "Changed"
                .Execute Replace:=wdReplaceAll
            End With
        Next iCount
    Set oTable = Nothing
    Set rng = Nothing
End Sub

其中一种能满足您的需求吗?

【讨论】:

  • 第一个效果很好。非常感谢您提供的其他建议,这些建议将帮助我提高我未来的 VBA 技能。
  • Word MVP 站点是一个出色的资源,虽然有些过时了。 wordmvp.com/FAQs/MacrosVBA.htm
  • 请注意,我从每个宏中删除了将 Find.Text 和 Replacement.Text 重置为“”的两行代码。根据 Word MVP Jay Freedman 的建议,因为我们使用的是 Range 而不是选择对象,所以不需要这些。
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多