Userform in Word terughalen

Status
Niet open voor verdere reacties.

roosjordens

Gebruiker
Lid geworden
15 mrt 2011
Berichten
13
Hallo,

Ik ben een beginner met Microsoft Visual Basic. Nu heb ik een document gemaakt met userforms en bookmarks in het Word document. Alles werkt prima, maar 1 ding niet.

Wanneer ik het document open verschijn het userform die ik vervolgens invul, daarop volgen nog wat userforms die ook ingevuld kunnen worden. Uiteindelijk komen de gegevens in het document te staan. Via beeld -> Macro's -> Toon kom ik weer bij de userform waarmee ik begon toen ik het document opende. De gegevens die ik toen had ingevuld zijn echter dan weg.

Hoe krijg ik het nu voor elkaar, welke code's moet ik gebruiken?? om ervoor te zorgen dat ik het userform krijg met de gegevens die ik al had ingevuld.

Code:
        .Bookmarks("bum").Range.Text = txtbu.Value
        .Bookmarks("pol").Range.Text = txtpo.Value
        
    End With
    Application.ScreenUpdating = True
    Unload Me
    If optal.Value = True Then frmschema2.Show
Unload Me heeft er vast iets mee te maken. Maar ik geef toe dat ik daar dus (nog) geen kaas van heb gegeten. Het is misschien een heel makkelijke oplossing (of juist niet) maar ik weet het niet en heb al proberen te zoeken, maar het is me nog steeds onduidelijk.

Wie wil/kan mij helpen?

Groetjes Roos
 
Je moet de form niet uit het geheugen laden, dat doet de "unload me" gedeelte.
Gebruik ipv "unload me" . me.visible = false en unload het als je alles achter de rug hebt.
 
Bedankt voor je reactie!

Dus als ik je goed begrijpt moet ik van unload.me overal me.visible = false maken? Wanneer ik dat doe krijg ik een compileerfout (functie is gereserveerd of automatiseringstype dat niet wordt ondersteund).
Dus blijkbaar moet ik toch iets anders doen, maar wat?
 
Het is me nog steeds niet gelukt om het userform terug te roepen zoals ik heb in heb gevuld. Nu komt daar bij dat ze het document alleen willen kunnen aanpassen via de userform en dat de rest van het document beveiligd is zodat je niet zomaar stukken tekst in het Worddocument kan typen. Is dit mogelijk. Kan iemand mij helpen aub?
 
Dat maakt het al een stuk ingewikkelder... Ik heb zelf een tijdje terug een formulier voor iemand gemaakt dat iets vergelijkbaars doet. Je vult de gegevens in via een formulier, en bij Opslaan worden de gegevens in het document gezet. Bij mij kun je het formulier daarna wel weer openen, terwijl ik wel met Unload het formulier sluit. Sterker nog: je kunt het document sluiten, opnieuw openen en het formulier wordt nog steeds gevuld met de juiste gegevens. Mijn oplossing is eigenlijk heel simpel: ik gebruik CustomProperties in het document om de variabelen die via het formulier worden gemaakt en in het document worden ingevuld in op te slaan.
Deze variabelen worden bij het openen van het formulier opgehaald uit de CustomProperties en weer toegewezen aan de betreffende tekstvakken op het formulier. Bij aanpassen van de teksten worden de nieuwe waarden weer opgeslagen, zodat je die de volgende keer weer kunt inlezen. De code bij het openen van het formulier ziet er dan zo uit:

Code:
Private Sub UserForm_Initialize()
If ActiveDocument.ProtectionType <> wdNoProtection Then
    ActiveDocument.Unprotect Password:=strPassword
End If

'Formulier laden met opgeslagen gegevens.
If ActiveDocument.CustomDocumentProperties("DocNr").Value <> "9999" Then
    For Each ctl In Controls
        With ctl
            If Left(.Name, 4) = "Text" Then
                sVeld = .Tag
                If Not sVeld = "" Then
                    On Error Resume Next
                    .Value = ActiveDocument.CustomDocumentProperties(sVeld).Value
                End If
            End If
        End With
    Next
End If
End Sub

En voor het opslaan van de CustomProperties gebruik ik dit:

Code:
Application.ScreenUpdating = False
'Formuliergegevens in document plaatsen
For Each ctl In Controls
    With ctl
        If Left(.Name, 4) = "Text" Then
            sVeld = .Tag
                sWaarde = .Value
                On Error Resume Next
                ActiveDocument.CustomDocumentProperties(sVeld).Delete
                ActiveDocument.CustomDocumentProperties.Add Name:=sVeld, LinkToContent:=False, Value:=sWaarde, Type:=msoPropertyTypeString
                If ActiveDocument.Bookmarks.Exists(sVeld) Then
                    If InStr(1, sVeld, "Totaal") > 0 Then
                        ActiveDocument.Bookmarks(sVeld).Range.Text = Format(Me(ctl.Name).Value, "Currency")
                    Else
                        ActiveDocument.Bookmarks(sVeld).Range.Text = Me(ctl.Name).Value
                    End If
                End If
            End If
            End If
        End If
    End With
Next

Hierbij worden de Bookmarks in het formulier gevuld, en de CustomProperties verwijderd en aangemaakt. Ik verwijder ze eerst, omdat in dit geval niet altijd dezelfde Properties nodig zijn.
 
Laatst bewerkt:
Beste Octafish

ik begrijp niet helemaal waar ik dit dan moet plaatsen. ik heb hieronder mijn code voor het eerste formulier. alvast bedankt.

met vriendelijke groet,

roos

Code:
Option Explicit

Private Sub Document_New()
    frmschema1.Show
End Sub

Sub toon()
  frmschema1.Show
End Sub

Code:
Private Sub CheckBox2_Click()

End Sub

Private Sub CheckBox3_Click()

End Sub

Private Sub cmdannuleren_Click()
    Unload Me
    ActiveDocument.Close SaveChanges:=True
End Sub

Private Sub cmdinvoegen_Click()
       Dim strstraanum1 As String
    If optstraa = True Then strstraanum1 = ""
    If optpos = True Then strstraanum1 = "Postbus"
        
        Dim str1 As String
    If opt1 = True Then str1 = ""
        
        Dim strwerkdagen As String
    If optmaa = True Then strwerkdagen = "ma"
    If optdin = True Then strwerkdagen1 = "di"
    If optwoe = True Then strwerkdagen2 = "wo"
    If optdon = True Then strwerkdagen3 = "do"
    If optvrij = True Then strwerkdagen4 = "vr"
        
    With ActiveDocument
        .Bookmarks("bedrijfsnaam").Range.Text = txtbedrijfsnaam.Value
        .Bookmarks("bedrijfsnaam4").Range.Text = txtbedrijfsnaam.Value
        .Bookmarks("functie").Range.Text = txtfunctie.Value
        .Bookmarks("achternaam").Range.Text = txtachternaam.Value
        .Bookmarks("telefoonnummer").Range.Text = txttelefoonnummer.Value
        .Bookmarks("email").Range.Text = txtemail.Value
        .Bookmarks("werkdagen").Range.Text = strwerkdagen
        .Bookmarks("werkdagen1").Range.Text = strwerkdagen1
        .Bookmarks("werkdagen2").Range.Text = strwerkdagen2
        .Bookmarks("werkdagen3").Range.Text = strwerkdagen3
        .Bookmarks("werkdagen4").Range.Text = strwerkdagen4
        .Bookmarks("jandb").Range.Text = txtjandb.Value
        .Bookmarks("febdb").Range.Text = txtfebdb.Value
        .Bookmarks("maadb").Range.Text = txtmaadb.Value
        .Bookmarks("aprdb").Range.Text = txtaprdb.Value
        .Bookmarks("meidb").Range.Text = txtmeidb.Value
        .Bookmarks("jundb").Range.Text = txtjundb.Value
        .Bookmarks("juldb").Range.Text = txtjuldb.Value
        .Bookmarks("augdb").Range.Text = txtaugdb.Value
        .Bookmarks("sepdb").Range.Text = txtsepdb.Value
        .Bookmarks("oktdb").Range.Text = txtoktdb.Value
        .Bookmarks("novdb").Range.Text = txtnovdb.Value
        .Bookmarks("decdb").Range.Text = txtdecdb.Value
        .Bookmarks("stranum").Range.Text = txtstranum.Value
        .Bookmarks("poco").Range.Text = txtpoco.Value
        .Bookmarks("pla").Range.Text = txtpla.Value
        .Bookmarks("tel").Range.Text = txttel.Value
        .Bookmarks("fax").Range.Text = txtfax.Value
        .Bookmarks("straanum").Range.Text = txtstraanum.Value
        .Bookmarks("posco").Range.Text = txtposco.Value
        .Bookmarks("plaa").Range.Text = txtplaa.Value
        .Bookmarks("straanum1").Range.Text = strstraanum1
    End With
    Application.ScreenUpdating = True
    Unload Me
    If optal.Value = True Then frmschema2.Show
