Word VBA: Opslaan van een PathName / tekstveld in een formulier

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. In een Word document heb ik mbv VBA een (beheer)formulier waarin ik in een tekstveld een padnaam kan invullen waar het document moet worden opgeslagen. De gebruikers kunnen naar behoefte de padnaam in het formulier aanpassen en zo het document in een andere Directory c.q. map opslaan.

De padnaam moet ik "ergens" opslaan voor het kunnen gebruiken als ik het document moet opslaan. De padnaam kan door de gebruiker worden aangepast en moet dus ook de padnaam op de "ergens" locatie/file worden aangepast.
Hoe zou ik kunnen uitvoeren? Moet ik een zgn. Init-bestand aanmaken waarin de padnaam wordt geplaatst en in een daarvoor bestemde Directory wordt opgeslagen? Dit is nogal complex omdat ik dan de bestaande string met de padnaam in het document moet wissen en daarna de nieuwe string met aangepaste padnaam moet plaatsen. Kan dit niet eenvoudiger? In Acces sla je het padnaam in een tabelveld op maar in Word? Alvast bedankt voor de hulp.
 
Daar kan je documentvariabelen voor gebruiken.
Een voorbeeld:
Code:
ActiveDocument.Variables.Add Name:="Pad", Value:="C:\Test"

Ook nadat je Word hebt afgesloten en het document weer hebt geopend kan je deze ophalen met:
Code:
Pad = ActiveDocument.Variables("Pad").Value
 
Laatst bewerkt:
Ik vind het een erg ongebruikelijke (en onhandige) werkwijze. Om te beginnen: als je gebruikers in een tekstveld een pad laat intypen, is de kans op typfouten behoorlijk groot. En dan werkt het pad uiteraard niet. Ook als ze een niet-bestaand pad intypen, heb je een probleem.
Daarnaast kan elke gebruiker wel met de knop <Opslaan als> uit de voeten, als een document op een andere plek moet worden opgeslagen. En als laatste argument om het anders te doen: als een document is opgeslagen, dan héb je het pad al, want dat kun je dan uit de bestandsnaam halen. Dus waarom zou je het dan nog opslaan?

Maar goede, je kunt uiteraard wel wat bedenken als je toch door wilt zetten: je kunt het pad opslaan in een DocVar (varPadNaam bijvoorbeeld) die je kunt aanmaken bij het opslaan in de DocVars collectie. Die docvars worden opgeslagen bij het document, dus die kun je altijd weer terug opvragen. Maar wat het nut is van het opslaan van een pad dat niet het pad van het document is, is mij een raadsel.
 
Omdat edmoor al een voorbeeldje heeft gemaakt van een DocVar, nog een andere aanpak: gebruik CustomDocumentProperties, daarin kun je ook waarden vastleggen en vervolgens weer opvragen. Die DocumentProperties bestaan in twee varianten: BuiltInProperties en dus CustomProperties. De eerste zijn bijvoorbeeld Titel, Auteur etc. en daarnaast kun je dus zelf Properties definiëren. Dus er zijn meerdere wegen die je kunt bewandelen :).
 
Je relaas in #3 kan ik het alleen maar mee eens zijn en ben wel benieuwd waarom er voor die werkwijze gekozen is.
 
Ik vind het altijd wel jammer dat helpers gelijk met code gaan gooien; ik vind het wel nuttig als een TS eerst zelf gaat kijken of hij/zij de code kan vinden. We horen het snel genoeg als ze er niet uit komen. Maar helpers staan op de een of andere manier te popelen om te laten zien wat ze allemaal weten :).
 
Het is gewoon een direct antwoord op de vraag.
Dat heeft niks met "kijk mij eens" te maken.
 
TS vraagt nergens om code, maar wel om een oplossing. Die is: DocVars of BuiltInProperties. :). Ik lees nergens dat-ie gelijk code wil hebben...
 
Ik lees alleen maar dat jij zoals altijd weer vervelend en tegendraads bent.
Zelfs al ik het, zoals ik in #5 laat zien, met je eens ben, ben je in staat dit naar het negatieve te draaien, ook al zeg je zelf dat mijn antwoord over DocVars correct is.
Dat maakt je niks anders dan zielig en triest mannetje die er de oorzaak van is dat meerdere prima helpers de pijp aan Maarten gaven.
Erg jammer dat een fijne website als Helpmij met een figuur jij opgescheept zit.
 
Fijn dat je het zo positief oppakt :). Ik constateer dat HelpMij steeds meer in: “ikmaakhetvoorjou” verandert. Ik vind dat vragenstellers meer zijn geholpen met antwoorden waar ze zelf mee kunnen gaan sleutelen. Wat is daar mis mee?
 
Dank voor jullie bijdragen. Ik begrijp de discussie wel en soms is dit nodig. Gebruikers willen denk ik een code. Voordat een gebruiker een vraag plaats is nmi. heel wat onderzoek op internet gedaan en probeersels getest, maar kom je er niet uit. Uiteindelijk zoek je hulp. Direct een stukje code is heel plezierig, je kunt dan weer een bepaalde richting inslaan. Met zo'n stukje code moet je daarna meestal nog behoorlijk aan de slag voordat eea. slaagt. OctaFish, er zit dus nog steeds een goed bedoeld leermoment in.
Ik ben de hulp op Helpmij erg dankbaar en heeft mij veel goeds gebracht. De vraag wordt per omgaande (snel) beantwoord maar bevat, zonder code, soms complexe uitleg van een expert en dat is voor de (beginnende) vraagsteller moeilijk te begrijpen en moet je weer een vraag stellen. Met wat code gaat het nmi. wat sneller. Ik denk dat access gebruikers veel code van internet halen en alles aan elkaar plakken tot een gewenste applicatie, snel en gemakkelijk, dat is mens eigen.

Ik heb bewondering voor jullie dat je de meest uiteenlopende vragen in de stijl van de vraagsteller begrijpt.

Mijn vraag betreft een beheerformulier waarop je een pad voor een map kunt instellen. De map is bedoeld voor het opslaan van schoolrapporten. Aangezien dezelfde kinderen het volgende jaar weer een rapport krijgen, wil men deze in een andere map opslaan. Met één map komt een kind meerdere jaren voor en dat is niet handig, ieder jaar zestig (rapport) bestanden aanmaken met een jaartal in de bestandsnaam is geen pretje. Zonder beheertool zou ik ieder jaar een andere map moeten aanmaken, wie doet dat na mijn leven. De docenten kunnen dat in een beheerformulier ook zelf doen. De applicatie betreft het genereren van rapporten c.q. beoordeling waar aan de hand van een invulformulier de rapporten kunnen worden aangemaakt, opgeslagen (in word en pdf), email en afgedrukt.

Ik ben begonnen met een idee uit te werken en een init-bestand (Word) te maken en deze op te slaan op de D:schijf. In het bestand staat het pad van de betreffende map. De oplossing met DocVars of BuiltInProperties lijkt mij beter en ga ik uitwerken.
 
Bedankt voor de suggestie. Je advies is inderdaad een optie, nog niet bij stilgestaan. Dit zou aan het begin van het nieuwe schooljaar moeten plaatsvinden, zodat alle zaken (mutaties, toevoegingen etc.) van het vorige jaar zijn afgerond. Ik ga er over nadenken.
 
Leerlingen veranderen doorgaans gedurende de opleiding niet van naam, dus als je die structuur gebruikt, lijkt het mij niet zo heel moeilijk om op basis van de actuele datum te bepalen in welke map je een document moet opslaan. Dus als ‘Jan de Vries’ dit schooljaar begint, dan maak je geheel automatisch de map 2019-2020 aan waarin je de documenten voor dit jaar opslaat. Zeg: de map “D:\Jan de Vries\2019-2020”. Doe je hetzelfde volgend jaar, dan heb je dus, op basis van de datum, de map “D:\Jan de Vries\2020-2021” nodig. Kan je volledig automatisch genereren en gebruiken.

Overigens ben ik het niet geheel met je eens; tuurlijk is het gemakkelijk als je als vraagsteller gelijk code krijgt. En zeker in het Access forum zie je dat mensen overal code vandaan plukken. Maar als je die code vervolgens niet begrijpt, ben je in mijn ogen nog steeds nergens. Ik heb liever dat je snapt wat er aan de hand is, en dan zelf de oplossing vindt. Ook al duurt dat misschien wat langer.
Neem je eigen vraag: je wist niet van het bestaan van DocVariables en BuiltInProperties. Nu wel. En jij bent best in staat om dat dan verder uit te zoeken. En kom je er dan nog niet uit, dan is een voorbeeldje zo gepost. Want uiteindelijk is het natuurlijk wel de bedoeling dat je verder met je programma kunt. Ik ageer dus hooguit een beetje tegen de gemakzucht die op HelpMij een beetje rondwaart :).
 
Ik heb de instructie DocVar toegepast en dat werkt. Het is een eenvoudige instructie die de waarde van de variabele bewaard in het document zelf.
Code:
Sub GetSetDocVars()

   Dim fName As String
   fName = "Jeff Smith"
   ' Set contents of variable "fName" in a document using a document
   ' variable called "FullName".
   ActiveDocument.Variables.Add Name:="FullName", Value:=fName
   ' Retrieve the contents of the document variable.
   MsgBox ActiveDocument.Variables("FullName").Value

End Sub

Ik heb echter een aanvullend probleem. Er is een formulier met een knop waarmee ik een ander formulier (UserForm4) open met de weergave van het pad. Op het moment dat het formulier wordt geopend zou dmv. DocVar de waarde van de variabele beschikbaar moeten komen echter de Sub "Private Sub UserForm4_Initialize()" wordt niet aangeroepen. Zie onderstaande testcode.
Code:
Private Sub UserForm4_Initialize()
   'ActiveDocument.Variables("Map_Leerkracht_Word").Delete
   'ActiveDocument.Variables("Map_Leerkracht_Pdf").Delete
   
   'MsgBox ActiveDocument.Variables("Map_Leerkracht_Word").Value
TextBox_Leerkracht_Word = ActiveDocument.Variables("Map_Leerkracht_Word").Value
TextBox_leerkracht_Pdf = ActiveDocument.Variables("Map_Leerkracht_Pdf").Value
End Sub

Je zou verwachten dat bij het openen van het formulier deze sub wordt aangesproken, Wat is er niet goed. Alvast bedankt.
 
Mogelijk is in de vraag wat ontgaan. De codes in de sub zullen wel werken maar ik verwacht dat bij het openen van het formulier UserForm4 de sub wordt aangesproken en initialiseert, maar dat gebeurt niet. Het formulier wordt wel geopend maar geen initialisatie. Waarschijnlijk zie ik wat over het hoofd. Ik heb het gevonden: In de eerste regel staat Private Sub UserForm4_Initialize() en dat moet zijn: Private Sub UserForm_Initialize()

Het is in dit forum altijd een spanning welk antwoord er wordt gegeven. Eerst een pittige discussie en nu dat ik de basiscursus moet doen. Ik programmeer 1,5 jaar in Acces met een uitgebreide applicatie en heb ervaring opgedaan, maar nooit genoeg. In Word minder ervaring maar ben al een eind op weg. Niet iedereen is even begaafd. Sorry, moest ik even kwijt.
 
Laatst bewerkt:
Volgens mij, "praten" wij langs elkaar heen. Userform_Initialize heb ik al verscheidene malen zonder problemen toegepast, wat dat betreft geen probleem. Dank.
 
Userform_Initialize heb ik al verscheidene malen zonder problemen toegepast
Dat mag waar wezen, maar dit:
Code:
Private Sub UserForm[B][COLOR="#FF0000"]4[/COLOR][/B]_Initialize()
Is gewoon fout. En dat is wat werd aangegeven in de opmerking.
 
Dank OctaFish. Ik had het inderdaad ook gezien en dat was de fout. Wel even naar lopen zoeken, ik keek er over heen.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan