VBA Word Tabellen gezielt mit Bookmarks löschen

17/01/2014 - 08:01 von Moritz J. | Report spam
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
 

Lesen sie die antworten

#1 Rainer H. Rauschenberg
18/01/2014 - 11:20 | Warnen spam
On 2014-01-17, Moritz J. wrote:

Private Sub ComboBox1_Change()



Es scheint mir eher ungewöhnlich, anti-intuitiv und
benutzerunfreundlich, durch das Ändern eines Kombinationsfelds eine
Löschaktion auszulösen.

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"



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.

'Wenn die Textmarken existiert...



Textmarke (Singular).

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?

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



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

Kann es sein, dass er nur die letzte Bookmark sucht?



Klar, denn dass hast Du programmiert.

Ähnliche fragen