VBA-script automatisch aanpassen

Status
Niet open voor verdere reacties.

youri81

Gebruiker
Lid geworden
23 apr 2010
Berichten
30
Ik heb een groot aantal Word-documenten. In elk van deze documenten zit zit een macro die weer een document uit een andere groep aanroept.

Nu wil ik collectief een aanpassing maken in de scripts van de macro's.
Tekst 1 moet worden vervangen door Tekst 2.
De scripts zijn niet persée gelijk aan elkaar.

Hoe kan ik dit op een eenvoudige manier doen? Ik denk niet dat je dat in een VBA-script kunt vangen, je kunt de actie in elk gevan niet recorden binnen Word.
 
Zet de macro in een sjabloon (template).
Koppel alle documenten aan dit sjabloon.
Alle wijzigingen in het sjabloon worden automatisch doorgevoerd in alle documenten die op dit sjabloon gebaseerd zijn.
 
Dat geeft helaas niet het gewenste resultaat. Hoewel ik slechts aangaf dat de scripts in de verschillende documenten niet persée gelijk zijn, had ik moeten zeggen dat ze vrijwel allemaal verschillen.
In elk document wordt weer een ander, centraal opgeslagen document ingelezen. Dat is telkens een ander document. Aangezien we binnenkort overgaan van Office 2003 naar 2010, willen we de documenten converteren naar docx, maar dan moet de aanroep in de scripts ook worden aangepast.
 
Geef eens een voorbeeld van 2 macro's. Is er geen patroon binnen die macro's ?
Hoe minder informatie je geeft, hoe minder je geholpen kunt worden.
 
In onderstaande twee scripts moet het vetgedrukte 'doc' worden vervangen door 'docx'.
In dit geval is het script identiek, op de documentnaam na. In werkelijkheid zitten er ook scripts tussen die meer afwijken. De regel met de aanroep van het document is volgens mij wel altijd gelijk (op de bestandsnaam na dus).
Code:
Private Sub Document_New()
strDoc = ActiveDocument.Name
'Toewijzen schijf + openen template
    ChangeFileOpenDirectory "T:\Global\DTI\"
    strBronbrieven = CurDir & "\Bronbrieven\"
    strKop = CurDir & "\Kop\"
    strStaart = CurDir & "\Staart\"
    strBrief = "-PR2049.[B]doc[/B]"
    Documents.Add Template:=strBronbrieven & strBrief, _
        NewTemplate:=False, DocumentType:=wdNewBlankDocument
'Inhoud template kopiëren en plakken 
    strTemplate = ActiveDocument.Name
    Selection.WholeStory
    Selection.Copy
    Application.Windows(strTemplate).Close SaveChanges:=wdDoNotSaveChanges
    Application.Windows(strDoc).Activate
    Selection.EndKey Unit:=wdStory
    Selection.Paste
    End Sub
Code:
Private Sub Document_New()
strDoc = ActiveDocument.Name
'Toewijzen schijf + openen template
    ChangeFileOpenDirectory "T:\Global\DTI\"
    strBronbrieven = CurDir & "\Bronbrieven\"
    strKop = CurDir & "\Kop\"
    strStaart = CurDir & "\Staart\"
    strBrief = "-VM5022.[B]doc[/B]"
    Documents.Add Template:=strBronbrieven & strBrief, _
        NewTemplate:=False, DocumentType:=wdNewBlankDocument
'Inhoud template kopiëren en plakken 
    strTemplate = ActiveDocument.Name
    Selection.WholeStory
    Selection.Copy
    Application.Windows(strTemplate).Close SaveChanges:=wdDoNotSaveChanges
    Application.Windows(strDoc).Activate
    Selection.EndKey Unit:=wdStory
    Selection.Paste
    End Sub
 
Ik weet niet of je het in de gaten hebt, maar deze code
Code:
Private Sub Document_New()
strDoc = ActiveDocument.Name
'Toewijzen schijf + openen template
    ChangeFileOpenDirectory "T:\Global\DTI\"
    strBronbrieven = CurDir & "\Bronbrieven\"
    strKop = CurDir & "\Kop\"
    strStaart = CurDir & "\Staart\"
    strBrief = "-PR2049.doc"
    Documents.Add Template:=strBronbrieven & strBrief, _
        NewTemplate:=False, DocumentType:=wdNewBlankDocument
'Inhoud template kopiëren en plakken 
    strTemplate = ActiveDocument.Name
    Selection.WholeStory
    Selection.Copy
    Application.Windows(strTemplate).Close SaveChanges:=wdDoNotSaveChanges
    Application.Windows(strDoc).Activate
    Selection.EndKey Unit:=wdStory
    Selection.Paste
    End Sub

doet hetzelfde als :
Code:
Sub snb_PR2049()
  documents.add "T:\Global\DTI\Bronbrieven\-PR2049.doc"
end sub

Je hebt dus helemaal geen code nodig in het bestand. Alleen maar een macro (bijv. in normal.dot ) om een nieuw bestand te maken op basis van "T:\Global\DTI\Bronbrieven\-PR2049.doc".

Mutatis mutandis:
Code:
Sub snb_VM5022()
  documents.add "T:\Global\DTI\Bronbrieven\-VM5022.doc"
end sub

Als je deze kleine macro's in een AddIn zet kun je ze eenvoudig verspreiden. Met een beetje creativiteit kun je er een zichzelf installerende AddIn van maken.
 
Laatst bewerkt:
De extra stap om de inhoud te kopieeren naar een nieuw document ipv een bestaand document openen is om te voorkomen dat gebruikers een melding krijgen dat het document in gebruik is bij een ander.

Ons administratiesysteem heeft een eigen sjabloonsysteem. Vanuit de software wordt een doc geopend waarin normaal de inhoud van de brief zou staan, maar waarbij wij nu hebben gekozen voor een script dat de inhoud uit een centraal opgeslagen document haalt. Wij werken namelijk met 10 administratiepakketten naast elkaar (historisch gegroeid). Als we in de standaard brievenset iets inhoudelijks willen aanpassen, hoeft dat nu maar één keer.
Macro's in de normal.dot werkt dus niet, hierin zouden ellelange lijsten moeten komen om te bepalen wanneer welk document moet worden opgehaald. Bovendien zouden alle normal.dot bestanden regelmatig moeten worden geupdate namelijk wanneer er een brief bij komt.

Overigens zou het aanpassen van 650 normal.dots mij ook tot mijn initiële vraag brengen.
 
Laatst bewerkt:
Met documents.add wordt geen enkel reeds geopend bestand geopend. Bestudeer de VBA hulpfunktie nog eens grondig.
Ik krijg sterk de indruk dat jullie vanwege onvoldoende kennis van Office/Word/VBA onnodig ingewikkelde 'oplossingen' bedenken. Is het verschijnsel AddIn je bekend ?
 
We dwalen af van het onderwerp ben ik bang. Ook als ik de scripts vervang door één regel, blijft de vraag hoe ik in verschillende documenten collectief een kleine aanpassing kan doorvoeren.
 
Nee, dat hoeft niet eens als een addin automatisch geladen wordt, en dat kun je bepalen met de plaats waar de addins geplaatst worden.
 
Ok, ik zal me daar eerst is in inlezen. Bedankt voor je hulp zover.
 
Overigens moet ik terugkomen op de reden van het kopieren van de inhoud.
Ons adminstratiepakket maakt een nieuw document aan op basis van een template binnen dit pakket. Dit nieuwe document wordt uiteindelijk gebruikt voor de dossiervorming. Het is daarom niet mogelijk om binnen VBA zelf een nieuwe brief op te maken op basis van ons eigen template volgens jouw code, want dit nieuwe document wordt dan niet binnen het softwarepakket opgeslagen.
Niet onnodig ingewikkeld dus.
 
Overigens moet ik terugkomen op de reden van het kopieren van de inhoud.
Ons adminstratiepakket maakt een nieuw document aan op basis van een template binnen dit pakket. Dit nieuwe document wordt uiteindelijk gebruikt voor de dossiervorming. Het is daarom niet mogelijk om binnen VBA zelf een nieuwe brief op te maken op basis van ons eigen template volgens jouw code, want dit nieuwe document wordt dan niet binnen het softwarepakket opgeslagen.
Niet onnodig ingewikkeld dus.

Helaas...., je redenering klopt niet.
Als jullie nu werken met de code die je hier hebt geplaatst kan dat vele malen eenvoudiger met een AddIn. Als de code die je hier hebt geplaatst werkt, werkt die blijkbaar onafhankelijk van het sjabloon uit jullie administratiepakket. Dan kan dat met een AddIn ook. Je redenering klopt dus niet.
 
De code die ik heb geplaatst staat juist in de sjabloon uit het pakket, werkt dus niet onafhankelijk daarvan.

Als ik met een AddIn werk zal ik toch van alle bestaande sjablonen de scripts moeten aanpassen of uitschakelen.
Ik ben bang dat ik dus weer in herhaling moet vallen: kan ik collectief een aantal scripts in verschillende documenten aanpassen?
 
aplhamax, hartelijk dank voor deze bruikbare en relevante reactie! Ik ga er mee aan de slag :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan