Discussion:
VBA Word Tabellen gezielt mit Bookmarks löschen
(zu alt für eine Antwort)
Moritz J.
2014-01-17 07:01:18 UTC
Permalink
Hallo Leute,

ich möchte in einem Word-Dokument ein Makro erzeugen, welches mir durch Auswahl bestimmter Kriterien ermöglicht gezielt Tabellen aus meinem Dokument zu entfernen.
Dafür habe ich eine Oberfläche mit mehreren Dropdown-Menüs erstellt.
Die jeweiligen Tabellen habe ich schon mit Textmarken versehen. Mein Problem ist jetzt, mehrere Textmarken auf einmal anzusprechen und dann zu löschen. Mein bisheriges Programm sieht so aus:

Private Sub ComboBox1_Change()
Dim wdDoc As Document 'Word-Dokument
Dim wdRange As Range
Dim tblTab1 As Table 'Tabelle
Dim strBookmark As String
Dim nCols As Integer 'Anzahl Spalten
Dim nRows As Integer 'Anzahl Zeilen
Dim rNew As Row
'Verweis auf Dokument setzen:
Set wdDoc = ActiveDocument
strBookmark = "A"
strBookmark = "B"
strBookmark = "C"
strBookmark = "D"
strBookmark = "F"
strBookmark = "G"
strBookmark = "H"
strBookmark = "I"
strBookmark = "J"
strBookmark = "K"
strBookmark = "L"
strBookmark = "M"
strBookmark = "N"
strBookmark = "O"
strBookmark = "P"
strBookmark = "Q"
strBookmark = "R"
strBookmark = "S"
strBookmark = "T"
strBookmark = "U"
strBookmark = "V"
strBookmark = "W"
strBookmark = "X"
'Wenn die Textmarken existiert...
If Bookmark.Exists(ActiveDocument, strBookmark) Then
Set wdRange = wDoc.Bookmarks(strBookmark).Range
'... und auch noch eine Tabelle im Bereich vorhanden ist...
If wdRange.Tables.Count > 0 Then
Set tblTab1 = wdRange.Tables(1)
Set tblTab2 = wdRange.Tables(1)
Set tblTab3 = wdRange.Tables(1)
Set tblTab4 = wdRange.Tables(1)
Set tblTab5 = wdRange.Tables(1)
Set tblTab6 = wdRange.Tables(1)
Set tblTab7 = wdRange.Tables(1)
Set tblTab8 = wdRange.Tables(1)
Set tblTab9 = wdRange.Tables(1)
Set tblTab10 = wdRange.Tables(1)
Set tblTab11 = wdRange.Tables(1)
Set tblTab12 = wdRange.Tables(1)
Set tblTab13 = wdRange.Tables(1)
Set tblTab14 = wdRange.Tables(1)
Set tblTab15 = wdRange.Tables(1)
Set tblTab16 = wdRange.Tables(1)
Set tblTab17 = wdRange.Tables(1)
Set tblTab18 = wdRange.Tables(1)
Set tblTab19 = wdRange.Tables(1)
Set tblTab20 = wdRange.Tables(1)
Set tblTab21 = wdRange.Tables(1)
Set tblTab22 = wdRange.Tables(1)
Set tblTab23 = wdRange.Tables(1)
With tblTab23
''Anzahl Spalten ermitteln:
' nCols = .Columns.Count
nRows = .Rows.Count
'Hier ggf. weiterer Code....
End With
If ComboBox1.Value = "CO2" Then
tblTab7.Delete
tblTab23.Rows(5).Delete
tblTab23.Rows(5).Delete
tblTab23.Rows(5).Delete
tblTab23.Rows(5).Delete
Else
If ComboBox1.Value = "FKL" Then
tblTab1.Delete
tblTab13.Delete
tblTab22.Delete
tblTab23.Rows(2).Delete
tblTab23.Rows(2).Delete
tblTab23.Rows(2).Delete
End If
'Verweis (Speicher) freigeben:
Set rNew = Nothing
Set tblTab1 = Nothing
End If
Set wdRange = Nothing
End If
'Verweis (Speicher) freigeben:
Set wdDoc = Nothing
End If
End Sub

Public Function BookmarkExists(ByVal vobjDoc As Document, _
ByVal vsBMName As String) As Boolean
With vobjDoc
If .Bookmarks.Exists(vsBMName) Then
BookmarkExists = True
End If
End With
End Function

Kann es sein, dass er nur die letzte Bookmark sucht? Freue mich über jeden Tip!!

Gruß Moritz
Rainer H. Rauschenberg
2014-01-18 10:20:45 UTC
Permalink
Post by Moritz J.
Private Sub ComboBox1_Change()
Es scheint mir eher ungewöhnlich, anti-intuitiv und
benutzerunfreundlich, durch das Ändern eines Kombinationsfelds eine
Löschaktion auszulösen.
Post by Moritz J.
Dim wdDoc As Document 'Word-Dokument
Dim wdRange As Range
Dim tblTab1 As Table 'Tabelle
Dim strBookmark As String
Dim nCols As Integer 'Anzahl Spalten
Dim nRows As Integer 'Anzahl Zeilen
Dim rNew As Row
Set wdDoc = ActiveDocument
strBookmark = "A"
strBookmark = "B"
strBookmark = "C"
strBookmark = "D"
strBookmark = "F"
strBookmark = "G"
strBookmark = "H"
strBookmark = "I"
strBookmark = "J"
strBookmark = "K"
strBookmark = "L"
strBookmark = "M"
strBookmark = "N"
strBookmark = "O"
strBookmark = "P"
strBookmark = "Q"
strBookmark = "R"
strBookmark = "S"
strBookmark = "T"
strBookmark = "U"
strBookmark = "V"
strBookmark = "W"
strBookmark = "X"
Sinn des vorstehenden bleibt schleierhaft: Du weist einer Variablen
nacheinander die werte von A bis X zu, ohne zwischendurch irgendetwas
sinnvolles damit zu machen. Für den gesamten folgenden Programmcode hat
strBookmark den Wert X.
Post by Moritz J.
'Wenn die Textmarken existiert...
Textmarke (Singular).
Post by Moritz J.
If Bookmark.Exists(ActiveDocument, strBookmark) Then
Set wdRange = wDoc.Bookmarks(strBookmark).Range
'... und auch noch eine Tabelle im Bereich vorhanden ist...
If wdRange.Tables.Count > 0 Then
Set tblTab1 = wdRange.Tables(1)
Set tblTab2 = wdRange.Tables(1)
Set tblTab3 = wdRange.Tables(1)
Set tblTab4 = wdRange.Tables(1)
Set tblTab5 = wdRange.Tables(1)
Set tblTab6 = wdRange.Tables(1)
Set tblTab7 = wdRange.Tables(1)
Set tblTab8 = wdRange.Tables(1)
Set tblTab9 = wdRange.Tables(1)
Set tblTab10 = wdRange.Tables(1)
Set tblTab11 = wdRange.Tables(1)
Set tblTab12 = wdRange.Tables(1)
Set tblTab13 = wdRange.Tables(1)
Set tblTab14 = wdRange.Tables(1)
Set tblTab15 = wdRange.Tables(1)
Set tblTab16 = wdRange.Tables(1)
Set tblTab17 = wdRange.Tables(1)
Set tblTab18 = wdRange.Tables(1)
Set tblTab19 = wdRange.Tables(1)
Set tblTab20 = wdRange.Tables(1)
Set tblTab21 = wdRange.Tables(1)
Set tblTab22 = wdRange.Tables(1)
Set tblTab23 = wdRange.Tables(1)
Auch hier erschließt sich mir der Sinn nicht, wenngleich es andersherum
ist als oben: 23 Variablen erhalten das selbe Objekt zugewiesen, nämlich
die erste Tabelle der Textmarke X.

Im übrigen stimmt hier die Einrückung nicht. Wo fehlt das End If?
Post by Moritz J.
With tblTab23
' nCols = .Columns.Count
nRows = .Rows.Count
'Hier ggf. weiterer Code....
End With
If ComboBox1.Value = "CO2" Then
tblTab7.Delete
tblTab23.Rows(5).Delete
tblTab23.Rows(5).Delete
tblTab23.Rows(5).Delete
tblTab23.Rows(5).Delete
Else
If ComboBox1.Value = "FKL" Then
tblTab1.Delete
tblTab13.Delete
tblTab22.Delete
tblTab23.Rows(2).Delete
tblTab23.Rows(2).Delete
tblTab23.Rows(2).Delete
End If
Set rNew = Nothing
Set tblTab1 = Nothing
End If
Set wdRange = Nothing
End If
Set wdDoc = Nothing
End If
End Sub
Public Function BookmarkExists(ByVal vobjDoc As Document, _
ByVal vsBMName As String) As Boolean
With vobjDoc
If .Bookmarks.Exists(vsBMName) Then
BookmarkExists = True
End If
End With
End Function
Warum machst Du eine Funktion für etwas, was man im Programm in eine
Zeile schreiben kann? Also oben:
If ActiveDocument.Bookmarks.Exists(strBookmark) Then
Post by Moritz J.
Kann es sein, dass er nur die letzte Bookmark sucht?
Klar, denn dass hast Du programmiert.

Loading...