Word Opslaan document met macro, naamgeving vanuit koptekst

Status
Niet open voor verdere reacties.

Oudholland

Gebruiker
Lid geworden
4 jun 2020
Berichten
24
Voor de projectenadministratie exporteer ik vanuit het databaseprogramma Word-documenten met projectbeschrijvingen.
Dit gebeurt na het afsluiten van het boekjaar, en dan worden er in een week tijd zo'n 200 documenten aangemaakt.
Deze moeten in een bepaalde map worden opgeslagen, met in de bestandsnaam de projectcode. De projectcode is altijd een code van 2 letters.
Die projectcode staat in de 1e regel van het document achteraan tussen haakjes, maar ik kan het vanuit de samenvoeging van de export ook laten plaatsen in de koptekst. Zie bijgevoegd voorbeeld; de koptekst + 1e zin komen uit een fysieke export van een testproject.

Ik heb al de volgende code samengesteld (en aan een knop in de taakbalk toegewezen) om het document te laten opslaan en daarna automatisch af te sluiten, maar daarbij krijg ik een tekstvak waarbij ik zelf alsnog het projectnummer moet invoeren.
Aan het exportbestand hoeft niets aangepast te worden, enkel opgeslagen en afgesloten zodat het volgende document kan worden samengesteld door de database-applicatie.
Het document wordt nu opgeslagen op het bureaublad, maar dit is voor de test en wordt natuurlijk niet de definitieve locatie.

Code:
Sub OpslaanTextboxAuto()

Dim Map As String
Dim Bestandsnaam As String
Dim Extentie As String
    
    Map = "D:\Bureaublad\MacroTest\"                 'Vul hier tussen de aanhalingstekens de opslagmap in
    Bestandsnaam = InputBox("Typ de bestandsnaam", "Bestandsnaam invullen")
    Extentie = ".docx"                          'Vul hier tussen de aanhalingstekens de extentie in
    If Not Bestandsnaam = "" Then
        ActiveDocument.SaveAs FileName:=Map & Bestandsnaam & "_2020_def" & Extentie
    End If
    ActiveDocument.Close
    Application.Quit

End Sub


Is er een mogelijkheid (en zo ja hoe) om deze projectcode uit het document (of de koptekst) te halen?

Alvast bedankt voor de reacties.

Groet, Rob
 

Bijlagen

  • Voorbeeldbestand_AB.docx
    18 KB · Weergaven: 46
Een voorbeeld om de eerste regel te lezen:
Code:
Dim Line1 As String
With Selection
    .HomeKey Unit:=wdStory
    .EndKey Unit:=wdLine, Extend:=wdExtend
    Line1 = .Text
End With
MsgBox Line1
 
Dan lees je de hele regel, niet alleen het deel tussen haakjes.
Ik krijg dan in de popup "Beschrijving Project 2020 Onzin (AB)" ipv het gewenste "AB".

Is deze code aan te passen zodat hij de koptekst leest?

Ik kom vaker de volgende code tegen, maar ik snap nog niet hoe ik dan de inhoud van de koptekst kan koppelen aan de Bestandsnaam.
Code:
ActiveDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
 
Laatst bewerkt:
Die popup kan je uiteraard verwijderen, dat is alleen om te laten zien wat er in de variabele Line1 staat.
Daaruit kan je dan halen wat je nodig hebt.
 
Ja, dat begrijp ik. Maar in Line1 staat dus niet de juiste info...
Of mis ik een manier om er alleen hetgeen tussen haakjes uit te halen?
 
De voorbeeld code geeft met het document dat je plaatste dit terug:
Line1.jpg
 
Dat is exact de popup die ik ook krijg. Alleen, zoals ik al eerder schreef, is dat niet de info die ik zoek.
Ik wil puur het gedeelte "AB" uit deze regel, of dezelfde info uit de koptekst (die alleen "AB" is)
Ik krijg dan in de popup "Beschrijving Project 2020 Onzin (AB)" ipv het gewenste "AB".
 
Wat ik al zei, dat kan je daar dan uit extraheren:
Code:
Dim ProjectCode As String
With Selection
    .HomeKey Unit:=wdStory
    .EndKey Unit:=wdLine, Extend:=wdExtend
    ProjectCode = Mid(.Text, InStr(1, .Text, "(") + 1, 2)
End With
MsgBox ProjectCode
 
Ah, nu snap ik 'm. Ik had alleen wat te weinig kennis om die laatste stap te doen, vandaar de verwarring :eek:
Hij werkt nu, bedankt!

Als ik mag vragen, zou je kunnen/willen uitleggen hoe die laatste regel werkt? Ik zou 'm graag begrijpen zodat ik in de toekomst andere delen van die regel kan extraheren voor andere info.

Even voor de registratie nu de totale code die ik gebruik om het document op te slaan en af te sluiten:
Code:
Sub OpslaanEnSluiten()

Dim Map As String
Dim Bestandsnaam As String
Dim Extentie As String

With Selection
    .HomeKey Unit:=wdStory
    .EndKey Unit:=wdLine, Extend:=wdExtend
    Bestandsnaam = Mid(.Text, InStr(1, .Text, "(") + 1, 2)
End With
    Map = "D:\Bureaublad\MacroTest\"                 'Vul hier tussen de aanhalingstekens de opslagmap in
    Extentie = ".docx"                          'Vul hier tussen de aanhalingstekens de extentie in
    If Not Bestandsnaam = "" Then
        ActiveDocument.SaveAs FileName:=Map & Bestandsnaam & "_2020_def" & Extentie               'Controleer het jaartal
    End If
    ActiveDocument.Close
    Application.Quit

End Sub

Maar gewoon omdat ik meer wil leren (en het denk ik binnenkort toch nodig heb); is er ook een manier om deze info (projectnummer) uit de koptekst te halen?
 
Laatst bewerkt:
Eerlijk gezegd weet ik bar weinig van Word en VBA er van.
Ik vond de vraag leuk en heb even wat voor je uitgezocht.
Dat resulteerde in mijn antwoord.
Verder kan ik er weinig bij van dienst zijn helaas.

Voor het extraheren van de projectcode heb ik standaard VBA functies gebruikt die los staan van Word.
Daar kan je makkelijk op zoeken en zal je veel uitleg vinden.
 
Laatst bewerkt:
@Edm,

Ook in Word geldt: vermijd 'Select', 'Selection' en 'Activate' in VBA.
Ook Word is object-georiënteerd.
Die objecten (paragraphs, words, characters ) kun je met VBA rechtstreeks benaderen, onafhankelijk van de positie van de cursor ( = selection).

Dan is het volgende voldoende:

Code:
Sub M_snb()
    With ActiveDocument
       .SaveAs2 "G:\OF\" & Split(Split(.Paragraphs(1).Range, "(")(1), ")")(0) & Format(Date, "_yyyy_\def")
       .Close 0
    End With
End Sub

De standaardextensie in Word is docx, dus in de code opnemen is overbodig.

Alles bij elkaar scheelt het toch weer12 regels code op een totaal van 15
Iedere keer Word afsluiten lijkt me overbodig en moeizaam.
 
Laatst bewerkt:
Ok dan :thumb:
 
@snb, Bij deze krijg ik de fout Compileerfout - Sub of function niet gedefinieerd.
Sub M_snb wordt geel en SaveAs2 wordt blauw geselecteerd.
Ik heb uiteraard G:\OF\ vervangen door de locatie waarin ik wil opslaan.

En het volledig sluiten van Word, dat is nodig omdat de applicatie waaruit ik de export haal, anders foutmeldingen geeft omdat Word nog openstaat, helaas.
 
Laatst bewerkt:
Voor SaveAs2 moet natuurlijk wel een punt staan.
Vervang anders .Saveas2 dan maar door .SaveAs (werk je met Office <2007 ?)


Code:
Sub M_snb()
    With ActiveDocument
       .SaveAs2 "G:\OF\" & Split(Split(.Paragraphs(1).Range, "(")(1), ")")(0) & Format(Date, "_yyyy_\def")
       .Application.Quit 0
    End With
End Sub
 
Laatst bewerkt:
Over die punt had ik (ook) heengelezen. Werkt nu wel, gewoon met .SaveAs2.
Ik gebruik thuis (waar ik nu zit te testen) Office2016, en op het werk hebben we geloof ik 2010.

Bedankt voor de hulp! Nu moet ik alleen nog zien uit te vogelen hoe dit echt werkt, zodat ik het en volgende keer zelf in elkaar kan zetten en jullie niet steeds lastig hoef te vallen :eek:
Heb je een site voor mij waar ik wat naslagwerk kan vinden voor VBA?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan