我目前正在做一个项目,正在寻找一些帮助。为了让你们了解正在发生的事情,我将逐步介绍这个场景。
1)目前我有一个名为“AnimalNamesToRemove”的字符串数组(对于这个例子,数组包含以下单词),其中包含用作单词文档中书签的单词,我希望从下面引用的单词表中删除:
AnimalNamesToRemove
动物猫、动物狗、动物鸟
2)除了数组,word文档中还有一张表,第一列有动物的名字,还有一些关于动物的信息(唯一重要的信息是动物的名字):
词表
3) 对于这种情况,我有一个 excel 表,我希望用它来引用数组中的单词和单词表名称,因为在使用的单词文档中已经有书签保存数组中存在的名称。为了将这些组合在一起,存在一个两列 Excel 电子表格,其中包含书签名称和实际动物名称(使用名为“myRangeRef”的范围引用第二列):
电子表格
4)我想要做的是,对于上述数组中的每个值,如果在电子表格表(即第二列“书签引用”)中找到该值(例如“AnimalDog”),则偏移到相应的单元格在它旁边的第一列(即“Dog”)并使用这些值创建一个新的逗号分隔字符串,与“AnimalNamesToRemove”(即 Cat、Dog、Bird)相同,然后将其转换为名为“AnimalsToDelete”的字符串数组。创建数组后,并在第一列中选择了所有值并根据第二列中的引用将其制成数组,我想在单词表中逐行访问新数组中存在的每个值“AnimalsToDelete”,如果单词表中存在该值(即猫、狗和鸟)(在第一列中找到),我希望代码删除该名称所在的整行(见下图)
示例结果
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”),它从我遇到问题的单词表中删除信息。
最好的,
jack 亨德森
最佳答案
好的,根据您的代码,我在 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 中的行)是因为单词表中单元格中的文本实际上最后包含 2 个额外字符。一个是“假换行”,另一个是当您点击单词 GUI 上的这个段落按钮时出现的 - 这是一个“单元格结尾”标记。
参见例如 this discussion
编辑 我基于“BlahOne”和“NameOne”示例,但是是的,您可以为动物编辑它,当然...
关于vba - 使用 Excel VBA 从 Word 表格的单元格中删除内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44760133/