Gegevens inlezen uit een Word bestand

  • Onderwerp starter Onderwerp starter EdHa
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

EdHa

Verenigingslid
Lid geworden
6 mei 2012
Berichten
57
Hallo,

Ik wil gegevens die door derden in een door ons voorgeschreven wordbestand worden aangeleverd op basis van bijvoorbeeld bladwijzers overnemen in een access-database als nieuwe record. Dus iemand vult een formulier in, wij starten access op, voegen aan een tabel een nieuw record toe (via een formulier waarin de gegevens uit het word formulier worden overgenomen). De vraag is hoe ik die gegevens op de juiste wijze in mijn Access formulier krijg. Of desnoods zonder Access formulier in de database opneem als nieuw record zonder alles over te tikken.

Dat moet toch kunnen??

Wie helpt mij op weg?

Dank alvast!
 
Dat is zó ingewikkeld, dat ik dat niet kan uitleggen zonder een voorbeeldje an je word document.
 
@Octafish

Ik ben blij te horen dat het ingewikkeld is en dat het niet (alleen) ligt aan mijn domheid. Ik zal voorbeelden van zowel het Wordbestand als het Accessbestand opsnorren en posten. Dank alvast.
Groet,

PS: Ik heb je handleidingen met veel plezier gelezen, ze vormden op onderdelen een welkome aanvulling, maar op dit punt (begrijpelijkerwijs) niet.
 
Hoi Edha,
Er zijn een paar dingen niet duidelijk. Hoe krijgen de derden het wordbestand (digitaal, via de post), waarom een tussenstap, via outlook kan je zo een emaillisting aanmaken die rechtstreeks in een database terechtkomt. Een invulformulier via een website met php lost je probleem ook op. Mischien een voorbeeldje van je word document en de database (zonder gevoelige gegevens) dan is het mischien duidelijker waar je naartoe wilt. Kan ik mischien iets in elkaar flansen

Greetz
 
@octafish

@ Octafish: hierbij voorbeeldbestandjes die weergeven waar het om gaat. In de access-database open ik het bestand frmInvoer, dat een bij-openen-gebeurtenis heeft waarin uit het eveneens bijgaande wordbestand de gegevens van de ingevulde bladwijzers ophaalt. Vervolgens wordt de macro mcrInvoer gestart die bedoeld is om de tabel bij te werken. Waar het nu om gaat is dat ik de opgehaalde gegevens in een formulier of anderszins in variabelen wil vangen om ze aan de tabel te kunnen aanbieden.

Bekijk bijlage Test.docx

ik krijg bij het uploaden van het bestand test2.accdb een foutmelding dat dit bestand een ongeldige opmaak heeft. Enig idee hoe dat komt? Ik moet de bestanden van een windows-omgeving overhalen naar mijn Mac om ze daaruit te versturen. Kan dat het probleem zijn? Op de Mac staat geen Access, vandaar. Er zit nu dus maar 1 bestand bij.

@gast0660
Het formulier wordt door ons uitgezet bij onze relaties die het format voor ons invullen. Dat mailen ze dan aan ons. Daar staat veel meer in dan we nodig hebben om over te nemen, maar dat heeft een ander doel. Dat is de reden dat de (in jouw beleving) omweg wordt bewandeld. ik zou menen dat dat niet uit moet maken, al kan het misschien eenvoudiger als je niet aan een dergelijke omweg vast zit. Maar neem van mij aan dat dat om andere redenen onvermijdelijk is.

De database volgt zodra duidelijk is wat er mis gaat.

Groet
 
Er is (vermoedelijk) niks mis met je database, maar je kunt nu eenmaal geen databases uploaden naar HelpMij. Je zult de db eerst moeten zippen, of de extensie veranderen.
 
@octafish en @gast0660

O, is dat alles? Dan gaat hierbij het bestand met de extensie .txt.

Ahum, ook dat gaat niet, nu is het weer te groot. Het mag maar 100 kb zijn. Wat nu? Hoe zip ik een bestand op een Mac? Nog nooit bij de hand gehad.
 
Je hebt het lastigste probleem (je Word document inlezen) al zelf gedaan; de rest zou appeltje-eitje moeten zijn :). Je hebt in ieder geval geen formulier nodig om het verhaal in te lezen. Sowieso zou je, als je een gekoppeld formulier gebruikt, geen ingewikkelde trucs nodig hebben om de ingelezen info te zien en op te slaan.
Code:
Function HaalOp()
Dim objWord As Object
Dim rs As DAO.Recordset

    Set objWord = CreateObject("Word.application")
    With objWord
        .Visible = False
        .Documents.Open ("P:\Documenten\Test.docx")
        .ActiveDocument.Bookmarks("Naam").Select
        Naam = objWord.Selection.Text
        .ActiveDocument.Bookmarks("GebDatum").Select
        Geboortedatum = objWord.Selection.Text
        .ActiveDocument.Bookmarks("Volgnummer").Select
        Volgnummer = objWord.Selection.Text
        .ActiveDocument.Close
        .Quit
    End With
    Set rs = CurrentDb.OpenRecordset("tblAllen")
    With rs
        .AddNew
        .Fields("Naam") = Naam
        .Fields("Geboortedatum") = Geboortedatum
        .Fields("Volgnummer") = Volgnummer
        .Update
        .Close
    End With
End Function
 
@Octafish

Het doet me deugd te horen dat ik de lastigste klip zelf al heb omzeild, maar het jammere is dat het makkelijkere deel aan mij niet besteed lijkt te zijn. :confused:

Dank in elk geval voor jouw oplossing die mij verder helpt. In elk geval kan ik de gegevens op die manier zonder tussenkomst van een formulier eenvoudig als nieuw record aan de database toevoegen.

Wat ik me nog wel afvraag is of ik de gegevens (het zijn er meer dan de drie uit het voorbeeld) toch nog even in een gekoppeld formulier kan laten zien ter controle alvorens ze als nieuw record aan de database toe te voegen. Als ik een niet-gebonden formulier gebruik kan ik ze, zoals je zag, in dat formulier laten verschijnen, bij een gekoppeld formulier lukt me dat niet omdat dat (als het enkelvoudig is) direct de eerste record van de tabel laat zien en die wil ik niet overschrijven. Ik moet dus na het openen van dat formulier de gegevens uit het Word-bestand inladen in de velden van het formulier die dan leeg moeten zijn om een nieuw record te maken. Welk commando dien ik daarvoor na het openform commando te gebruiken? Je begrijpt wat ik bedoel, neem ik aan? Als ik de gegevens namelijk in een leeg nieuw record (in het formulier) kan laden en controleren kan ik met een commandbutton kiezen voor toevoegen of voor annuleren. Dat kan niet als ik de gegevens rechtstreeks aan de tabel toevoeg zoals in het voorbeeld.

Ik hoop dat je daar nog een simpel antwoord op hebt, anders ga ik zelf weer dokteren en ben ik in elk geval al zeer geholpen met jouw antwoord. Het is dan toch eenvoudiger dan ik meende.

Dank en groet
 
In essentie verander er niet zoveel. Ik zou, als ik wél een gekoppeld formulier zou gebruiken, er uiteraard voor zorgen dat je het eerste record nooit overschrijft. Dat is simpel te doen door de importcode aan een knop te hangen die dan eerst een nieuw record aanmaakt. Dat is allemaal niet zo lastig. Dus de knop:
1. Maakt een nieuw record
2. Vult de formuliervelden
En klaar ben je. Zeker als je meerdere formulieren wilt inlezen is dit een handige methode.

Het alternatief (niet-gebonden formulier) doet wat jij nu ook doet: formulier inlezen en de tekstvelden vullen. Dat kan vele malen simpeler als je daar niet een losse functie voor gebruikt, maar de code op het formulier zelf houdt. Dan heb je helemaal geen losse variabelen nodig, maar lees je het Word document uit en zet je de gegevens gelijk op het formulier. Voor het wegschrijven gebruik je dan de code die ik heb gebruikt.
 
@octafish

Nog 1 domme vraag en dan ronden we af: Welk commando in VBA gebruik ik in een formulier om een nieuw record te maken? Ik kan dit niet vinden. Omdat het aan een knop hangt lijkt mij VBA de makkelijkste route. Of zie ik dat verkeerd?
 
