2017-06-26 120 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

不客氣。如果它適合你,請考慮接受這個答案。 –

相關問題