2017-06-26 119 views
4

我目前正在开发一个项目并正在寻找一些帮助。为了让大家了解正在发生的事情,我将一步一步地通过场景。使用Excel VBA从Word表格的单元格中删除内容

1)目前我有一个名为“AnimalNamesToRemove”的字符串数组(这个例子中的数组包含下面的单词),它包含在单词文档中用作书签的单词,我希望删除单词下面的表中引用:

AnimalNamesToRemove

AnimalCat,AnimalDog,AnimalBird

2)除了阵列,字文档中的表中存在一列中具有动物的名称,以及一些信息a布特的动物(即重要的唯一信息是动物的名字):

Word表格

enter image description here

3)对于这种情况,我有我的Excel表格希望用于引用数组中的单词和单词表名称,因为正在使用的单词文档中已有书签,用于保存数组中存在的名称。为了把这些结合在一起,两列excel表格存在具有书签和实际的动物名称的名称(列二是使用名为“myRangeRef”的范围内引用):

电子表格

enter image description here

4)我想要做的是,对于上面列出的数组中的每个值,如果在电子表格中找到该值(例如“AnimalDog”)(即第2列“书签参考”),则偏移到在第一列中它旁边的相应单元格(即“Dog”)并创建一个新的以逗号分隔的字符串,这些值相同作为“AnimalNamesToRemove”(即,猫,狗,鸟),然后将它变成一个名为“AnimalsToDelete”的字符串数组。一旦数组被创建,并且所有的值已经在第一列中被选择并且基于第二列中的引用被创建为一个数组,我想要在字表中逐行进行并且对于在新数组中存在的每个值“AnimalsToDelete”,如果该值(即Cat,Dog和Bird)存在于单词表中(在第一列中找到),我希望代码删除整个名称所在的行(见下面显示的结果)

示例结果

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 

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

注:的第一部分代码适用于创建字符串数组(即从“设置wdTable =”到“下一个我”),它从我有问题的字表中去除的信息用。 最佳,

杰克·亨德森

+0

你能包括输出应该是什么样子的图片?这似乎很有趣,也是可行的。 – Vityata

+1

是的,给我一分钟更新@Vityata –

+1

当你的所有关键字是通用的或只是“x” – dwirony

回答

2

好了,根据你的代码,我在Excel中添加VBE一个引用到Microsoft Word 16.0 Object Library(工具 - 参考文献中,选中),所以我们有字的东西可用。 接下来,我写了下面的程序:

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”和“名称一”的例子,但是,是的,你也可以编辑的动物,当然...

+0

非常感谢。 最好的, 杰克 –

+0

不客气。如果它适合你,请考虑接受这个答案。 –

相关问题