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

我目前正在进行一个项目,正在寻求一些帮助。 为了让大家知道发生了什么,我将一步一步地运行这个场景。

1)目前我有一个名为“AnimalNamesToRemove”的string数组(这个例子中的数组包含下面的单词),它包含在一个word文档中用作书签的单词,我希望从下面引用的单词表中删除:

AnimalNamesToRemove

AnimalCat,AnimalDog,AnimalBird

2)除数组之外,还有一个word文档中的表格,其中第一列有动物的名字,还有一些关于动物的信息(唯一重要的信息是动物的名字):

单词表

在这里输入图像说明

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

电子表格

在这里输入图像说明

4)我要做的是,对于上面列出的数组中的每个值,如果在电子表格中find该值(例如“AnimalDog”)(即,第二列“书签参考”),则偏移到相应的单元格在它的第一列(即“狗”)旁边,创build一个新的以逗号分隔的string,与“AnimalNamesToRemove”(即Cat,Dog,Bird)相同,然后将其转换为名为“AnimalsToDelete”的string数组。 一旦数组被创build,并且所有的值已经在第一列中被选中并且基于第二列中的引用被创build为一个数组,我想要在字表中逐行进行并且对于在新数组中存在的每个值“AnimalsToDelete”,如果这个值(即Cat,Dog和Bird)存在于单词表中(在第一列中find),我希望代码删除整个名字被find的行(见下面的结果)

示例结果

在这里输入图像说明

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 

如果您有任何解决scheme和/或build议,请在下面留言。

注意:代码的第一部分用于创buildstring数组(即从“设置wdTable =”到“下一个我”),它从字表中删除信息,我有问题。 最好,

杰克亨德森

好吧,根据你的代码,我在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 

正如你所看到的,我基本上坚持你完全相同的结构,它完美的作品。

你的主要问题(单词doc中的行不被删除或find)是因为单词表格中单元格中的文本实际上最后包含2个额外的字符。 一个是“假新行”,另一个是当你点击GUI这个段落button时出现的 – 这是“单元结束”标记。

看看这个讨论

编辑我基于自己的“BlahOne”和“NameOne”的例子,但是,你可以编辑它的动物,当然…