End Sub

Private Sub CommandButton1_Click()

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub Frame9_Click()

End Sub

Private Sub UserForm_Initialize()
    optstraa.Value = True
    optal.Value = True
End Sub
 
Volgens mij kun je mijn code vrij makkelijk inbouwen... Ik heb overigens een slim trucje gebruikt, waardoor ik met veel minder code toe kan dan jij. Ik hoef namelijk, zoals je al gezien had, nergens een Bookmark naam in te geven. En toch komt alles netjes op de juiste plek! Hoe doe ik dat? Eigenlijk heel simpel. Ik zal het uitleggen a.d.h.v. één van jouw eigen velden.
Code:
        .Bookmarks("functie").Range.Text = txtfunctie.Value
Je hebt blijkbaar op je formulier een tekstveld met de naam txtFunctie gemaakt. Je wilt de Bookmark [Functie] vullen met de waarde uit het tekstveld. Tot zover zal het duidelijk zijn (je hebt het zelf gemaakt tenslotte).
Mijn truc bestaat er uit, dat ik elke control op het formulier om te beginnen een standaardnaam geef (txt+de rest van de naam) en bij elk teksvak de naam van de bookmark als TAG invul bij dat tekstvak. Dus in bovenstaand voorbeeld krijgt het tekstvak [txtfunctie] als tag: functie.
Nu is het, bij het sluiten van het formulier, simpel een kwestie van alle controls op het formulier controleren, en bij de tekstvakken die met txt.... beginnen, de Value uitlezen, en de Tag, vervolgens een CustomProperty aanmaken met de naam van de bookmark, en de bookmark vullen met de waarde van het tekstvak. Dat ziet er, naar jou situatie aangepast, dus zo uit:

Code:
For Each ctl In Controls
    With ctl
        'Controleren of het tekstveld wel met de letters TXT begint
        If Left(.Name, 4) = "txt" Then
            'Een variabele gebruiken om de naam van de Bladwijzer uit de TAG eigenschap van het tekstveld te lezen
            sVeld = .Tag
            'Een variabele gebruiken om de waarde van het tekstveld te lezen
            sWaarde = .Value
            On Error Resume Next
            ' De bestaande CustomDocumentPropertie eerst verwijderen, en daarna opnieuw aanmaken
            ActiveDocument.CustomDocumentProperties(sVeld).Delete
            ActiveDocument.CustomDocumentProperties.Add Name:=sVeld, LinkToContent:=False, Value:=sWaarde, Type:=msoPropertyTypeString
            ' Voor de zekerheid controleer ik of de bladwijzer (opgehaald met de variabele sVeld) wel bestaat, en als dat zo is, vullen met de waarde uit het tekstvak. 
            If ActiveDocument.Bookmarks.Exists(sVeld) Then                       
                ActiveDocument.Bookmarks(sVeld).Range.Text = Me(ctl.Name).Value
            End If
        End If
    End With
Next
Deze code kun je dus gebruiken i.p.v. jouw code tussen With ActiveDocument .... End With. Wel dus eerst alle Bladwijzernamen invullen in de eigenschap TAG van de tekstvelden. Als je dat gedaan hebt, kun je via <Bestand>, <Eigenschappen> de nieuwe documenteigenschappen terugzien op het tabblad <Aangepast>.

De eerste code, Initialize, wordt gebruikt om de opgeslagen eigenschappen uit te lezen als je het formulier weer opent. Die moet dus bij de eigenschappen van het formulier komen te staan. Als je deze code ergens bij je knop opslaat, komt het al goed, want de Intialize code is verder vrij algemeen.
Private Sub UserForm_Initialize()
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect Password:=strPassword
End If

Code:
'Formulier laden met opgeslagen gegevens.
    For Each ctl In Controls
        With ctl
            If Left(.Name, 4) = "Txt" Then
                sVeld = .Tag
                If Not sVeld = "" Then
                    On Error Resume Next
                    .Value = ActiveDocument.CustomDocumentProperties(sVeld).Value
                End If
            End If
        End With
    Next
End Sub

Ik heb de code ook weer aangepast aan jouw situatie. De eerste routine checkt overigens het Wachtwoord; ik heb dat opgeslagen op het formulier zelf, als Constante variabele onder de naam strPassword. Je kunt hem dan overal aanroepen, wat ik wel makkelijk vind...
Kun je weer verder?
 
Heel erg bedankt tot nu toe! Ik ga er vandaag mee aan het stoeien, hopelijk kom ik eruit.
 
In mijn laatste post heb ik het over "De eerste code, Initialize". Dit slaat nog op de codevoorbeelden die ik eerder heb gepost; in het laatste bericht is de tweede code dus bedoeld voor de Private Sub UserForm_Initialize() routine, en de eerste code voor de knop Opslaan.
Ik hou het graag overzichtelijk :)
 
*Bij Tags heb ik de bookmarks die erbij horen ingevuld.
*
Als je dat gedaan hebt, kun je via <Bestand>, <Eigenschappen> de nieuwe documenteigenschappen terugzien op het tabblad <Aangepast>.
Dit kan ik niet vinden. Bij bestand kan ik eigenschappen niet vinden, waarschijnlijk kijk ik verkeerd. Waar kan ik dat vinden?
* Codes heb ik als volgt ingevuld (Dit is niet hetzelfde document die ik het eerder liet zien, maar komt op hetzelfde neer alleen dan ook nog met dropboxen):
Code:
Private Sub cmdannuleren_Click()
    Unload Me
    ActiveDocument.Close SaveChanges:=False
End Sub

Private Sub cmdinvoegen_Click()
For Each ctl In Controls
    With ctl
        'Controleren of het tekstveld wel met de letters TXT begint
        If Left(.Name, 4) = "txt" Then
            'Een variabele gebruiken om de naam van de Bladwijzer uit de TAG eigenschap van het tekstveld te lezen
            sVeld = .Tag
            'Een variabele gebruiken om de waarde van het tekstveld te lezen
            sWaarde = .Value
            On Error Resume Next
            ' De bestaande CustomDocumentPropertie eerst verwijderen, en daarna opnieuw aanmaken
            ActiveDocument.CustomDocumentProperties(sVeld).Delete
            ActiveDocument.CustomDocumentProperties.Add Name:=sVeld, LinkToContent:=False, Value:=sWaarde, Type:=msoPropertyTypeString
            ' Voor de zekerheid controleer ik of de bladwijzer (opgehaald met de variabele sVeld) wel bestaat, en als dat zo is, vullen met de waarde uit het tekstvak.
            If ActiveDocument.Bookmarks.Exists(sVeld) Then
                ActiveDocument.Bookmarks(sVeld).Range.Text = Me(ctl.Name).Value
            End If
        End If
    End With
Next
    Application.ScreenUpdating = True
    Unload Me
End Sub

Private Sub UserForm_Initialize()
       If ActiveDocument.ProtectionType <> wdNoProtection Then
    ActiveDocument.Unprotect Password:=strPassword
