使用Excel VBA从Word表格单元格中删除内容

4
我目前正在进行一个项目,并寻求一些帮助。为了让大家了解正在发生的事情,我将逐步介绍情况。
1)目前我有一个名为“AnimalNamesToRemove”的字符串数组(例如该数组包含以下单词),其中包含用作书签的单词,我要将其从下面引用的Word表中删除: AnimalNamesToRemove AnimalCat,AnimalDog,AnimalBird
2)除了数组之外,Word文档中存在一个表格,第一列中有动物的名称,以及有关动物的一些信息(唯一重要的信息是动物的名称)。

enter image description here

3) 对于这种情况,我有一个Excel表格,希望用它来引用数组中的单词和单词表名称,因为Word文档中已经存在保存在数组中的名称的书签。为了将它们结合起来,存在一个两列Excel电子表格,其中包含书签的名称和实际动物名称(第二列使用命名为“myRangeRef”的范围进行引用):

电子表格

enter image description here

4) 我想要做的是:对于上述数组中的每个值,如果在电子表格表格中找到该值(例如“AnimalDog”),则偏移至其旁边的相应单元格(即第一列中的“Dog”),并创建一个新的逗号分隔字符串与那些值相同,就像“AnimalNamesToRemove”一样(即Cat、Dog、Bird),然后将其转换为名为“AnimalsToDelete”的字符串数组。创建数组后,已根据第二列的引用从第一列中选择了所有值,并制成了数组,我想逐行在单词表中进行操作,对于新数组“AnimalsToDelete”中存在的每个值(即Cat、Dog和Bird),如果该值存在于单词表中(在第一列中找到),则希望代码删除找到名称的整行(请参见下面的结果)

示例结果

enter image description here

Dim wdTable As Object
Dim myRangeRef As Range
Dim AnimalNamesToRemove As Variant
Dim AnimalsToDelete As Variant
Dim wdDoc As Object

Set myRangeRef = ThisWorkbook.Sheets("Bookmark References").Range("B1:B6")

Set wdTable = wdDoc.Tables(1)
For i = LBound(AnimalNamesToRemove) To UBound(AnimalNamesToRemove)
    For Each cell In myRangeRef
        If InStr(1, cell.Value, AnimalNamesToRemove(i), vbTextCompare) Then
            aCell = cell.Offset(, -1).Value
            stTemp = stTemp & "," & aCell
        End If
    Next cell
Next i

stTemp = Mid(stTemp, 2)
If Not Len(Trim(stTemp)) = 0 Then
    AnimalsToDelete = Split(stTemp, ",")
    For i = LBound(AnimalsToDelete) To UBound(AnimalsToDelete)
        For j = wdTable.Rows.Count To 2 Step -1
            If wdTable.cell(j, 1).Range.Text = AnimalsToDelete(i) Then wdTable.Rows(j).Delete
        Next j
    Next i
End If

如果您有任何解决方案和/或建议,请在下面评论。 注意:第一个代码部分适用于创建字符串数组(即从“set wdTable =”到“next i”),我遇到的问题是从单词表中删除信息。 最好, 杰克·亨德森

你能否也附上一个输出应该是什么样子的图片?这看起来很有趣且可行。 - Vityata
1
肯定的,让我用一分钟时间更新@Vityata。 - Jack Henderson
1
当你的关键词是通用的或只有 "x" 时,你的示例很难理解。 - dwirony
@dwirony 请查看修订后的问题,希望这样能更清楚明白。 - Jack Henderson
1个回答

2

根据您提供的代码,我在我的Excel VBE中添加了对Microsoft Word 16.0 Object Library的引用(在“工具”-“引用”中选中复选框),这样我们就可以使用Word相关内容了。 接下来,我编写了以下过程:

Sub Test()
Dim BookMarksToDelete() As String
Dim ReturnsToDelete() As String
Dim wApp As Word.Application
Dim wDoc As Word.Document
Dim wdTable As Word.Table
Dim myRangeRef As Range
Dim cel As Range
Dim aCell As String

Set wApp = New Word.Application
Set wDoc = wApp.Documents.Open("C:\Temp\Col1.docx")
Set wdTable = wDoc.Tables(1)

ReDim BookMarksToDelete(0 To 1)
    BookMarksToDelete(0) = "BlahOne"
    BookMarksToDelete(1) = "BlahThree"

Set myRangeRef = Worksheets("Sheet1").Range("B1:B5")

For i = LBound(BookMarksToDelete) To UBound(BookMarksToDelete)
    For Each cel In myRangeRef
        If InStr(1, cel.Value, BookMarksToDelete(i), vbTextCompare) Then
            aCell = cel.Offset(0, -1).Value
            stTemp = stTemp & "," & aCell
        End If
    Next cel
Next i

stTemp = Mid(stTemp, 2)
If Not Len(Trim(stTemp)) = 0 Then
    ReturnsToDelete = Split(stTemp, ",")
    For i = LBound(ReturnsToDelete) To UBound(ReturnsToDelete)
        For j = wdTable.Rows.Count To 2 Step -1
             If Left(wdTable.cell(j, 1).Range.Text, Len(wdTable.cell(j, 1).Range.Text) - 2) = ReturnsToDelete(i) Then
                wdTable.Rows(j).Delete
            End If
        Next j
    Next i
End If

wDoc.Save
wDoc.Close
wApp.Quit

Set wdTable = Nothing
Set wDoc = Nothing
Set wApp = Nothing
Set myRangeRef = Nothing
End Sub

正如您所看到的,我基本上遵循了您完全相同的结构,并且它完美地工作。您的主要问题(字Word文档中的行未被删除或找到)是因为Word表格中单元格中的文本实际上在最后包含两个额外字符。一个是“假换行符”,另一个出现在您在Word GUI上单击此段落按钮时 - 它是“单元格结束”标记。
请参见例如此讨论 编辑 我以“BlahOne”和“NameOne”示例为基础,但是您当然可以将其编辑为动物...

非常感谢。最好的祝福, 杰克 - Jack Henderson
不用谢。如果这对您有帮助,请考虑接受它作为答案。 - Rik Sportel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接