Access cursus - Hoofdstuk 19

Vergelijkbare documenten
Een Multi-functioneel formulier

Handleiding Afdrukken samenvoegen

Instructie voor een mail-merge VZVZ toestemmingsformulier in Word.

S VERZENDEN MET AFDRUK SAMENVOEGEN

Access voor Beginners-Hoofdstuk 20

Access voor beginners - hoofdstuk 25

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at

Etiketten maken (post)

Cursus Access - Hoofdstuk18

Mailmerge Auteur : Reint Endendijk Versie : 1.0 Datum : 25 juni 2010

Werken met Recordsets (deel 1)

Query SQL Boekje. Fredrik Hamer

VBA voor doe het Zelvers - deel 10

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

Quickstart handleiding

Macro's in OpenOffice.org

VBA voor Doe het Zelvers deel 5

Les 15 : updaten van gegevens in de database (deel2).

AFO Het samenvoegen van documenten

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

6.2 VBA Syntax. Inleiding Visual Basic

gravita PSUR-C conversie en import van relaties in PSU Relatiebeheer Algemeen

M7537 In de database opgeslagen documenten opslaan op locatie

Het toepassen van een gelaagde architectuur

Bijlage Inlezen nieuwe tarieven per verzekeraar

Handleiding People Inc. - ArboUnie link

Aan de slag met de LEDENADMINISTRATIE

Voorbeelden VBA Excel

Samenvoegen Brieven. Word en Excel gegevens samenvoegen. Adresgegevens van Excel samenvoegen met een brief in Word.

Sparse columns in SQL server 2008

23. Standaardbrieven (MailMerge)

Release Notes. Afdrukdatum: 2012/09/17

1.8 Samenvoegen: verdieping

Correctievoorschrift VWO NederlandsNederl. Informatica. Tijdvak 1 Woensdag 17 mei uur. College-examen schriftelijk.

Javascript oefenblad 1

Met een mailing of massaverzending kunt u een groot aantal documenten verzenden naar gebruikelijke adressen, die in een gegevensbestand staan.

VBA voor Doe het Zelvers deel 9

Handleiding ChainWise Data import Module

HomeOffice to ASCII Teksten converteren

Handleiding. BOA Server applicaties. Controleur

Schonen patiëntenbestand

Handleiding Merge items

Release Notes. Afdrukdatum: 2011/12/20

Wil je een meer gepersonaliseerde standaardbrief versturen naar een aantal personen, dan is een mailing een goede oplossing.

HANDLEIDING SPORTLINK CLUB DEELNEMERSLIJSTEN

Hoe maak ik een ANWB-inlogaccount aan?

Report generator Gegevens zoeken en kolommen selecteren Rapporten opslaan en beheren... 6

VBA voor Doe het Zelvers deel 17

Programmeren in Excel VBA. Karel Nijs 2010/09

#Stap 1 Uw account activeren en inloggen

Factuurreeksen. Handleiding. Auteur: Sean Jansen - Onestein Versie: 1.1. Datum laatste wijziging / 6

Mailing Delux handleiding

Release Notes. Afdrukdatum: 2010/05/25

Dynamic Publisher Twee handige hulpjes voor DP

Access voor beginners Hoofdstuk 19 (2)

Samenvoegen met Word en Excel 2010

Handleiding People Inc. - Maetis link

Release Notes. Afdrukdatum: 2008/10/06

Variabelen en statements in ActionScript

Handleiding Objectnummer module i.c.m. Objectnummerlijsten

Gebruikers Handleiding

Handleiding conversie Exact Globe naar Exact Online

Access voor Beginners Hoofdstuk 5

Etiketten afdrukken in Office 2007

Handleiding. Loket.nl / Import variabele gegevens

Deelnemers aan de Beverwedstrijd: gebruikersnaam en wachtwoord

Hoofdstuk 9: Menu s toevoegen

Handleiding Easy Rolodex Merge Add-on

Access Voor Beginners - Hoofdstuk 11 (deel 2)

Formulieren maken met Dreamweaver CS 4/CS 5

Ouders/verzorgers importeren en bijwerken

Cursus Access Voor Beginners - Hoofdstuk 13

4orange Connect. 4orange, Hogehilweg CD Amsterdam Zuidoost

Rapporten. Labels en Rapporten in Atlantis 1. Atlantis heeft twee manieren om output te genereren: 1. labels 2. rapporten (reports)

Praktijkinstructie Tekstverwerking 1 (CSE12.1/CREBO:53139)

Versieperikelen. Bijlage C

Excel Controller. Handleiding voor King journalisering in Excel.xls. King Memoriaal boekingen in Excel

Informatie Voor algemene vragen/opmerkingen omtrent de inhoud van deze site kunt u bellen of en met: Cargo Data Systems BV

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

Handleiding exporteren en importeren van boekhouding. Van MijnWebwinkel naar Snelstart

Etiketten/Enveloppen

Release notes:

AFO Vergelijken van documenten

Samenvoegen. 4.5 Samenvoegvelden

Hoofdstuk 7: Werken met arrays

Technische nota AbiFire5 Rapporten maken via ODBC

Handleiding. BOA Server applicaties. Management

gravita PSUP-C conversie en import van NAW in PSU Postbode Algemeen

Gebruikershandleiding

[13] Rondjes draaien (loops)

Cursus Access voor Beginners - Hoofdstuk 9

DrICTVoip.dll v 2.1 Informatie en handleiding

Excel Controller. Handleiding voor DBS Standaard 753 journalisering in Excel.xls

ChainWise digitaal factureren

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

Release notes:

Computer Club Bodegraven

Release Notes. Afdrukdatum: 2011/05/01

NHibernate als ORM oplossing

Transcriptie:

Access cursus - Hoofdstuk 19 Handleiding van Auteur: OctaFish Augustus 2013

Access cursus - Hoofdstuk 19 Office Automation Office gebruikers werken meestal binnen één programma, om de simpele reden dat het gekozen programma prima voldoet aan de eisen die de gebruiker op dat moment aan zijn gereedschap stelt. Zo voldoet Word uitstekend als je een brief wilt maken, en is Excel uitstekend in grafieken. Voor een eenvoudige tabel kun je ook best uit de voeten met Word, maar gaat het om een adressenbestand van een paar honderd adressen, dan zul je dat niet zo snel in Word doen, maar eerder naar Excel stappen. En gaat het om een adressenbestand voor een vereniging van een paar duizend leden, dan kun je misschien beter overstappen naar Access. Kortom: net zoals een timmerman, grijp je voor je werkzaamheden naar het juiste gereedschap. Soms echter is het handiger om de verschillende pakketten te combineren, en zo het eindresultaat te optimaliseren. Je kunt bijvoorbeeld in Access prima rapporten maken voor facturen, maar het aanpassen van de gegenereerde factuur is nog niet zo eenvoudig. Om te beginnen ligt het Access rapport redelijk vast qua lay-out. Wil je dat veranderen, of wil je tekst toevoegen, dan moet je daar behoorlijk wat werk voor verzetten. Het rapport exporteren naar Word is dan eigenlijk geen optie, omdat de opmaak van geconverteerde rapport doorgaans niet bruikbaar is: je factuur kun je dan eigenlijk van voren af aan opnieuw opmaken. Zou je een factuur in Word maken, dan is het aanpassen veel simpeler, omdat Word nu eenmaal is gebouwd als tekstverwerker. Maar het samenvoegen van de gegevens is dan weer een groot probleem. Je zou dus voor het genereren van de factuur Access willen gebruiken, omdat je dan alle factuurgegevens netjes kunt verzamelen, maar voor het opmaken van de factuur verder willen werken in Word. Gelukkig kan dit in de Office: het proces dat we hierbij gebruiken noemen we automation. Je zult in het proces meestal wel het e.e.a. moeten programmeren, omdat de standaard functionaliteiten van de gebruikte programma s nu eenmaal te kort schiet voor de wat ingewikkelder vormen van samenwerking. In dit hoofdstuk gaan we een rapport maken in Word dat wordt opgebouwd met een Excel Samenvoegbestand dat is gegenereerd door Access. Het Excel bestand komt uit een query die records van een op te geven aantal dagen bevat, en bevat voor elk Word document andere gegevens (op basis van een klant). De documenten die we gaan genereren worden opgeslagen onder de naam van de klant; we moeten die naam dus genereren in het proces. Het gebruikte voorbeeld kan vermoedelijk ook wel op een simpelere manier bereikt worden, maar het gaat er nu om dat de verschillende technieken gedemonstreerd worden; de praktische toepassingen ga je uiteraard zelf verzinnen! De oefening maakt gebruik van een aantal gegevensbronnen: Access: tabel tuitleveren Word: Samenvoegbestand Merge.doc Excel bestand UitleverMerge De tabel in Access wordt automatisch aangemaakt in de procedure, dus die hoef je niet zelf aan te maken. Het Word bestand is een samenvoegbestand dat de gegevens uit het Excel bestand haalt. Beide bestanden moeten dus bestaan, en voor de beste werking zou je het Word bestand al een keer met de hand moeten samenvoegen, zodat je de gegevens op de juiste plaats kunt zetten. Als de koppeling eenmaal bestaat, kan het Excel bestand probleemloos worden overschreven, en dat is dan ook precies wat we gaan doen. Zoals je ondertussen gewend bent, breken we de code weer in hapklare brokken, en bekijken we elk Pagina 1/7

stuk op zijn relevante werking. Allereerst krijgt de functie een naam, en beginnen we met het vastleggen van de variabelen die we gaan gebruiken. Private Function BedrijfMail() Dim aword As Object, oword As Word.Document Dim strpad as String, strmergepad As String, strmergedoc As String Dim rst As ADODB.Recordset Dim qtmp As QueryDef Dim strvp As Variant, temp as Variant Dim strsql as String, sbedrijf As String strpad = CurrentProject.Path & "Dagelijks" uitleveringen strmergepad = CurrentProject.Path & "Merge" voor emailmerge strmergedoc = strmergepad & "Merge.doc" strsql = "Select * From tuitleveren" 'Pad voor 'Document Nu de variabelen zijn gedefinieerd en gevuld, kunnen we aan de slag. De tabel [tuitleveren] bevat de records die we gaan gebruiken voor het Word rapport. Die tabel moet eerst gemaakt worden. We gebruiken een aparte tabel voor de export, en niet een query (wat op zich prima zou kunnen) maar omdat we een samenvoeging gaan maken waarbij de bedrijfsnaam onderdeel is van de rapportnaam, moeten we er zeker van zijn dat de bedrijfsnaam een geldige bestandsnaam gaat opleveren. Een bedrijf als Octa/Foto gaat niet werken, omdat een /-teken niet is toegestaan in een bestandsnaam. We moeten de bedrijfsnamen dus checken, en zonodig aanpassen. Dat wil je uiteraard niet doen in de hoofdtabellen, maar een tijdelijke tabel is daar prima geschikt voor. If WeekDay(date, vbmonday) = 1 Or WeekDay(date, vbmonday) = 2 Then iaantal = 4 Else iaantal = 2 On Error GoTo Stoppen iaantaldagen = InputBox("Hoeveel dagen geleden?", "Contactdatum", iaantal) On Error GoTo 0 DoCmd.Echo False, "Eerst de uitlevertabel maken..." DoCmd.SetWarnings False On Error Resume Next CurrentDb.TableDefs.Delete ("tuitleveren") strsql = "SELECT qwordmerge.* INTO tuitleveren FROM qwordmerge " & vbcrlf _ & "WHERE (CONTACTDATUM = Date()-" & iaantaldagen);" DoCmd.RunSQL strsql DoCmd.SetWarnings True De tabel [tuitleveren] wordt eerst verwijderd; we gaan hem namelijk opnieuw aanmaken. Meestal maak ik een tijdelijke tabel leeg, en vul ik hem met de nieuwe waarden. De reden daarvoor is dat de lay-out van de tabel dan bewaard blijft. In dit geval is dat niet echt nodig, omdat we verder met de tabel weinig doen. Dus vervangen we de tabel. De query qwordmerge is een query die de gegevens ophaalt die we nodig hebben voor de samenvoeging. Hij bevat de volgende velden: Id, pid, bedrijfsnr, bedrijfsnaam, straat, huisnr, huisnr_toev, postcode, plaats, telefoon, bik, bik_omschrijving, kwp, klasse, geslacht, Pagina 2/7

voorletters, tussenvoegsels, achternaam, functie, email, contactdatum, adviseur, afspraakdatum De hoofdtabel wordt gefilterd op basis van een datumfilter. Dat filter (iaantaldagen) kijkt naar de dag van de week; het heeft weinig zin om op Maandag de records van één dag terug te nemen, want op Zondag zal er weinig gewerkt zijn. Dus op Maandag zul je de records van Vrijdag willen leveren. Al de bovenstaande velden vind je straks dus ook terug in de tabel [tuitleveren]. strsql = "Select * From tuitleveren" Set rst = New Recordset rst.open strsql, CurrentProject.Connection, adopenkeyset, adlockoptimistic strvp = rst.getrows De recordset wordt geopend, en ingelezen in de Array variabele strvp. Deze variabele is niet als zodanig gedefinieerd, (dan zou hij er zo uit hebben gezien: Dim strvp() As Variant) maar omdat een variant geen vaste dimensies heeft, kunnen we de variabele vullen met een recordset. Daarbij wordt de matrix ingesteld op het aantal rijen en velden. Opmerking: een recordset kan veel groter zijn dan er in een matrix variabele past. In dat geval wordt de recordset dus niet volledig gebruikt. Controleer dus of de matrix wel goed gevuld wordt! In de procedure kijken we eerst of er records in de recordset zitten, anders heeft de procedure weinig zin. If rst.recordcount > 0 Then strfiletxt = strmergepad & "UitleverMerge.xls" For i = LBound(strVP) To UBound(strVP) sbedrijf = strvp(3, i) GoSub BedrijfCheck strvp(3, i) = Trim(sBedrijf) struitgeleverd = Trim(strVP(3, i)) & " - Afspraken " & Date & ".doc" temp = Dir(strPad & struitgeleverd) De lus gebruikt de array strvp die is gevuld met de recordset. LBound(strVP) geeft het eerste recordnummer aan, en UBound(strVP) het laatste record. Zoals je uit de velden uit de query qwordmerge kunt zien, bevat het vierde veld de bedrijfsnaam strvp(3, i)), en die zetten we voor elke uitlevering in een stringvariabele (struitgeleverd). In de subroutine BedrijfCheck wordt de juiste syntax voor de bedrijfsnaam gecontroleerd. Vervolgens kijken we of het bestand al bestaat of niet. If struitgeleverd <> temp Then strsql = "SELECT * FROM tuitleveren WHERE [ID] =" & strvp(0, i) CurrentDb.QueryDefs.Delete ("quitlevermerge") Set qtmp = CurrentDb.CreateQueryDef("qUitleverMerge", strsql) Voor de query quitlevermerge geldt hetzelfde als voor de tabel tuitleveren: we zouden de SQL ervan kunnen vervangen door de nieuwe SQL. Omdat de query verder niet gebruikt wordt, en om te voorkomen dat er een check moet worden ingebouwd op het aanwezig zijn van de query, gebruiken we de iets bottere methode van het weggooien van de query, en maken we hem elke keer opnieuw aan. On Error Resume Next Pagina 3/7

Kill strfiletxt Err.Clear On Error GoTo 0 DoCmd.TransferSpreadsheet acexport, acspreadsheettypeexcel9, "tuitlevermerge", strmergepad & "UitleverMerge.xls" Met Kill wordt het oude bestand verwijderd, en daarna gebruiken we TransferSpreadsheet om de tabel tuitlevermerge te exporteren naar het bestand UitleverMerge.xls. Dit wordt, zoals je vast nog weet, gebruikt in de Samenvoeging met Word. En wordt steeds opnieuw vervangen. Set aword = CreateObject("Word.Application") Set oword = aword.documents.open(strmergedoc) Vervolgens wordt een Word sessie gestart, en in die sessie wordt het Mergedocument geopend. Dit document is zoals gezegd al helemaal voorbereid op samenvoegen met het Excel bestand, dus we hebben daar verder weinig omkijken naar. Het samenvoegen kunnen we dus gelijk opstarten. On Error Resume Next With oword.mailmerge.destination = wdsendtonewdocument.execute End With Dat doen we met Word commando s zoals MailMerge en wdsendtonewdocument. 'Bestand opslaan struitgeleverd = strpad & Trim(strVP(3, i)) & " - Afspraken " & Date & ".doc" oword.application.activedocument.saveas (strpad & struitgeleverd) oword.application.activedocument.close oword.close (wddonotsavechanges) Set oword = Nothing aword.application.quit End If Next End If En we eindigen de Word sessie met het opslaan van het samengevoegde document. Hier wordt de specifieke bestandsnaam afgeleid van de klantnaam die we hebben gehaald uit de matrixvariabele. Daarna kan het document, en de Word sessie worden gesloten. rst.close Set rst = Nothing Set db = Nothing Set aword = Nothing DoCmd.Echo True On Error Resume Next aword.quit Set aword = Nothing Exit Function '========================================================== Pagina 4/7

