Opgelost De gewenste Word-tabel uitlezen

Dit topic is als opgelost gemarkeerd
Status
Niet open voor verdere reacties.

HansFRAP

Gebruiker
Lid geworden
12 jul 2011
Berichten
233
Beschrijving
Ik heb een Word document waarin verschillende tabellen zitten. Enkele tabellen hebben zelfs 'geneste' tabellen.
Ik zou graag vanuit een VBA-script direct de gewenste tabel willen selecteren.

Ik heb in de eigenschappen van de tabellen hun Tabel-naam opgenomen.
(invoegpunt in tabel, Indeling, Tabel - Eigenschappen, Tabblad: Alternatieve Tekst, Titel) maar ik zie nergens hoe ik dit vanuit VBA kan selecteren of hoe ik daarmee mijn tabel kan selecteren.

In Excel kan ik elke tabel een eigen naam geven en deze vervolgens selecteren.
Ik heb dit mechanisme in Word helaas niet gevonden.
Heeft een Word-tabel wel een soort ID ??
(Lijkt er wel op want je kunt: ActiveDocument.Tables().Count aantal tabellen tellen. )

Vraag
- Welk mechanisme wordt er in Word gebruikt om tabellen te benoemen zodat je ze makkelijk kunt selecteren?
- Hoe kan ik vervolgens direct mbv VBA de gewenste tabel selecteren??
 
Zonder voorbeeld document, zoiets om cel 1 van regel 1 in tabel 1 te selecteren:
Code:
ActiveDocument.Tables(1).Cell(1, 1).Select
 
Code:
Thisdocument.tables(1).range.select
of
Code:
Thisdocument.tables(1).select

Juist Word heeft een macro-recorder.
 
Laatst bewerkt:
Beide tips bekend. Dus dat is helder.
Ook bekend: bij verwijderen van Tables(1) zal Tables(2) nieuw nummer krijgen. Wordt dan Tables(1).

Maar wanneer ik macro-recorder gebruik om uit te vogelen wat de naam van een geneste tabel is geeft de recorder niet thuis.
Vandaar dus de vraag.

Ik in de bijlage een document waarin Tables(1) en Tables(2) zitten. Beide tabellen hebben geneste tabellen.
Vraag is dus: hoe kan ik nu de gewenste geneste tabel selecteren?
 

Bijlagen

In Word heeft een Table geen Name attribuut.
Je kan ze wel van een Decr voorzien, bijvoorbeeld zo:
Code:
For Each tbl In ThisDocument.Tables
    i = i + 1
    Tables(i).Descr = "Tabel" & i
    Debug.Print i & " - " & tbl.Descr
Next tbl
 
Code:
Sub M_snb()
   For Each it In Tables
      For Each it1 In it.Tables
         MsgBox it1.NestingLevel
         it1.Select
      Next
   Next
End Sub
 
De macro van snb doet het bij mij niet, maar het is denk ik ook wat ingewikkelder. Déze constellatie daarentegen werkt wel :)
Code:
Type WordTable
    Index As Long           'Table position in document
    NestingLevel As Long    'Nesting level calculated from main
    RowIndex As Long        'Row index in parent table
    ColIndex As Long        'Column index in parent table
    RowCount As Long        'Number of rows in table
    ColCount As Long        'Number of columns in table
End Type

Code:
Sub GetAllTablesInDocument()
Dim doc As Word.Document
Dim rng As Word.Range
Dim aTables() As WordTable
Dim tblCounter As Long


    Set doc = ActiveDocument
    Set rng = doc.Content
    tblCounter = -1
    GetAllTablesInRange rng, tblCounter, aTables, False
    For tblCounter = LBound(aTables) To UBound(aTables)
        Debug.Print aTables(tblCounter).Index, aTables(tblCounter).NestingLevel, aTables(tblCounter).RowIndex, _
            aTables(tblCounter).ColIndex, aTables(tblCounter).RowCount, aTables(tblCounter).ColCount
    Next
    MsgBox "Number of tables: " & aTables(UBound(aTables)).Index
End Sub

Code:
Function GetAllTablesInRange(ByRef rng As Word.Range, ByRef tblCounter As Long, ByRef aTables() As WordTable, nestedCall As Boolean)
    Dim tbl As Word.Table
    Dim t As WordTable
    Dim rngTable As Word.Range


    For Each tbl In rng.Tables
        tblCounter = tblCounter + 1
        ReDim Preserve aTables(tblCounter)
        t.Index = tblCounter + 1
        t.NestingLevel = tbl.NestingLevel
        t.RowCount = tbl.Rows.Count
        t.ColCount = tbl.Columns.Count
        If nestedCall Then
            Set rngTable = tbl.Range
            rngTable.Collapse wdCollapseEnd
            t.RowIndex = rngTable.Rows(1).Index
            t.ColIndex = rngTable.Columns(1).Index
        Else
            t.RowIndex = 0
            t.ColIndex = 0
        End If
        aTables(tblCounter) = t
        If tbl.Tables.Count > 0 Then
            GetTablesInTable tbl, tblCounter, aTables()
        End If
    Next
End Function
Code:
Function GetTablesInTable(tbl As Word.Table, ByRef tblCounter As Long, ByRef aTables() As WordTable)     'As WordTable()
Dim nestedTable As Word.Table


    For Each nestedTable In tbl.Tables
        GetAllTablesInRange nestedTable.Range, tblCounter, aTables(), True
    Next
End Function
 
Hier al aan gedacht ?

Code:
Sub M_snb()
   For Each it In ThisDocument.Tables
      For Each it1 In it.Tables
         MsgBox it1.NestingLevel
         it1.Select
      Next
   Next
End Sub
 
Verkeerde uitkomst :). Geeft 2 tabellen, en geen (in mijn testgeval) 10. Mijn code al geprobeerd? Mag je uiteraard best inkorten als dat kan.
 
Mannen (?),

Mijn dank voor meedenken en sturen van de uitwerkingen.

@Snb: Geeft bij mij ook 2 maal 2 als antwoord.
Ik interpreteer dit als: Ik heb 2 tabellen met in elke tabel 2 geneste tabellen.
Nu heeft in het voorbeeld tabel 1, 1 geneste tabel, die zelf 2 geneste tabellen heeft. Dus totaal 4 tabellen.
Antwoord zou dan 2 tabellen elk met 3 tabellen dus => 2*4 = 8 moeten zijn.
Dat is mooi om te weten maar hoe kan ik nog dan zo'n specifieke tabel selecteren?

@AccessGuru
Prachtig uitgewerkt!
Ik ga hiermee aan de slag. Kijken hoe ik uit/met de variabelen de juiste tabel kan selecteren.


Daarnaast is de opmerking van edmoor ook helder: In Word heeft een Table geen Name attribuut.
 
Met recursie kom ik op 8 uit in het voorbeeldbestand.

Code:
Dim y
Sub M_snb()
   M_snb_ ThisDocument
   
   MsgBox y
End Sub

Sub M_snb_(it0)
   For Each it In it0.Tables
      y = y + 1
      M_snb_ it
   Next
End Sub

Als je weet, dat de meest geneste tabel een nestinglevel van 3 heeft is selekteren zó mogelijk

Code:
Sub M_snb()
   M_snb_ ThisDocument 3
End Sub

Sub M_snb_(it0,y)
   For Each it In it0.Tables
      if it.nestinglevel=y then it.select
      M_snb_ it, 3
   Next
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan