我目前正在开展一个项目,正在寻求一些帮助。为了给你们一个正在发生的事情的布局,我将逐步完成这个场景。
1)目前我有一个名为“AnimalNamesToRemove”的字符串数组(对于此示例包含以下单词的数组),其中包含用作Word文档中书签的单词,我希望从单词表中删除参考如下:
AnimalNamesToRemove
AnimalCat,AnimalDog,AnimalBird
2)除了数组之外,还存在一个word文档中的表,其中第一列中包含动物的名称,以及有关动物的一些信息(唯一重要的信息是动物):
Word表格
3)对于这种情况,我有一个excel表,我希望用它来引用数组中的单词和单词表名,因为在使用的word文档中已有书签,其中包含存在的名称数组。为了将这些组合在一起,存在两列excel电子表格,其中包含书签的名称和实际的动物名称(使用名为“myRangeRef”的范围引用第二列):
电子表格
4)我要做的是对于上述数组中的每个值,如果在电子表格表中找到该值(例如“AnimalDog”)(即第二列“书签参考”),则偏移到在第一列(即“Dog”)旁边的相应单元格中创建一个新的逗号分隔字符串,其中包含这些值,与“AnimalNamesToRemove”(即Cat,Dog,Bird)相同,然后将其转换为名为“ AnimalsToDelete”。一旦创建了数组,并且在第一列中选择了所有值并根据第二列中的引用将其作为一个数组,我想在word表中逐行进行,并为新数组中存在的每个值“AnimalsToDelete”,如果单词表中存在该值(即Cat,Dog和Bird)(在第一列中找到),我希望代码删除找到该名称的整行(参见下面显示的结果)< / p>
示例结果
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
如果您有任何解决方案和/或建议,请在下面发表评论。
注意:第一部分代码适用于创建字符串数组(即从&#34;设置wdTable =&#34;到&#34;下一个i&#34;),从我遇到问题的单词表中删除信息。 最好,
杰克亨德森答案 0 :(得分: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
正如你所看到的,我基本上坚持你完全相同的结构,它完美无缺。
您的主要问题(单词doc中未被删除或找不到的行)是因为单词表格中单元格中的文本实际上最后包含2个额外字符。一个是假的新线&#34;当你在单词GUI上点击这个段落按钮时,另一个出现 - 它是&#34;单元格的结尾&#34;标记。
参见例如this discussion
编辑我基于&#34; BlahOne&#34;和#34; NameOne&#34;例如,但是,你可以为动物编辑它,当然......