使用word中的VBA宏删除它后面没有表的字符串

Posted

技术标签:

【中文标题】使用word中的VBA宏删除它后面没有表的字符串【英文标题】:Removing a string it not followed by a table using a VBA macro in word 【发布时间】:2022-01-09 19:56:04 【问题描述】:

我面临一个具有挑战性的请求,我需要在 Word 中使用 VBA 宏来解决。

文档是一个模板,它会在生成时获取数据库中的一些数据。它包含多个表,但我不知道每个表中有多少数据。

看起来像这样:

Sample initial state

要求是能够检测出表后面没有的字符串并删除。 当一个字符串后跟表格时,换一种说法,这一切都很好。当一个字符串后面跟着另一个字符串时,应该删除它。

不同的字符串是已知的,我猜这会有所帮助。

宏运行后,我之前的示例应该如下所示:

Sample expected result

我知道这看起来有点苛刻,但我什至不知道从哪里开始:(

我查看了宏搜索文本,但找不到类似的内容 如果 stringA 后跟一个表,则不执行任何操作,如果没有则删除。

非常感谢社区的任何帮助!

谢谢 朱利安

【问题讨论】:

【参考方案1】:

这应该让你开始:

Sub FindAndDelete()
    Dim rng As Range
    Set rng = ActiveDocument.Content
    With rng
        With .Find
            .ClearFormatting
            .Text = "Text to find"
        End With
        Do While .Find.Execute
            If .Next(wdParagraph).Tables.Count = 0 Then
                .Next(wdParagraph).Delete
            End If
        Loop
    End With
End Sub

【讨论】:

【参考方案2】:

非常感谢!

我可以通过稍微修改它来使其工作,因为建议的代码正在删除表格后面的字符串:

    Dim rng As Range
    Set rng = ActiveDocument.Content
    With rng
        With .Find
            .ClearFormatting
            .Text = "This is my table C"
        End With
        Do While .Find.Execute
            If .Next(wdParagraph).Tables.Count = 0 Then
                .Delete
            End If
        Loop
    End With

我的最后一步是使宏仅针对文档的特定部分运行。我想我需要在范围内工作。我会尝试并在此处发布结果。 再次感谢您帮助纯新手!

【讨论】:

【参考方案3】:

所以我使用下面的代码让它工作。我稍微修改了“while”循环,使其删除整行而不只是单词

Sub HeaderDelete()
'
' HeaderDelete Macro
'
    Dim rng As Range
    Set rng = ActiveDocument.Content
    With rng
        With .Find
            .ClearFormatting
            .Text = "This is my table A"
            
        End With
        
        Do While .Find.Execute
            If .Next(wdParagraph).Tables.Count = 0 Then
            Selection.HomeKey wdLine
            Selection.EndKey wdLine, wdExtend
            Selection.Delete
            End If
             
        Loop
      
        With .Find
            .ClearFormatting
            .Text = "This is my table B"
            
        End With
        Do While .Find.Execute
            If .Next(wdParagraph).Tables.Count = 0 Then
            Selection.HomeKey wdLine
            SelectionS.EndKey wdLine, wdExtend
            Selection.Delete
            End If
             
        Loop
    
        With .Find
            .ClearFormatting
            .Text = "This is my table C"
        End With
        Do While .Find.Execute
            If .Next(wdParagraph).Tables.Count = 0 Then
            Selection.HomeKey wdLine
            SelectionS.EndKey wdLine, wdExtend
            Selection.Delete
            End If
             
        Loop
    
    End With

End Sub

挑战是我有 50 多个“这是我的桌子 X”,他们可能会加班......

我试图找到一个不会在“.Find”上使用的解决方案,但更多的是关于“如果有一行没有后跟表格然后删除”,但我到目前为止还没有成功。

在旁注中,我想删除所有表格的表格边框,我发现下面的效果很好!

  Dim doc As Document
  Dim tbl As Table

  Set doc = ActiveDocument
  For Each tbl In doc.Tables
                 With tbl.Borders
                    .InsideLineStyle = wdLineStyleNone
                     .OutsideLineStyle = wdLineStyleNone
                End With

  Next

再次感谢您帮助 VBA 新手!

【讨论】:

以上是关于使用word中的VBA宏删除它后面没有表的字符串的主要内容,如果未能解决你的问题,请参考以下文章

跨多个工作表的 VBA 宏

用于启用宏的 VBA 或 VBA ms 字

Delphi 运行Word VBA 宏 删除软回车

使用 VBA 宏在 Word 中水平对齐(分布)图像

如何用VBA宏程序将excel中的内容批量复制到word文档中去

用vba编程将excel中的数据批量填写到word里面