2017-06-26 13 views
4

現在、プロジェクトを進めており、援助を探しています。皆さんに起こっていることのレイアウトを与えるために、私はシナリオを段階的に実行します。ExcelのVBAを使用してWordテーブルのセルから内容を削除する

1) "AnimalNamesToRemove"(この例では次の単語を含む配列)という文字列配列を持っています。これは単語を削除するために探している単語文書のブックマークとして使用されている単語を含んでいます以下の表は参照:アレイに加え

AnimalNamesToRemove

AnimalCat、AnimalDog、AnimalBird

2)、Word文書内のテーブルは、それが1桁目に動物の名前を持つ存在しますいくつかの情報と動物(重要である唯一の情報は、動物の名前です)試合:このシナリオでは

Wordの表

enter image description here

3)、私は私がExcelの表を持っています配列内の単語と単語テーブル名を参照するのに使います。すでに使用されている単語文書にブックマークがあり、配列に存在する名前を保持しています。

スプレッドシート

enter image description here

:一緒にこれらを持って来るために、2枚の列Excelスプレッドシートは、そのブックマークの名前と実際の動物の名前を(列2が「myRangeRef」という名前の範囲を使用して参照される)が存在します

4)上記の配列のすべての値について、スプレッドシートテーブル(つまり、列2の「ブックマーク参照」)にその値(「AnimalDog」など)が含まれていれば、最初の列(つまり "Dog")の横にあるそれぞれのセルを選択し、それらの値を持つ新しいカンマ区切り文字列を作成します"AnimalNamesToRemove"(つまり、 Cat、Dog、Bird)を作成し、それを "AnimalsToDelete"という文字列配列に変換します。配列が作成され、すべての値が最初の列で選択され、2列目の参照に基づいて配列に作成されると、単語表の行ごとに、新しい配列に存在するすべての値"AnimalsToDelete"、その値(Cat、Dog、Bird)がワードテーブルに存在する場合(列1にあります)、その名前が見つかった行全体を削除するコードを入力します(下の結果を参照)

例結果

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を設定=」「次のI」に)、私は問題を抱えている単語テーブルからの情報のその除去と。( - 参考文献は、ボックスをチェックするツール)私たちは、Wordのものを用意して、あなたのコードに基づいて ベスト、

+0

もすることができます出力がどのように表示されるべきかの写真を含めますか?それは面白くて実用的だと思われる。 – Vityata

+1

はい、間違いなく、@Vityataを更新するには1分を与えてください –

+1

すべてのキーワードが一般的であるか「x」が – dwirony

答えて

2

よし

ジャック・ヘンダーソンは、私は私のエクセル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 

あなたは、私は基本的にあなたの正確な同じ構造にこだわった、それが完璧に動作し、見ることができるように。

wordのテーブルにあるCellのテキストの末尾に実際に2つの余分な文字が含まれているため、主な問題(wordという単語の行は削除されないか見つかりません)です。 1つは「偽の改行」で、もう1つはGUIのこの段落ボタンを押したときに表示されます。これは「セルの最後」マーカーです。

を参照してください例えばthis discussion

EDIT私は「BlahOne」と「NameOne」の例に自分自身をベースにしていますが、ええ、あなたはもちろん、動物のためにそれを編集することができます...

+0

ありがとうございます。 ベスト、 ジャック –

+0

よろしくお願いいたします。それがあなたのために働く場合、これを答えとして受け入れることを検討してください。 –

関連する問題