Er is nog wel enige tijdwinst te halen als je één Word sessie start, en die open laat staan gedurende het mergen van de verschillende records. Toen ik deze procedure maakte kwam het een enkele keer voor dat er een sessie open bleef staan, en er een tweede sessie bij werd geopend. Met allerlei problemen (dialoogvensters waarop geklikt moet worden) tot gevolg. Voor de zekerheid wordt de Word sessie nu steeds afgesloten, en wordt er steeds een nieuwe geopend. Dat levert een klein beetje tijdverlies op, maar niet overdreven veel, was de ervaring. 'Hieronder staan de subroutine BedrijfCheck die boven in de code worden aangesproken. Deze routine controleert de bedrijfsnaam op ongeldige tekens, en vervangt die door aanhalingstekens. '-------------------------------------------------------------------------- BedrijfCheck: 'routine die controleert of de bedrijfsnaam geschikt is als bestandsnaam. 'Zo niet, dan wordt de Bedrijfsnaam geschoond van niet-toegestane tekens. 'als er een " (=Chr(34)) in de naam voorkomt, vervangen door '(=Chr(39)) If InStr(1, sbedrijf, Chr(34)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(34), Chr(39), 1) 'als er een (=Chr(92)) in de naam voorkomt, vervangen door '-') If InStr(1, sbedrijf, Chr(92)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(92), "-", 1) 'als er een / (=Chr(47)) in de naam voorkomt, vervangen door '-') If InStr(1, sbedrijf, Chr(47)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(47), "-", 1) 'als er een > (=Chr(62)) in de naam voorkomt, vervangen door ') If InStr(1, sbedrijf, Chr(62)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(62), Chr(39), 1) 'als er een < (=Chr(60)) in de naam voorkomt, vervangen door ') If InStr(1, sbedrijf, Chr(60)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(60), Chr(39), 1) 'als er een * (=Chr(42)) in de naam voorkomt, vervangen door ') If InStr(1, sbedrijf, Chr(42)) > 0 Then sbedrijf = Replace(sBedrijf, Pagina 5/7

Chr(42), Chr(39), 1) 'als er een? (=Chr(63)) in de naam voorkomt, vervangen door ') If InStr(1, sbedrijf, Chr(63)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(63), Chr(39), 1) 'als er een (=Chr(124)) in de naam voorkomt, vervangen door ') If InStr(1, sbedrijf, Chr(124)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(124), Chr(39), 1) 'als laatste de eventuele dubbele '' vervangen door ') sbedrijf = Replace(sBedrijf, Chr(39) & Chr(39), Chr(39), 1) 'als er een : (=Chr(58)) in de naam voorkomt, vervangen door '.') If InStr(1, sbedrijf, Chr(58)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(58), ".", 1) 'als er een ; (=Chr(59)) in de naam voorkomt, vervangen door '.') If InStr(1, sbedrijf, Chr(59)) > 0 Then sbedrijf = Replace(sBedrijf, Chr(59), ".", 1) 'en de eventuele dubbele.. vervangen door.) sbedrijf = Replace(sBedrijf, "..", ".", 1) Return '-------------------------------------------------------------------------- TijdLoop: 'Om te voorkomen dat de programmatuur zich verslikt, een kleine pauze van 1 seconde... Start = 0 Start = Timer ' Aanvangstijd instellen. Do While Timer < Start + 1 DoEvents ' Overdragen aan andere processen. Loop Return Pagina 6/7

De subroutine bevat aardig wat regels, maar er zijn ook nogal wat tekens die niet mogen in een bestandsnaam. En als je een bestandsnaam automatisch wilt genereren, dan wil je natuurlijk voorkomen dat de procedure vastloopt omdat er een verkeerde bestandsnaam tussen zit. De laatste subroutine (TijdLoop) kun je gebruiken om een pauze in te bouwen, als de procedure bijvoorbeeld de handelingen te snel achter elkaar uitvoert waardoor een volgende stap niet goed kan worden gestart. Denk bijvoorbeeld aan het exporteren van het Excel bestand, terwijl tegelijkertijd Word al wordt geopend. Je kunt geen bestand vervangen als dat al in een ander pakket is geopend, dus om te voorkomen dat Word te vroeg opstart, zorg je er voor dat het opslaan van het Excel bestand voldoende tijd krijgt. Samenvatting In deze oefening worden verschillende Office bestanden gebruikt om een complex proces te automatiseren. Hierbij wordt vanuit Access een mailmerge in Word uitgevoerd, zonder dat de gebruikers zelf Word hoeft te openen. Andersom kan uiteraard ook: je kunt ook vanuit Word of Excel een automatisering in Access uitvoeren. Maar dat is voor een volgend hoofdstuk. Pagina 7/7