400 likes | 650 Views
VBA Office. Sessie E5 Floris M. Kleijne. Case: Telemarketing-actie. Eén maand, 1.500 telefoontjes Werkdagen en dagelijkse targets in Excel Na elke werkdag: Resultaat bijhouden in Excel Dagrapportage naar projectmanager (Gewijzigde) Targets naar Outlook schrijven.
E N D
VBA Office Sessie E5 Floris M. Kleijne
Case: Telemarketing-actie • Eén maand, 1.500 telefoontjes • Werkdagen en dagelijkse targets in Excel • Na elke werkdag: • Resultaat bijhouden in Excel • Dagrapportage naar projectmanager • (Gewijzigde) Targets naar Outlook schrijven
Bedankt voor uw aandacht! • Floris Kleijne • www.i-teach.nl • www.nationaleofficedag.nl/info_e5.htm
Lijst doorlopen en gebruiken • Begin bij de eerste cel • Handel die regel helemaal af • Ga naar de volgende cel • Herhaal tot lege cel
Lijst doorlopen en gebruiken Do Loop Until Cel.Formula = "" Set Cel = Range("A2") Datum = Cel.Value Tijd = Cel.Offset(0,2).Value Call Verwerk(Datum,Tijd) Set Cel = Cel.Offset(1,0)
Rapportage maken • Voorbereiding: rapportagesjabloon • Word opstarten • Nieuwe rapportage maken • Gegevens in rapportage invullen • Rapportage opslaan
Rapportage maken • Rapportagesjabloon • Tekst en layout van tevoren vastgelegd • Opslaan als *.dot • Bij voorkeur in één v/d Sjabloon-mappen • Lokaties in sjabloon voor gegevens Excel • Markeren met Bladwijzers • Formuliervelden kan ook
Rapportage maken • Word opstarten • Word al opgestart GetObject • Word nog niet opgestart New(runtime error op GetObject!) • Geldt niet voor Outlook, PowerPoint • Zichtbaar of niet? • Zien wat er gebeurt .Visible = True • Performance .Visible = False • Aparte procedure maken!
Rapportage maken • Nieuwe rapportage maken • Set doc = wrd.Documents.Add("<sjabloon>") • Indien in Sjabloon-map pad niet nodig! • Gegevens invullen • Variabelen invullen in Bladwijzers • doc.Bookmarks("Tijd").Range.Text = Tijd • Bladwijzer gaat verloren!
Rapportage maken • Document opslaan • Call doc.SaveAs("Naam.doc") • Wordt zonder waarschuwing overschreven!
Targets naar Outlook schrijven • Outlook starten • Gegevens naar Outlook • Datum, begintijd, eindtijd, onderwerp • Afspraak maken / aanpassen • Bestaat er al een target-afspraak in Outlook? • Zo ja, bestaande aanpassen • Zo nee, nieuwe aanmaken • EntryID bijhouden in Excel!
Targets naar Outlook schrijven • Start Outlook • Altijd maar één instantie van Outlook(al zijn meerdere vensters wel mogelijk) • Daarom geen GetObject nodig • Set olk = New Outlook.ApplicationSet nsp = olk.GetNamespace("MAPI")Set fld = nsp.GetDefaultFolder(…) • Gegevens naar Outlook • NieuwID = SchrijfTargetNaarOutlook(…)
Uit: EntryID = "" ja bestaat afspraak al? target = 0? maak nieuwe afspraak vul gegevens in In: EntryID nee nee Uit: EntryID ja nee target = 0? vind bestaande afspraak verwijder afspraak Uit: EntryID = "" ja Targets naar Outlook schrijven • Gegevens naar Outlook
Targets naar Outlook schrijven • Afspraak maken/aanpassen • Als afspraak nog niet bestaat maken • Als afspraak bestaat aanpassen • Hoe vind ik een afspraak in Outlook?? • Unieke EntryID per item! • .Find of .Restrict op de Items in een Folder • Set itm = fld.Items.Find(filter)Set itms = fld.Items.Restrict(filter) • Maar ja, dat filter…
Targets naar Outlook schrijven • Filter bij Find / Restrict • [Veldnaam] = "Waarde" • Maar… geen wildcards en geen EntryID!! • Bestaand veld misbruiken? • AppointmentItem 95 velden • Design-time beschikbaar 68 • Bruikbaar in Restrict 48 • Datatype String 8 • Niet Read-only 5 (Body, Subject etc.)
Targets naar Outlook schrijven • Filter bij Find / Restrict • [Veldnaam] = "Waarde" • Werkt wel met UserProperties! • Dus hoe vind ik een AppointmentItem? • UserProperty aanmaken op mapniveau • UserProperty toevoegen aan AppointmentItems • filter = "[UserProp] = ""waarde"""Set Afspraak = .Items.Find(filter) • UserProperty: MyEntryID!!!
Targets naar Outlook schrijven Function VindAfspraak(EntryID) As AppointmentItem Dim Afspraak As AppointmentItem filter = "[MyEntryID] = """ & EntryID & """" Set Afspraak = fld.Items.Find(filter) Set VindAfspraak = AfspraakEnd Function
Automatisch werkbalk maken • Werkbalken in Office: CommandBars Set cmb = Application.CommandBars.Add(…) • Belangrijke eigenschappen • Hoe ziet de balk eruit? Position, Visible • Is het de menubalk? Menubar (bij Add) • Tijdelijk Temporary (bij Add)
macro 'MaakBalken' Automatisch werkbalk maken • Knoppen in Office: CommandBarControls Set btn = cmb.Controls.Add(…) • Button, Popup, Combo • Belangrijke eigenschappen: • Hoe ziet knop eruit Caption, FaceID, Style • Wat doet de knop OnAction • Hoe vind ik hem terug? Tag
Automatisch werkbalk maken • Aanmaken bij openen document Private Sub Workbook_Open() • Verwijderen (!) bij sluiten document Private Sub Workbook_BeforeClose(Cancel As Boolean) • Bij verwijderen ook alle knoppen verwijderen • Kunnen zijn verplaatst door gebruiker • Vandaar de Tag! • Application.CommandBars.FindControlApplication.CommandBars.FindControls
Class Modules • Wat? • Class module: definitie van object • "Object-geörienteerd programmeren in VBA" • Waarom? • Makkelijk herbruikbare code (bouwstenen) • Encapsulation / black-box
Class Modules • Ontwerpen • Interface • Functionaliteit • Programmeren • Class module • Gebruiken • Bestaande code veel eenvoudiger
Class Modules • OfficeApplicaties class • Eenvoudig applicaties starten • Access, Excel, Outlook, PowerPoint, Word • Client-code vereenvoudigd: Dim wrd As Word.ApplicationDim oap As OfficeApplicatiesSet oap = New OfficeApplicatiesCall StartApplicatie(AppWord)Set wrd = oap.WordApplicatie
Class Modules • OfficeApplicaties class • Method StartApplicatie(met parameters Zichtbaar, NieuweInstantie) • Method StopApplicatie • Properties voor elke applicatie
Class Modules • OutlookAgenda class • Eenvoudig afspraken beheren vanuit VBA • Zoeken, maken, wijzigen, verwijderen • Gebruik makend van UserProperty • Client-code vereenvoudigd: Dim age As OutlookAgendaSet age = New OutlookAgendaCall age.WijzigAfspraak(EntryID, …)Call age.VerwijderAfspraak(EntryID, …)
Class Modules • OutlookAgenda class • Methods:MaakAfspraak, VerwijderAfspraak, VindAfspraak, WijzigAfspraak • Properties OutlookApplicatie en Selectieveld
Bladwijzers behouden • Bladwijzers in sjabloon voor invoegen gegevens • Bladwijzers gaan verloren na invullen gegevens • Soms wenselijk om bladwijzers te behouden • Bijv. als meermalen gegevens ingevoegd
Bladwijzers behouden • Eenmalige actie:Rpt.Bookmarks("Datum").Range.Text = "6-3-08" • Bladwijzer behouden:Set bmk = Rpt.Bookmarks("Datum")Set rng = bmk.Rangerng.Text = "6-3-08"Rpt.Bookmarks.Add "Datum", rng
Rapport automatisch e-mailen • Geen methode voor binnen Word • Outlook aanspreken • E-mail aanmakenSet eml = olk.CreateItem(olMailItem) • Attachment bijvoegeneml.Attachments.Add Rapport.FullName