Tabel in een Tekstvenster in Word 2019

DutchOirs

Gebruiker
Lid geworden
30 sep 2009
Berichten
995
Goedemiddag,

Vervolgvraagje op Tabellen aanpassen, tabellen op hun plaats gekregen, maar moest daarbij een gedeelte in een tekstvenster plaatsen.
Nu komt het probleem, namelijk om daar de variabelen in te krijgen lukt me nog steeds niet.
Had een sub gemaakt om deze Tabelnamen/nummers bovenwater te krijgen.
Zie hieronder:
Code:
Sub ToonTabelNummers()
    Dim tbl As Table, i As Long
    ' Controleer of er tabellen zijn
    If ActiveDocument.Tables.Count = 0 Then
        MsgBox "Er zijn geen tabellen in dit document.", vbInformation
        Exit Sub
    End If
   
    ' Doorloop alle tabellen
    For i = 1 To ActiveDocument.Tables.Count
        Set tbl = ActiveDocument.Tables(i)
        ' Toon tabelnummer en eerste paar tekens van de inhoud
    '    Print Selection.Tables(1)
    ' tbl.Cell(1, 1)
         
        MsgBox "Tabelnummer: " & i & vbCrLf & _
               "Eerste celinhoud: " & Left(tbl.Cell(1, 1).Range.Text, Len(tbl.Cell(1, 1).Range.Text) - 2), _
               vbInformation, "Tabel info"
    Next i
   
'Wat dit doet:
'Controleert of er tabellen in het actieve document staan.
'Loopt door alle tabellen (For i = 1 To ActiveDocument.Tables.Count).
'Toont het tabelnummer en de inhoud van de eerste cel (zonder de eindmarkering Chr(13) & Chr(7) die Word toevoegt).
End Sub
Maar mis er nog 2, deze staan namelijk in een Tekstvenster.
Dit TekstVenster heet "Tb6"
Iemand een idee hoe je deze kan aansturen?
 
Kleine aanpassing naar het zoeken van:
- tabellen op het word document
- tabellen op het word document maar in een tekstvenster

Code:
Sub ToonTabelNummers()
    Dim tbl As Table, i As Long, tktv As TextFrame
    ' Controleer of er tabellen zijn
    If ActiveDocument.Tables.Count = 0 Then
        MsgBox "Er zijn geen tabellen in dit document.", vbInformation
        Exit Sub
    End If
    
    ' Doorloop alle tabellen
    For i = 1 To ActiveDocument.Tables.Count
      Set tbl = ActiveDocument.Tables(i)        ' Toon tabelnummer en eerste paar tekens van de inhoud
                                                '    Print Selection.Tables(1)
                                                ' tbl.Cell(1, 1)
      MsgBox "Tabelnummer: " & i & vbCrLf & _
           "Eerste celinhoud: " & Left(tbl.Cell(1, 1).Range.Text, Len(tbl.Cell(1, 1).Range.Text) - 2), _
           vbInformation, "Tabel info"
    Next i
    ' Doorloop alle Shapes
    For i = 1 To ActiveDocument.Shapes.Count
      MsgBox "Tekstvenster: " & i & vbCrLf & _
           "Eerste celinhoud: " & Left(tbl.Cell(1, 1).Range.Text, Len(tbl.Cell(1, 1).Range.Text) - 2), _
           vbInformation, "Tekstvenster info"
    Next i
    
'Wat dit doet:
'Controleert of er tabellen in het actieve document staan.
'Loopt door alle tabellen (For i = 1 To ActiveDocument.Tables.Count).
'Toont het tabelnummer en de inhoud van de eerste cel (zonder de eindmarkering Chr(13) & Chr(7) die Word toevoegt).
End Sub
 
Zo, dus:

Code:
Sub M_snb()
  For Each it1 In ThisDocument.StoryRanges
    For Each it In it1.Tables
      c00 = c00 & it1.StoryType & vbTab & it.Cell(1, 1).Range.Information(10) & vbTab & it.Cell(1, 1).Range.Text
    Next
  Next
    
  MsgBox Replace(c00, Chr(7), "") & vbLf & vbLf & "1:   wholestory" & vbLf & "5   textframestory"
End Sub/code]
 
Laatst bewerkt:
@snb
Gewoon een citaat van jou.
Code:
Een forum is niet voor oplossingen, maar voor suggesties hoe deelnemers zich kunnen bekwamen, zodat zij zelfredzamer worden.
Graag een duidelijke uitleg over wat deze code doet, want daar ontbreekt het nog wel eens aan. Hierdoor worden ik en waarschijnlijk meerdere leden niet zelfredzamer.
 
Je wordt zelfredzamer door de code in stap-voor-stap modus uit te voeren. en de elementen van de code te analyseren. Zelfwerkzaamheid stimuleert zelfredzaamheid. Ik toon slechts de richting waarin je het zoeken moet via HI.
 
Goedemiddag samen,
Wat het laatste betreft van snb "Zelfwerkzaamheid stimuleert zelfredzaamheid"
tja wat zal ik daar op antwoorden..
Was 12 jaar toen ik begon te werken en kan je zeggen dat ik me aardig kan redden.
En ben al dagen bezig met zoeken en uitvogelen.

Hoi Peter59,
Probeer een variabele over te brengen van een excel file naar een word file.
Tot op heden (onder 2003) werkt het allemaal perfect.
Maar ben bezig over te stappen naar Win 11 en excel 2019.
Bij het omzetten v/h word-file, van 2003 naar 2019 werd alles verschoven.
Dus heb alles weer op zijn plaats gekregen, maar met tabellen werkt dat niet zo makkelijk.
Heb uiteindelijk een tekstvak gebruik waar in 2 tabellen zitten.
Probleem is nu dat ik de variabelen niet meer in de tabellen krijg.
 
@snb
Ik toon slechts de richting waarin je het zoeken moet via HI.
Bedankt voor de richtingaanwijzer.
Ik ben, net als TS, op zoek naar de kaart.
Een richting is nuttig, maar de uitleg waarom je die kant op moet is minstens zo leerzaam.
Zou je die ook willen delen?

Overigens heb ik HI een nieuwe betekenis toegekend: Human Intelligence. Die wijst niet alleen de richting, maar legt onderweg ook uit waarom je die kant op gaat.
 
Overigens heb ik HI een nieuwe betekenis toegekend: Human Intelligence. Die wijst niet alleen de richting, maar legt onderweg ook uit waarom je die kant op gaat.
Dat heet bij ons gewoon een leraar'. Of een boek 😊. Intelligentie zit in de ontvangende partij, die de aanwezige intelligentie gebruikt om zélf vervolgstappen te bedenken.
Overigens vermoed ik dat @snb de term 'HI" juist heeft gebruikt als tegenhanger van de term "AI". De term Human Intelligence is daarmee gemunt door @snb. Niet door jou.
 
Dat heet bij ons gewoon een leraar
Dat herinnert me aan een oud gezegde:
"Geef iemand een vis en hij eet één dag.
Leer hem vissen en hij eet zijn leven lang."

Ik, en ik denk TS ook, vroeg dus niet om een vis, maar om een visles.

Zoals op het forum HelpMij al vaker is gezegd, en waar ik mezelf ook weleens schuldig aan heb gemaakt, is er een groot verschil tussen “maak voor mij” en iemand helpen begrijpen hoe iets werkt.
Juist dat laatste maakt iemand uiteindelijk meer zelfredzaam.

Code:
De term Human Intelligence is daarmee gemunt door @snb. Niet door jou.
Dan moet ik @snb dus de credits geven voor de naam.
Mijn bijdrage zat blijkbaar niet in het bedenken van de term, maar in de invulling die ik eraan gaf in deze discussie.
Een beetje zoals bij programmeren: de functie kan al bestaan, maar de uitleg over hoe en waarom je hem gebruikt blijft waardevol.🐤
 
Laatst bewerkt:
kijk, jij snapt het Peter :)

Die laatste alinea :)


Maar denk dat ik eruit ben.
Morgen verder
 
Laatst bewerkt:
Toch maar even met Human Intelligence aan de slag gegaan.
Laat daar de 2 leraren @snb en @OctaFish maar eens op schieten.