End If


       For Each ctl In Controls
        With ctl
            If Left(.Name, 4) = "Txt" Then
                sVeld = .Tag
                If Not sVeld = "" Then
                    On Error Resume Next
                    .Value = ActiveDocument.CustomDocumentProperties(sVeld).Value
                End If
            End If
        End With
    Next
         With cbopu1
        .AddItem "Opening"
        .AddItem "Vastelling van de agenda"
        .AddItem "Notulen vorige agenda"
        .AddItem "Ingekomen stukken"
        .AddItem "Mededelingen"
        .AddItem "Bespreekpunt 1"
        .AddItem "Bespreekpunt 2"
        .AddItem "Bespreekpunt 3"
        .AddItem "Agenda volgende vergadering"
        .AddItem "Rondvraag"
   End With
          With cbopu2
        .AddItem "Opening"
        .AddItem "Vastelling van de agenda"
        .AddItem "Notulen vorige agenda"
        .AddItem "Ingekomen stukken"
        .AddItem "Mededelingen"
        .AddItem "Bespreekpunt 1"
        .AddItem "Bespreekpunt 2"
        .AddItem "Bespreekpunt 3"
        .AddItem "Bespreekpunt 4"
        .AddItem "Bespreekpunt 5"
        .AddItem "Bespreekpunt 6"
        .AddItem "Agenda volgende vergadering"
        .AddItem "Rondvraag"
        .AddItem "Sluiting"
   End With
* en nog wat cbopunten *
  End Sub

Wanneer ik het bestand nu opsla als wordsjabloon met ingestelde macro's en dat bestand dan open. Kan ik het formulier invullen, maar vervolgens komt er niets in het document te staan. Ik krijg echter ook geen foutmelding. Iets doe ik dus nog steeds niet goed, maar wat???
 
Juststarted

Dag,

uhm, jullie gaan mij te hard.
@Roos, ook ik probeer nu met docproperties de waardes terug te halen.
Is het mogelijk dat ik jou project eens kan bekijken?

'..groeten van de echte leek...'
 
Ik zal vanavond een voorbeeldje posten met de manier waarop mijn formulier werkt. Misschien is dat duidelijker. Ik heb mijn voorbeeld (en code) overigens gebaseerd op Word 2003, en nog niet getest in een hogere versie. Daar heb je geen menu <Bestand> meer, dus ik weet zo gauw ook niet waar de <Eigenschappen> nu wel zitten. Zoek ik vanavond wel even uit!
 
Wie kan mij helpen het is me nog steeds niet gelukt om ingevulde userforms terug te halen incl de ingevulde tekst, HELP AUB!
 
Ik ben nog even bezig om mijn formulier te 'generaliseren'... Ik kwam er ook achter dat er nog een paar kleine foutjes in zaten, en die wil ik er uiteraard nog uit hebben. Bovendien moest de bedrijfsgevoelige info uiteraard ook weg ;) Maar ik zal proberen er deze week een punt aan te breien!
 
Dat zou fijn zijn :thumb:. Ik wacht met spanning af. Ik kan je hulp echt waarderen!!!
 
Helaas kan ik nog niet vooruit. @OctaFish zou het nog lukken denk je (niet vervelend bedoeld!!!).
Of kan iemand anders me helpen?
 
Zelfs MS heeft hieraan gedacht bij het ontwerp van Word.

Documentvariabelen zijn hiervoor het meest geschikt. Bladwijzers zijn bedoeld voor degenen die niet in staat zijn VBA te gebruiken en zich moeten behelpen met de Userinterface van Word.
Het gebruik van documentvariableen maakt de customdocumentproperties-suggestie van Octafish ook overbodig.

Als het bestadn is gesloten en later wordt geopende, worden de gegevesn uit de documentvariableen automatishc ingelezen in het userform. Dat wilde je,zo ik je vraag goed begreep.

De code is in de bijlage zo beperkt mogelijk gehouden; dat vereenvoudigt aanpassingen.

Terzijde: een 2e userform is zelden tot nooit nodig.
 

Bijlagen

Dank jullie wel!!! Ik ga er morgen eens goed voor zitten en hopelijk kom ik er dan uit!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan