【问题标题】:Removing the Contents from the Cell of a Word Table using Excel VBA使用 Excel VBA 从 Word 表格的单元格中删除内容
【发布时间】:2017-06-26 12:48:03
【问题描述】:

我目前正在做一个项目,正在寻求帮助。为了让你们了解正在发生的事情,我将逐步介绍该场景。

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

AnimalNamesToRemove

动物猫、动物狗、动物鸟

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

单词表

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

电子表格

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

示例结果

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”),它从我的单词表中删除信息'我有问题。 最好的,

杰克·亨德森

【问题讨论】:

  • 您能否附上一张输出应该是什么样子的图片?这似乎很有趣且可行。
  • 是的,给我一分钟更新@Vityata
  • 当您的所有关键字都是通用关键字或只是“x”时,您的示例很难遵循
  • @dwirony 请看修改后的问题,希望这能让事情更清楚。

标签: vba excel excel-2010 excel-2007


【解决方案1】:

好的,根据您的代码,我在 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 表格中 Cell 中的文本实际上最后包含 2 个额外字符。一个是“假新行”,另一个是当您在 GUI 一词上点击此段落按钮时出现的 - 这是一个“单元格结束”标记。

参见例如this discussion

编辑我以“BlahOne”和“NameOne”示例为基础,当然,您可以为动物编辑它...

【讨论】:

  • 非常感谢。最好的,杰克
  • 不客气。如果它适合你,请考虑接受这个作为答案。