@DutchOirs
Probeer het geheel eens.

Wat de code van snb doet, stap voor stap

For Each it1 In ThisDocument.StoryRanges
Een Word-document bestaat uit meerdere "stories" (los van elkaar te doorlopen tekstdelen): hoofdtekst, voetnoten, eindnoten, kopteksten, voetteksten, tekstvakken, etc. Deze lus doorloopt ze allemaal.

For Each it In it1.Tables
Binnen elke story doorloopt hij alle tabellen die daarin voorkomen.

c00 = c00 & it1.StoryType & vbTab & it.Cell(1,1).Range.Information(10) & vbTab & it.Cell(1,1).Range.Text
Voor elke gevonden tabel wordt aan de string c00 toegevoegd (gescheiden door tabs):
  • it1.StoryType — een nummer dat het type story aangeeft (1 = hoofdtekst, 5 = tekstvak, enzovoort — Word kent er in totaal zo'n 10+).
  • Range.Information(10) — dit is de constante wdFirstCharacterLineNumber: het regelnummer waarop het eerste teken van cel (1,1) staat.
  • Cell(1,1).Range.Text — de tekst uit de eerste cel (linksboven) van die tabel.
MsgBox Replace(c00, Chr(7), "") & ...
Tot slot toont hij alles in een berichtvenster. Chr(7) is het onzichtbare "einde-cel"-teken dat Word automatisch aan celtekst toevoegt; dat wordt eruit gefilterd zodat de tekst leesbaar is. De laatste twee regels zijn een minilegenda voor wat StoryType 1 en 5 betekenen.

Kortom: het is een diagnostisch/debug-scriptje om snel te zien in welke onderdelen van het document (welke story) tabellen voorkomen, en wat er in de linkerbovencel van elke tabel staat.

Leesbaardere versie

De oorspronkelijke code is typisch "snb-stijl": zeer compact, geen Option Explicit, cryptische variabelenamen (it1, it, c00), en zelfs zonder scheidingsteken tussen tabel-regels (waardoor entries eigenlijk aan elkaar zouden plakken zonder regeleinde). Hier is een duidelijkere versie:
Code:
Sub ToonTabelInfoPerStory()
    ' Doorloopt alle 'stories' van het document (hoofdtekst, voetnoten,
    ' kop-/voetteksten, tekstvakken, enz.) en verzamelt voor elke tabel:
    ' het StoryType, het regelnummer van de eerste cel, en de tekst
    ' van die eerste cel.

    Dim story As Word.Range
    Dim tbl As Word.Table
    Dim resultaat As String
    Dim regelNummer As Long
    Dim celTekst As String

    For Each story In ThisDocument.StoryRanges
        For Each tbl In story.Tables
            regelNummer = tbl.Cell(1, 1).Range.Information(wdFirstCharacterLineNumber)
            celTekst = tbl.Cell(1, 1).Range.Text

            resultaat = resultaat & story.StoryType & vbTab & _
                        regelNummer & vbTab & celTekst & vbCrLf
        Next tbl
    Next story

    ' Chr(7) is het onzichtbare 'einde-cel'-teken dat Word toevoegt; verwijderen
    resultaat = Replace(resultaat, Chr(7), "")

    MsgBox resultaat & vbLf & vbLf & _
           "StoryType 1 = wdMainTextStory (hoofdtekst)" & vbLf & _
           "StoryType 5 = wdTextFrameStory (tekstvak)"
End Sub

Wat er is verbeterd:
  • Duidelijke namen: story, tbl, resultaat in plaats van it1, it, c00.
  • Sterk getypeerde variabelen (Word.Range, Word.Table) in plaats van impliciete Variants — geeft IntelliSense en foutcontrole.
  • wdFirstCharacterLineNumber in plaats van de "magische" waarde 10 — meteen duidelijk wat er wordt opgevraagd.
  • vbCrLf toegevoegd na elke tabel-regel, zodat elk resultaat op een eigen regel in de MsgBox verschijnt (dit ontbrak in het origineel).
  • Commentaar bij elke stap.
 
Terug
Bovenaan Onderaan