Userform in Wordsjabloon plaatst tekst dubbel na ENTER

Status
Niet open voor verdere reacties.

jfmjacobs

Gebruiker
Lid geworden
1 mrt 2009
Berichten
45
Hallo allen,

Ik ben een redelijke beginneling wat betreft VBA. Ik heb een documentsjabloon met macro's gemaakt waar bij het openen een userform zichtbaar wordt. Als de gebruiker hier gegevens invoert en op de knop klikt, worden de gegevens keurig ingevuld in het sjabloon. Tot zover geen probleem.....

als de gebruiker in de brief op een willekeurige plek een ENTR geeft (om bijvoorbeeld tekst aan te passen), dan worden bij de bookmarks de gegevens uit het userform nogmaals er achter gezet. Bij iedere ENTR komt er dus de naam achter de naam die er al staat. (bijv: JansenJansenJansen)

Wat gaat hier mis en hoe zou ik het op kunnen lossen? Wellicht zie ik iets over het hoofd?

Ik hoor graag van jullie
bij voorbaat dank
Jurgen
 

Bijlagen

  • voorbeeld brief met VBA.rar
    31,7 KB · Weergaven: 38
Ik kan je sjabloon niet openen, want het is een rar bestand. Als je er een zip bij kan zetten, kan ik wel even kijken. Maar op voorhand: bladwijzers zijn niet de beste optie om te gebruiken, omdat je ze blijkbaar als positiemarker gebruikt. En dan wordt de tekst er inderdaad gewoon achter gezet. Gebruik DocVariabels; dan heb je dat probleem niet. Bovendien kun je de waarden dan ook weer terug lezen in je formulier.
 
Hoi,
hierbij in een ZIP

ik heb nog niet gehoord van Docvariables. hoe werkt dit?
 

Bijlagen

  • voorbeeldbrief.zip
    30,7 KB · Weergaven: 40
DocVariables zijn variabelen die je binnen het document opslaat. Je gebruikt ze eigenlijk op dezelfde manier als bladwijzers, dus op de plek waar je er één nodig hebt, zet je een veld { DOCVARIABLE "VarNaam" }. In je formulier wijs je de inhoud van de formuliervelden toe aan de bijbehorende DOCVARIABLES en de hele collectie kun je dan, als alles klaar is, bijwerken. Bij het openen van het formulier kun je de beschikbare DocVar collectie weer in de formuliervelden zetten. Op die manier kun je eindeloos muteren in de data, en weer wegschrijven.

Ik maak wel wat in je voorbeeldje.
 
Beetje ruw voorbeeld nog, maar ik hoop dat je er uit komt.
 

Bijlagen

  • voorbeeldbrief (2).zip
    36 KB · Weergaven: 38
Hoi Octa,

dit ziet er al een heel stuk beter uit. Wat ik hieruit begrijp is dat je in plaats van een bookmark een DocVariable invoegt op de plaast waar een waarde uit een textveld moet komen. Ik heb een beetje lopen zoeken maar ik kan niet vinden hoe ik dit kan doen.

Daarnaast geeft hij in het door jouw meegezonden bestand een foutmelding bij "betreft" (Fout! De documentvariabele ontbreekt)
in de code zie ik dat wel staan.

in ieder geval voor bedankt voor het op weg helpen!
 
Het 'foutje' komt omdat het veld niet in het document staat; Word probeert dus een veld uit het formulier naar het overeenkomende DocVariable veld te schrijven in het document. Had ik overigens even niet gezien, maar dat kan natuurlijk altijd (zie de post tijd :) ). Al ben ik ook in staat om dit er met opzet in te laten zitten, zodat je kan uitzoeken hoe je dit zelf oplost :D.

Variables declareer en maak je dus in het VBA venster, maar die routine kan ze natuurlijk nooit in het document plaatsen. De code kan nooit weten waar jij precies die velden weer nodig hebt. Dus dat is een handmatige actie. Eigenlijk een die heel vergelijkbaar is met het invoegen van een datumveld of een bladwijzer, waarbij je dus bij de optie Velden moet zijn. Dus via tabblad <Invoegen>, groep <Tekst>, <Snelonderdelen>, <Veld> kun je velden maken en invoegen.

Om snel (en zgn. foutloos) te kunnen werken, heb ik één veld ingevoegd, en de namen van de DocVars vervolgens uit de VBA code gekopieerd en geplakt. Dat is bij Betreft dus fout gegaan, daar staat de complete code nog in:
Code:
DOCVARIABLE  As Variable, As Variable, varBetreft As Variable
Dat moet natuurlijk zijn:
Code:
DOCVARIABLE  varBetreft \* MERGEFORMAT

Kwestie van even via <ALt>+<F9> de codeweergave omzetten, de overtollige tekst weghalen en dan op <F9> drukken, dan doet deze het ook goed.

Er zit trouwens nog een klein ander probleempje in de code zie ik, en dat kun je er ook beter uit halen. Door deze code te gebruiken:
Code:
Private Sub CommandButton1_Click()
Dim i As Integer
        
    Application.ScreenUpdating = False
    For i = 1 To 8
        aDoc.Variables(Me("Textbox" & i).Tag).Value = Me("Textbox" & i).Value
    Next i
    aDoc.Fields.Update
    Unload Me
    Application.ScreenUpdating = True

End Sub
 
Hallo Octa,

Dank voor je uitleg. Ik kom er nu stukje bij beetje achter hoe het werkt. Wat ik nog niet begrijp is de laatste code. Wat moet ik precies vervangen? Ik blijf foutmeldingen krijgen als ik het op diverse manieren plaats.

Ik heb in ieder geval nu door dat de Docvariables velden zijn die oneindig in te zetten zijn in je document.
Is er ook een mogelijkheid dat als je de brief hebt gemaakt en opgeslagen, je bij het opnieuw openen na een tijdje niet meer het userform te zien krijgt. Ik denk dat het hem dna ziet in privatesub en dan dan open en userform.hide of iets dergelijks.
 
In een sjabloon zijn er twee momenten waarop je een formulier kan laten zien: bij het aanmaken, en bij het openen. Aanmaken gebruik je als de gebruiker een nieuw document maakt op basis van een sjabloon (Document_New). Als je een bestaand document opent, kan Document_Open interessant zijn: dan opent het formulier elke keer als je het document opent.

Ik heb in mijn versie de gewenste DocVariabele namen in de eigenschap TAG van de tekstvelden gezet. Die tekstvelden zijn gewoon oplopend genummerd (Textbox1, Textbox2 etc). Dus op basis van de textbox weet de code welke DOcVariable moet worden gevuld. Ik doe dat wel vaker zo, want de code hoef je dus nooit te veranderen als je mee4 of minder variabelen gebruikt. Je verandert alleen het getal in de loop en het werkt weer.
 
Hallo Octa,

Ik ben nog een beetje aan het stoeien en lijk er maar niet uit te komen. ik blijf een foutmelding krijgen in de uitvoering

dummy = ActiveDocument.Variables(varName)

Bijgevoegd het bestand waarmee ik aan het proberen ben. Ik probeer hiermee de code te leren begrijpen en zelf verder te kunnen.
 

Bijlagen

  • NieuweZip.zip
    32,8 KB · Weergaven: 32
Je was een paar kleine dingen vergeten, zoals het toekennen van de DocVariable namen aan de Tag eigenschap van de tekstvakken. Dan kan de procedure ze uiteraard niet vinden.
 

Bijlagen

  • brief Sjabloon.zip
    38,9 KB · Weergaven: 34
Hoi,

dat kan natuurlijk idd.

ik kom nu een foutmelding tegen

aDoc.Variables(Me("Textbox" & i).Tag).Value = Me("Textbox" & i).Value

geen idee waar t m in zit
 
In mijn voorbeeld of in dat van jou? Want die van mij doet het dacht ik goed.
 
In het voorbeeldje wat je gestuurd hebt. Ik heb het in de map aangepaste sjablonen gezet en er een nieuw document mee gemaakt. Ik krijg netjes het userform te zien maar zodra ik op de commandknop klik, krijg ik de genoemde foutmelding
 
Probeer deze eens.
 

Bijlagen

  • brief Sjabloon.zip
    28,5 KB · Weergaven: 42
@OctaFish, Hoewel de variabele aDoc een beetje overbodig is, bij 2 x ActiveDocument gebruiken was het foutje er ongetwijfeld niet ingeslopen.:), even een vraagje;

Waarom mag je in Word een Textbox zonder hoofdletter gebruiken? In Excel is het volgens mij wel hoofdletter gevoelig. Logica van MS?
 
@VenA: Klopt, dat in dit geval aDoc wel heel mager voorkomt. Het voorbeeldje komt uit een sjabloon waar het wat meer nut heeft. Ik ben geen voorstander van het instellen van variabelen die maar een enkele keer gebruikt worden. Maar het mag natuurlijk wel :).
Textbox1 en Textbox2 zijn in dit geval slechts de namen van de tekstvakken. Dan mag je dacht ik elke syntax gebruiken die je wilt in Word. Maar in Excel is het toch ook niet hoofdlettergevoelig?
 
Hallo Octafish,

SUPER. het werkt nu allemaal naar behoren! 1 opmerking nog. als ik een nieuw document maak dan worden sommige textbox-en al vooraf ingevuld. dit blijft zo bij de 2e en volgende keren dezelfde informatie?

Even voor mijn info:
Als je in je userform meerdere textboxen invoegd, dan moet je in de code de getallen aanpassen nagelang je een hoeveelheid aan textboxen hebt.
dus bij ( For i = 1 To 8) moet je de 8 aanpassen aan het aantal textboxen.

Ik zal zelf nu even stoeien met radiobuttons en schuifknopjes. eens zien of dat mogelijk is. tips zijn welkom ;-)

Nogmaals bedankt tot zover!
 
Helemaal gelijk; omdat je Kenmerk bestaat uit een vast deel (de datum) en je een brief doorgaans opmaakt op de dag dat je hem aanmaakt, en de datum dus vermoedelijk vaak de actuele datum zal zijn, heb ik die standaard ingevuld. Scheelt werk, leek mij. Sowieso kun je, als je door de velden loopt met de tabtoets, elk vooraf ingevuld veld gelijk overschrijven, dus mij lijkt het alleen maar handig :).
 
beetje late reactie maar erg bedankt voor je hulp.
Ik kan er zover ik kan zien nu verder mee bouwen.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan