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

时间:2017-06-26 12:48:04

标签: excel vba excel-vba excel-2010 excel-2007

我目前正在开展一个项目,正在寻求一些帮助。为了给你们一个正在发生的事情的布局,我将逐步完成这个场景。

1)目前我有一个名为“AnimalNamesToRemove”的字符串数组(对于此示例包含以下单词的数组),其中包含用作Word文档中书签的单词,我希望从单词表中删除参考如下:

AnimalNamesToRemove

AnimalCat,AnimalDog,AnimalBird

2)除了数组之外,还存在一个word文档中的表,其中第一列中包含动物的名称,以及有关动物的一些信息(唯一重要的信息是动物):

Word表格

enter image description here

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

电子表格

enter image description here

4)我要做的是对于上述数组中的每个值,如果在电子表格表中找到该值(例如“AnimalDog”)(即第二列“书签参考”),则偏移到在第一列(即“Dog”)旁边的相应单元格中创建一个新的逗号分隔字符串,其中包含这些值,与“AnimalNamesToRemove”(即Cat,Dog,Bird)相同,然后将其转换为名为“ AnimalsToDelete”。一旦创建了数组,并且在第一列中选​​择了所有值并根据第二列中的引用将其作为一个数组,我想在word表中逐行进行,并为新数组中存在的每个值“AnimalsToDelete”,如果单词表中存在该值(即Cat,Dog和Bird)(在第一列中找到),我希望代码删除找到该名称的整行(参见下面显示的结果)< / p>

示例结果

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

如果您有任何解决方案和/或建议,请在下面发表评论。

注意:第一部分代码适用于创建字符串数组(即从&#34;设置wdTable =&#34;到&#34;下一个i&#34;),从我遇到问题的单词表中删除信息。 最好,

杰克亨德森

1 个答案:

答案 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;例如,但是,你可以为动物编辑它,当然......