使用 Excel VBA 从单词 Table 的单元格中删除内容
Removing the Contents from the Cell of a Word Table using Excel VBA
我目前正在做一个项目,正在寻求一些帮助。为了让大家了解正在发生的事情,我将 运行 逐步介绍场景。
1) 目前我有一个名为“AnimalNamesToRemove”的字符串数组(对于此示例,该数组包含以下单词),其中包含在我要删除的 word 文档中用作书签的单词下面引用的单词 table:
AnimalNamesToRemove
动物猫、动物狗、动物鸟
2)word文档中除了数组之外还有一个table第一列是动物的名字,还有一些关于动物的信息(唯一的信息是重要性是动物的名字):
字Table
3) 对于这种情况,我有一个 excel table,我想用它来引用数组中的单词和单词 table 名称,因为有正在使用的 word 文档中已有书签,其中包含数组中存在的名称。为了将它们放在一起,存在一个包含书签名称和实际动物名称的两列 excel 电子表格(第二列使用名为“myRangeRef”的范围引用):
电子表格
4) 我想要做的是,对于上述数组中的每个值,如果在电子表格 table 中找到该值(例如“AnimalDog”)(即第二列“书签” Reference”)然后偏移到第一列中它旁边的相应单元格(即“Dog”)并使用这些值创建一个新的逗号分隔字符串,与“AnimalNamesToRemove”(即 Cat,Dog,Bird)相同,然后将其旋转到名为“AnimalsToDelete”的字符串数组中。一旦创建了数组,并且在第一列中选择了所有值并根据第二列中的引用将其制成数组,我想逐行进入单词 table 并且对于每个存在的值在新数组“AnimalsToDelete”中,如果该值(即 Cat、Dog 和 Bird)存在于单词 table 中(在第一列中找到),我希望代码删除找到该名称的整行在(见下面显示的结果)
示例结果
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
如果您有任何解决方案and/or建议,请在下方评论。
注意: 代码的第一部分用于创建字符串数组(即从 "set wdTable =" 到 "next i"),它从中删除信息我遇到问题的 table 这个词。
最好的,
杰克·亨德森
好的,根据您的代码,我在我的 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 doc 中的行未被删除或找到)是因为 word 中 table 中单元格中的文本实际上在最后包含 2 个额外字符。一个是 "fake new line",另一个是当您在 GUI 一词上点击此段落按钮时出现的 - 它是一个 "end of cell" 标记。
参见示例this discussion
EDIT 我基于 "BlahOne" 和 "NameOne" 示例,但是是的,您当然可以为动物编辑它...
我目前正在做一个项目,正在寻求一些帮助。为了让大家了解正在发生的事情,我将 运行 逐步介绍场景。
1) 目前我有一个名为“AnimalNamesToRemove”的字符串数组(对于此示例,该数组包含以下单词),其中包含在我要删除的 word 文档中用作书签的单词下面引用的单词 table:
AnimalNamesToRemove
动物猫、动物狗、动物鸟
2)word文档中除了数组之外还有一个table第一列是动物的名字,还有一些关于动物的信息(唯一的信息是重要性是动物的名字):
字Table
3) 对于这种情况,我有一个 excel table,我想用它来引用数组中的单词和单词 table 名称,因为有正在使用的 word 文档中已有书签,其中包含数组中存在的名称。为了将它们放在一起,存在一个包含书签名称和实际动物名称的两列 excel 电子表格(第二列使用名为“myRangeRef”的范围引用):
电子表格
4) 我想要做的是,对于上述数组中的每个值,如果在电子表格 table 中找到该值(例如“AnimalDog”)(即第二列“书签” Reference”)然后偏移到第一列中它旁边的相应单元格(即“Dog”)并使用这些值创建一个新的逗号分隔字符串,与“AnimalNamesToRemove”(即 Cat,Dog,Bird)相同,然后将其旋转到名为“AnimalsToDelete”的字符串数组中。一旦创建了数组,并且在第一列中选择了所有值并根据第二列中的引用将其制成数组,我想逐行进入单词 table 并且对于每个存在的值在新数组“AnimalsToDelete”中,如果该值(即 Cat、Dog 和 Bird)存在于单词 table 中(在第一列中找到),我希望代码删除找到该名称的整行在(见下面显示的结果)
示例结果
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
如果您有任何解决方案and/or建议,请在下方评论。
注意: 代码的第一部分用于创建字符串数组(即从 "set wdTable =" 到 "next i"),它从中删除信息我遇到问题的 table 这个词。 最好的,
杰克·亨德森
好的,根据您的代码,我在我的 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 doc 中的行未被删除或找到)是因为 word 中 table 中单元格中的文本实际上在最后包含 2 个额外字符。一个是 "fake new line",另一个是当您在 GUI 一词上点击此段落按钮时出现的 - 它是一个 "end of cell" 标记。
参见示例this discussion
EDIT 我基于 "BlahOne" 和 "NameOne" 示例,但是是的,您当然可以为动物编辑它...