Uit het hoofd: DoCmd.GoTo acNewRecord. Of zoiets.
 
@Octafish

Sorry dat ik er nog even op terugkom, maar ik krijg het nog niet aan de praat. Als ik in het gebonden formulier (frmAllen) in de tekst en datumvakken txtNaam, dteGeboortedatum en txtVolgnummer de variabelen wil inlezen uit het Wordformulier (het overhalen daarvan gaat prima en als ik ze direct in de tabel inbreng heb ik geen probleem) zijn de variabelen leeg als ik ze in de formuliervakken wil inlezen als gebeurtenis bij het openen. Ik roep dan de macro aan die de gegevens uit het Wordformulier haalt (net als ik dat doe als ik ze direct -dus zonder controle- in de tabel laat zetten als nieuw record), hij vult netjes de variabelen, ik heb ze global gemaakt in de module HaalOp (public enz), maar niettemin worden de waarden niet bewaard en in het formulier gezet. Wat doe ik verkeerd? Of terugkomend op je eerdere suggestie: als ik het niet aan het openen van het formulier hang, maar aan een knop dan klopt het commando DoCmd.GoToRecord(acDataTable,"tblAllen",acNewRec) niet, want dan krijg ik de melding:"Compileerfout Verwacht :=". Ik dacht dat ik er was, maar ik ben het weer even kwijt :(
 
Voor alle helderheid: Als ik een waarde aan me.txtnaam wil toekennen krijg ik de melding "U kunt geen waarde aan dit object toekennen", dus ook niet als ik de waarde zelf formuleer ("Jansen") in plaats van uit een variabele probeer te halen. Ik heb dus twee problemen, de eerste is dat de variabele leeg is, de tweede dat ik ook als ik wel inhoud zou hebben ik me.txtnaam niet kan vullen.
 
Een nieuw record maak je meestal zo:
Code:
    DoCmd.GoToRecord , , acNewRec
Ik zie geen enkel voordeel van een aparte functie met extra variabelen; je gebruikt de routine toch nergens anders dan op je formulier?
 
Ik zou het dus zo doen:
Code:
Private Sub cmdOK_Click()
Dim rs As DAO.Recordset

    Set rs = CurrentDb.OpenRecordset("tblAllen")
    With rs
        .AddNew
        !Naam = Me.txtNaam
        !Geboortedatum = Me.DteGebooredatum
        !Volgnummer = Me.txtVolgnummer
        .Update
        .Close
        MsgBox "Record is ingelezen", vbOKOnly
    End With
        
End Sub

Code:
Private Sub Form_Load()
Dim wrdObj As Object
    Set wrdObj = CreateObject("Word.application")
    With wrdObj
        .Documents.Open ("F:\_HelpMij\edha\Test.docx")
        .ActiveDocument.Bookmarks("Naam").Select
        Me.txtNaam = .Selection.Text
        .ActiveDocument.Bookmarks("GebDatum").Select
        Me.DteGebooredatum = .Selection.Text
        .ActiveDocument.Bookmarks("Volgnummer").Select
        Me.txtVolgnummer = .Selection.Text
        .ActiveDocument.Close
        .Quit
    End With
End Sub
 
@Octafish

De onderste code doet wat ik wil. Het steeds terugkerende probleem is dat ik de variabelen ook in Wordformulier al had gedeclareerd en als ik ze dus ook in Access declareer (global) krijg ik een conflict. Dat heb ik nu uitgezet en dan werkt het. En verder heb ik de aparte module er uit gehaald en de code, zoals jij ook aangeeft, in een 'bij-laden'-gebeurtenis gezet. Overigens heb ik wel behoefte aan de variabelen (dat blijkt niet uit dit versimpelde voorbeeldbestand) want in het definitieve formulier moet de door derden in het Wordformulier gegeven invoer gecontroleerd worden en moeten er door onze gebruiker ook nog andere velden worden ingevuld. Daarvoor is nodig dat deze ziet wat er al vooringevuld staat. Dank voor het meedenken, ik ben er nu uit en zal het topic sluiten.
Groet!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan