Grunnkurs   
 

Opp

 

 

 

 

 

 

 

 

 

Anbefalte artikler om VBA

 

Av Willy Verwoerd | Publisert 04.09 2004 kl. 09:04

I serien Office-eksperten i PC World Norge ser vi på mange forskjellige teknikker for å bruke Office-programmene på en mer avansert måte. Likevel skiller Visual Basic for Applications seg ut som det sentrale verktøyet som alle Office-eksperter må være fortrolig med. Les vår artikkelsamling.

Våre artikler om Visual Basic for Applications (VBA) er etter hvert blitt et godt grunnlag for å komme i gang med dette kraftige verktøyet. Vi har derfor laget en oversikt over hvilke artikler du bør lese, og i hvilken rekkefølge.

 

Hvis du virkelig ønsker å lære deg VBA, er det viktig at du tar deg tid til å arbeide med oppgavene i artiklene. Mange artikler har tilhørende maler, programkode eller eksempler som du kan laste ned fra Filguiden her på www.pcworld.no, men vårt generelle råd er at du bare bruker denne muligheten hvis du står helt fast med noe. Hvis du ønsker å lære mest mulig, er det viktig at du utfører alle oppgavene selv, inkludert konstruksjon av dialogbokser og innskriving av programkode.

 

Nedenfor finner du en kort omtale av de aktuelle artiklene. Med unntak av artikler som ikke er publisert på web ennå, kan du klikke på titlene for å lese de enkelte artiklene.

 

Bli kjent med makroer

I denne artikkelen tar vi de aller første skrittene mot Visual Basic for Applications ved å lære deg hvordan du registrerer makroer. Makroer (som ikke er annet enn VBA-programmer) kan både registreres og skrives, og ofte kan det være nyttig å kombinere de to teknikkene.

(publisert i PC World Norge nummer 7/2003)

 

Bak spakene i Office

Denne artikkelen handler ikke om VBA, men er likevel viktig: Her lærer du hvordan du kan betjene dine makroer fra menyer, verktøyknapper og hurtigtaster.

(publisert i PC World Norge nummer 8/2003)

 

Dialoger på boks, del 1 av 2

I Office trenger du ikke nøye deg med hva Microsoft har laget, du kan programmere videre selv: Med makroer og egne brukergrensesnitt, kan du utvide programmene etter behov. I denne artikkelen lærer du alle grunnleggende teknikker for å konstruere dine egne dialogbokser.

(publisert i PC World Norge nummer 13/2003)

 

Dialoger på boks, del 2 av 2

Mens vi i forrige artikkel laget karosseriet til en dialogboks, skal vi i del 2 sette inn motoren. Her lager vi programkoden som får dialogboksen til å gjøre det vi ønsker.

(publisert i PC World Norge nummer 14/2003)

 

Dialogbokser i Excel

Teknikkene for å arbeide med dialogbokser og VBA har store fellestrekk i Office, men selvfølgelig har de forskjellige programmene likevel helt forskjellige arbeidsområder. De to første artiklene om dialogbokser brukte Word som eksempel. I denne artikkelen ser vi på hvordan du kan bruke dialogbokser i Excel for sikrere og enklere registrering av data.

(publisert i PC World Norge nummer 2/2004)

 

Bedre Office-samarbeid med VBA

Visual Basic for Applications er ikke bare et kraftig verktøy for å forbedre hvert enkelt Office-program, men du kan også bruke det for å få i gang et godt samarbeid mellom programmene. I denne artikkelen ser vi på hvordan du kan lage en funksjon som mangler i Outlook og få Word til å ta seg av presentasjon og utskrift.

(publisert i PC World Norge nummer 4/2004)

 

Mer om dialogbokser

Mens vi tidligere har gjennomgått bruken av grunnleggende kontroller som tekstbokser og kommandoknapper, ser vi nå på kombinasjonsbokser, radioknapper og avkrysningsbokser. Resultatet blir et verktøy som vil være nyttig for mange Word-brukere.

(publisert i PC World Norge nummer 5/2004)

 

En omvisning i VBA

Gjennom flere artikler har vi lært deg hvordan du kan bruke dialogbokser og VBA til forskjellige nyttige formål. Denne gangen ser vi nærmere på selve utviklingsmiljøet i VBA, som har mange funksjoner som kan lette arbeidet ditt, ikke minst med tanke på feilsøking.

(publisert i PC World Norge nummer 6/2004)

 

Følg begivenhetene i Outlook

Både i Outlook selv og i alle objektene og elementene den tar hånd om, foregår det mange hendelser som du kan fange opp og utnytte med egen programkode. Denne artikkelen går teknisk sett mer i dybden enn tidligere artikler, men vi hjelper deg over terskelen med et eksempel. Du kan dessuten bruke det du lærer i de andre Office-programmene.

(publisert i PC World Norge nummer 8/2004)

 

Bedre eksport fra Excel

Pussig nok har Excel – av alle programmer – ingen funksjon for å eksportere data som ekte, komma-delte tekstfiler. Vi presenterer derfor en makro som gjør denne jobben på en elegant måte. Samtidig lærer du deg flere nyttige programmeringsteknikker.

(publisert i PC World Norge nummer 10/2004)

 

Klar for sending?

Reglene i Outlook gir omfattende muligheter for automatisk håndtering av e-posten din, men de har også sine klare begrensninger. Det gjelder spesielt ved sending av meldinger, men tar du i bruk Visual Basic for Applications til dette, åpner det seg en ny verden. Vi lager en VBA-rutine som sjekker utgående meldinger og hindrer deg i å begå pinlige e-posttabber.

(publisert i PC World Norge nummer 12/2004)

 

Lag fakturaen med Word, del 1 av 2

I to deler ser vi på hvordan du kan bruke Word for å fylle ut, beregne og skrive ut profesjonelle fakturaer. Underveis i prosjektet lærer du teknikker som du kan bruke på mange andre områder også.

(publisert i PC World Norge nummer 13/2004)

 

Lag fakturaen med Word, del 2 av 2

Word er godt egnet til å produsere profesjonelle fakturaer, og vi kom langt på vei med vår fakturamal i første del av artikkelen. Nå skal vi fullføre prosjektet og lære deg enda flere nyttige Word-teknikker underveis.

(publisert i PC World Norge nummer 14/2004)

 

(Merk at listen ovenfor kan inneholde artikler som ikke er publisert på web ennå. Det skyldes at det er en forsinkelse mellom publisering i bladet og på web. Som abonnent på bladet, får du stoffet alltid tidligst mulig.)

 

 

 

Bli kjent med makroer

 

Av Willy Verwoerd | Publisert 12.11 2003 kl. 14:44

Utviklingen av Office stopper ikke når esken forlater Microsoft: Siden Office har et komplett innebygd programmeringsspråk, kan du programmere videre selv, noe som gir store muligheter for tilpasninger og utvidelser. Vi hjelper deg å ta de første skrittene.

Fra gammelt av blir programmer i Office kalt makroer, men makroer er egentlig ganske primitive hjelpemidler. I Office har du allerede gjennom flere versjoner kunnet lage fullverdige programmer, spesielt etter at utviklingsmiljøet Visual Basic for Applications (VBA til daglig) ble tatt i bruk fra og med Office 97.

Programmering av Office er nyttig til alt fra små, kjappe tilpasninger av eksisterende funksjoner til full programmering av dine egne, nye funksjoner. Hvis du f.eks. savner et bestemt verktøy eller en funksjon i Excel, kan du i prinsippet lage den selv.

I prinsippet kan du også utføre all rørlegging i huset ditt selv, men det er viktig å være oppmerksom på at både rørlegging og programmering er respektable håndverk som krever kunnskap og erfaringer. Men selv om avansert programmering i Office krever en hel del læring, er det ingen høy terskel for å komme i gang. Den terskelen hjelper vi deg over i denne artikkelen.

To metoder

Det finnes to grunnleggende metoder for å opprette en makro i Office: Du kan registrere (spille inn) en makro, eller du kan skrive (programmere) den manuelt. Uansett innfallsvinkel, blir det opprettet et navngitt program som består av programlinjer skrevet i programmeringsspråket Visual Basic. Navnet på programmet (altså makroen) bestemmer du selv.

Registrering av makroer er bare mulig i Word, Excel og PowerPoint. I Outlook og Access må du skrive makroene selv, men Access har et Byggeverktøy som lar deg konstruere Access-makroer (som ikke er det samme som VBA-makroer). I denne omgangen tar vi eksemplene i Word, men utforsk gjerne de tilsvarende verktøyene i Excel og PowerPoint også – du vil finne mange likhetstrekk.

Registrere en makro

Som eksempel skal vi bruke en enkel, men relevant problemstilling: Når du arbeider med Word-dokumenter som inneholder bilder, kan det være nyttig å få Word til å vise bare plassholdere istedenfor selve bildene. Word angir da bildets størrelse og plassering, men viser ikke selve bildet. Redigeringen går da atskillig raskere, og du kan gå tilbake til full bildevisning for den siste kontrollen av dokumentet.

Når du arbeider med slike dokumenter, er det kjekt om du på en enkel måte kan slå av og på visning av plassholdere. Normalt er det en nokså tungvint operasjon, som må utføres med menykommandoen Verktøy/Alternativer og valget Plassholdere for bilde på skillearket Vis. For å unngå dette, kan du enkelt registrere en makro som gjør jobben:

Velg Verktøy/Makro/Registrer ny makro fra menyen. Du får nå opp dialogen som er vist i figur 1. Gi makroen navnet PlassholderePå og klikk OK.

 

 

Figur 1. Registrering av en ny makro.

Nå vises verktøylinjen Stopp registrering med to knapper: Den venstre knappen avslutter registreringen, mens den høyre gir en pause i registreringen, noe som er nyttig hvis enkelte operasjoner ikke skal være med i makroen.

Bruk nå menykommandoen for å vise plassholdere (se ovenfor, pass på at valget Plassholdere for bilde er aktivert), og klikk OK for å lukke vinduet. Klikk deretter på knappen for å stoppe makroregistrering, og du er ferdig med å registrere din første makro!

For å bruke makroen, kan du velge Verktøy/Makro/Makroer fra menyen eller taste Alt-F8. Deretter velger du navnet på ønsket makro (for øyeblikket finnes bare den du nettopp laget) og klikker Kjør for å utføre den – eller du kan dobbelklikke på navnet.

Hvis du synes dette er omtrent like tungvint som å velge funksjonen direkte fra menyen, har du helt rett. Denne måten å starte makroer på kan passe for makroer du bruker sjeldent, men er dårlig egnet for funksjoner du trenger ofte. Da vil du normalt tilordne makroen til en verktøyknapp eller hurtigtast. Som du ser i figur 1, finnes det to knapper for dette som du kan bruke samtidig som du oppretter makroen. Vi kommer tilbake til dette i neste nummer.

På helt tilsvarende måte som beskrevet her, kan du nå lage en makro for å slå av plassholdere, som du kan kalle PlassholdereAv.

Skrive en makro

Du har nå registrert to makroer, én for å slå på plassholdere og én for å slå dem av. Denne løsningen har imidlertid to ulemper: For det første må du bruke to verktøy for noe som egentlig er en av/på-funksjon (vanligvis forventer du å slå lyset av og på med samme bryter, ikke med to forskjellige brytere).

Og viktigere: Når makroen registreres, blir alle innstillingene fra skillearket Vis registrert. Hvis du senere endrer en av de andre innstillingene, vil kjøring av makroen føre til at de blir stilt tilbake slik de var da du registrerte makroen.

Det vi egentlig ønsker oss er en bryter som slår plassholdere på hvis de er slått av, og av hvis de er på. Det kan vi løse ved å skrive makroen selv. Siden vi ikke kan lære deg makroprogrammering her og nå, må vi nøye oss med å vise hvordan du legger inn programkoden til en makro. Dette er det bl.a. nyttig å kjenne til når du kommer over makroer i vår brukertipsspalte eller andre steder. Slik gjør du:

Velg Verktøy/Makro/Makroer fra menyen eller tast Alt-F8. I feltet Makronavn skriver du inn navnet Plassholdere, som vist i figur 2. Klikk deretter på Opprett.

Figur 2. Slik oppretter du en ny makro som du skal skrive selv.

 

Nå kommer du inn i en ny verden, nemlig Visual Basic. Her møter du et brukergrensesnitt som ved første blikk kan virke overveldende, men vi skal i denne omgang bare benytte oss av en bitteliten del av det.

Alle makroer starter med ordet Sub og navnet på makroen, og slutter med linjen End Sub. Disse to linjene, samt noen kommentarlinjer, er forhåndsutfylt når du skriver en ny makro i Visual Basic.

Neste skritt er å skrive inn de tre programlinjene som starter med With og slutter med End With, som vist i figur 3. Mens du skriver, vil du oppdage at Visual Basic gir deg god hjelp med setningene: Ofte dukker det opp menyer der du kan velge ønsket funksjon og taste Tab for å få Visual Basic til å fullføre valget.

 

Figur 3. Programkode for makro som slår av og på plassholdere i Word. (Klikk for større bilde)


Når du har sjekket nøye at makroen er skrevet korrekt, kan du lagre den ved å klikke på diskettknappen på verktøylinjen (eller File/Save Normal fra menyen) og lukke Visual Basic. Ved lagring vil Visual Basic også sjekke at makroen ikke inneholder ulovlig programkode og utheve eventuelle feil.

Lag et dokument med minst ett bilde, og prøvekjør makroen. Hvis du har lagt inn makroen korrekt, vil Word nå veksle mellom plassholdere og bilde hver gang du kjører makroen.

Kort fortalt fungerer denne makroen slik: Kommandoen With angir at makroen skal arbeide med det aktive Word-vinduet (ActiveWindow) og med innstillingene Vis (View). Deretter brukes ordet Not for å gi valget Plassholdere for bilde (ShowPicturePlaceHolders) motsatt innstilling av hva det hadde fra før: Hvis valget var slått på, blir det slått av – og motsatt.

Som du ser, foregår alt i Visual Basic på engelsk. Det er en stor fordel fordi makroer da kan brukes på tvers av lokale Word-versjoner. Finner du f.eks. en interessant makro i et utenlandsk blad eller nettsted, kan du gjerne bruke den i norsk Word.

Enten du registrerer makroer eller skriver dem selv, blir de vanligvis lagret i malen Normal. Det er et godt hjem for makroer som kan brukes i alle slags dokumenter, mens makroer som bare brukes i en bestemt mal bør lagres i den samme malen.

I pose og sekk

Vi har ovenfor beskrevet hvordan du kan lage makroer ved å registrere eller skrive dem, men det ene utelukker på ingen måte det andre. De to metodene kan gjerne kombineres, og det er ofte en god løsning.

Du kan f.eks. starte med å registrere en makro, og så tilpasse programkoden som blir produsert ved å slette, tilføye eller endre programlinjer manuelt. Også når du skriver en makro fra bunnen av, kan det være nyttig å bruke registrering for å løse deler av oppgaven. Det kan spare deg for mye skriving, og sikrer dessuten at programkoden blir korrekt.

Registrering av makroer og påfølgende studier av programkoden er dessuten et flott hjelpemiddel for å lære mer om hvordan Visual Basic fungerer. Ta f.eks. gjerne en titt på programkoden for de to første makroene du registrerte.

Visual Basic har også en omfattende hjelptekst, og vi kan anbefale temaet Visual Basic Conceptual Topics, som gjennomgår alle vesentlige sider av programmering i Visual Basic. Det finnes også mange gode lærebøker om dette.

Neste gang skal vi se nærmere på hvordan du kan bruke makroer enklest mulig ved å tilknytte dem til verktøyknapper, hurtigtaster og menyvalg.

Løsningene i denne artikkelen er utviklet og testet i Office 2000.


Bak spakene i Office

 

Av Willy Verwoerd | Publisert 12.11 2003 kl. 15:01

Office-programmene har et rikt utvalg av funksjoner og verktøy, og disse kan betjenes fra menyer, verktøyknapper og hurtigtaster. Det gjelder ikke bare innebygde funksjoner, men også makroer du lager selv. Vi lærer deg hvordan du setter opp kontroll­spakene for dine makroer.

I forrige Office-eksperten (se artikkelen Bli kjent med makroer), hjalp vi deg å ta de første skrittene med Office-makroer. Har du muligheten til det, er det nyttig å lese den forrige artikkelen først.

Makroer er programmer som er skrevet i programmeringsspråket til Office, Visual Basic for Applications. Hvis du lærer deg Visual Basic, kan du skrive dine egne makroer i alle Office-programmene. I Word, Excel og PowerPoint kan du dessuten registrere (spille inn) makroer, noe som ikke krever kunnskaper om programmering.

Uansett hvordan makroen ble til, har du sannsynligvis laget den for å forenkle en arbeidsoppgave. Da holder det ikke at selve makroen er glitrende, den må også være enkel å betjene. Noen makroer brukes sjeldent, og da kan det være greit nok å starte dem manuelt fra makrovinduet (menyvalget Verktøy/Makro/Makroer eller hurtigtast Alt-F8). Du bør imidlertid ha langt enklere tilgang til makroer du bruker regelmessig.

Hvilken spak?

Alle funksjoner i Office – inkludert dine egne makroer – kan betjenes fra menyer, med verktøyknapper eller med hurtigtaster. Hvilken metode du velger, kommer kanskje mest an på hvordan du liker å arbeide i Office, men brukshyppigheten kan også være en innfallsvinkel:

Skal du bruke makroen ofte, er en hurtigtast gjerne best. Du kan bruke hurtigtaster uten å flytte hendene fra tastaturet, og siden funksjonen benyttes hyppig, husker du tasten.

For makroer du ikke bruker fullt så ofte, kan en verktøyknapp være bra, mens makroer som brukes sjeldnere, kan legges inn på en passende meny. (Og hvis du virkelig vil bygge ut cockpiten din, er det ingenting i veien for å bruke alle tre metodene til samme makro!)

I forrige nummer laget vi en enkel Word-makro for å slå av og på visning av plassholdere. Det er nyttig når du arbeider med dokumenter som inneholder en del bilder: Istedenfor å vise bildene, kan Word nøye seg med å vise bare plassering og størrelse, en såkalt plassholder. Dokumentet blir da lettere og raskere å arbeide med, og ved hjelp av makroen kan du enkelt skifte mellom plassholdere og vanlig bildevisning.

Nå skal vi se nærmere på de tre metodene for å betjene makroen.

Hurtige taster

Når du registrerer en ny makro i Word, Excel eller PowerPoint, kan du samtidig tilordne makroen til en verktøyknapp eller en hurtigtast. Skriver du makroen fra bunnen av, må du utføre tilordningen i etterkant. Det er denne metoden vi beskriver her, med Word som eksempel.

Enten du skal arbeide med tilpasning av hurtigtaster, verktøyknapper eller menyer, skjer det alltid gjennom menyvalget Verktøy/Tilpass. Dette er vår felles inngangsdør for teknikkene i denne artikkelen. Når du velger denne kommandoen, får du opp vinduet som er vist i figur 3.

Klikk på knappen Tastatur for å få opp vinduet Tilpass tastatur, som er vist i figur 1. Neste oppgave er å finne frem makroen vår: Bla deg nedover i listen Kategorier til venstre, og merk valget Makroer ved å klikke på det. Listen til høyre viser da hvilke makroer som finnes. Klikk på makroen for å merke den, og klikk deretter i feltet Trykk ny hurtigtast.

 

Figur 1. Tilordning og vedlikehold av hurtigtaster skjer fra dette vinduet. (Klikk for større bilde)
 

Nå er det klart for å bestemme hurtigtasten, og det gjør du ganske enkelt ved å trykke den. I eksemplet har vi valgt Alt-P som hurtigtast, da bokstaven P minner om Plassholdere. Klikk på knappen Tilordne for å utføre selve tilordningen, og deretter Lukk for å lukke vinduet.

Hvis tasten du ønsker å bruke allerede er tilordnet en annen funksjon, får du beskjed om dette. I vårt tilfelle ville f.eks. Ctrl-P vært et dårlig valg, siden den brukes til utskrifter. Du kan gjerne tilordne flere hurtigtaster til samme makro eller funksjon. I listen Gjeldende taster kan du se alle tilordnede taster, og du kan fjerne én eller alle tilordningene med knappene for dette.

Tips: I brukertipsseksjonen i dette nummeret, finner du en Word-makro som lager en liste over alle hurtigtaster som er definert av brukeren. Kjekt å ha når du ønsker en oversikt over hurtigtastene du har laget!

Verktøy på veggen

Verktøylinjene i Office er som et godt organisert verksted, der hvert verktøy har sin faste plass på veggen og er lett å finne når du trenger det. Verktøylinjene kan fritt tilpasses av brukeren. Du kan bestemme hvilke verktøylinjer som skal vises, fjerne og tilføye knapper og opprette egne verktøylinjer og helt nye knapper. I denne omgangen skal vi se på hvordan du oppretter en verktøyknapp til vår makro .

Velg Verktøy/Tilpass fra menyen for å få opp vinduet i figur 3. Bla deg frem til Makroer i listen til venstre. I listen til høyre vises nå makroene som er definert.

Klikk på makroen og hold mustasten nede. Nå kan du dra makroen til ønsket sted på en synlig verktøylinje og deretter slippe mustasten.

Hvis du vil ha den nye knappen din på en verktøylinje som ikke vises, må du først gjøre den synlig fra skillearket Verktøylinjer eller ved å høyreklikke på en verktøylinje og aktivere ønsket verktøylinje fra listen som vises. Fra skillearket Verktøylinjer, kan du også opprette en helt ny verktøylinje.

Når du har sluppet makroen i ønsket posisjon på verktøylinjen, får du i første omgang en tekstknapp med makroens fulle navn. Det er ikke spesielt elegant, og sannsynligvis vil du heller ha et vanlig knappesymbol som på de andre knappene. Det ordner du slik:

Pass på at vinduet Tilpass fremdeles er åpent – det må det alltid være når du arbeider med tilpasninger. Høyreklikk på den nye tekstknappen og velg Bytt knappesymbol fra menyen. Du får nå opp et utvalg forhåndsdefinerte symboler som vist i figur 2. Her finnes det faktisk et rammesymbol som passer fint for en makro som arbeider med plassholdere – klikk på dette.

Knappen har nå fått rammesymbolet vi valgte, men den omstendelige teksten er fremdeles der også. For å bli kvitt teksten, høyreklikker du (om nødvendig) igjen på knappen og velger Standardstil fra menyen. Nå er den nye knappen din ferdig, og du kan lukke Tilpass-vinduet.

Hvis du synes det forhåndsdefinerte utvalget av knappesymboler er litt for snevert, er det ikke noe problem. Du står nemlig svært fritt til å lage dine egne symboler, og det finnes til og med et lite tegneverktøy til formålet:

Fra menyen som du ser i figur 2, kan du velge Rediger knappesymbol for å tegne dine egne knapper. Fra den samme menyen kan du også kopiere og lime inn symboler fra alle eksisterende knapper. Vi har ikke plass til å gå i detaljer på dette, men du blir raskt fortrolig med mulighetene ved å eksperimentere litt på egenhånd.

 

Figur 2. Office byr på en rekke forhåndsdefinerte knappesymboler, men du står også fritt til å tegne dine egne symboler.
 

Du bestemmer menyen

I Office trenger du ikke å nøye deg med hva Microsoft har satt på menyen – her kan du fritt tilføye og fjerne menyvalg, og til og med lage dine egne menyer. I den siste av våre tre betjeningsteknikker, skal vi lage et menyvalg for å kjøre makroen vår:

Som vanlig starter du med kommandoen Verktøy/Tilpass, og får igjen opp skjermbildet i figur 3. Bla deg frem til Makroer i listen til venstre. Klikk på makroen i listen til høyre, og hold mustasten nede.

 

Figur 3. Tilpass-vinduet er det sentrale verktøyet for alt arbeid med taster, knapper og menyer.
 

Så langt har du gjort nøyaktig det samme som da vi laget en verktøyknapp i forrige avsnitt. Men istedenfor å dra makroen til en verktøylinje, skal du nå dra den til en meny. Siden makroen styrer visningen av plassholdere, er Vis-menyen et ypperlig valg. Dra makroen til denne menyen, som åpner seg når du kommer dit. Deretter kan du slippe makroen i ønsket posisjon på menyen.

Også det nye menyvalget inneholder i første omgang makroens komplette navn, men dette tilpasser du på tilsvarende måte som verktøyknapper: Høyreklikk på det nye menyvalget, og klikk i feltet Navn. Du kan nå bevege markøren frem og tilbake i feltet med piltastene og slette overflødig tekst, slik at bare teksten står igjen. Tast Enter for å avslutte redigeringen.

Om du ønsker det, kan du gjerne tilføye rammesymbolet vi brukte til verktøyknappen. Det gjør du på samme måte som tidligere med valget Bytt knappesymbol. Symbolet vil da også vises i menyen. Når du er ferdig med dine tilpasninger, taster du Esc for å gå ut av menyen, og deretter kan du lukke Tilpass-vinduet.

Til slutt vil vi understreke at makroen vi har brukt som eksempel i de siste to artiklene, er svært enkel. Alt du kan gjøre med den er å kjøre den, og vi har ovenfor beskrevet tre forskjellige brukergrensesnitt som kan brukes for å kjøre en makro.

Du er imidlertid på ingen måte begrenset til disse tre teknikkene. En mer kompleks makro kan nemlig gjerne ha sitt eget Windows-brukergrensesnitt med utfyllingsfelt, knapper, lister osv. Det kommer vi tilbake til i senere artikler.


Løsningene i denne artikkelen er utviklet og testet i Office 2000.


Dialoger på boks, del 1

 

Av Willy Verwoerd | Publisert 10.12 2003 kl. 16:50

I Office trenger du ikke å nøye deg med hva Microsoft har laget til deg – du kan programmere videre selv: Med makroer og egne brukergrensesnitt kan du utvide programmene etter behov. I to deler lærer vi deg hvordan du lager og bruker dialogbokser.

Tidligere i høst startet vi i Office-eksperten arbeidet med å lage en Word-mal for ditt eget brevpapir. Malen inneholdt alle elementer i et brevark, men plasseringen av mottakernavn, adresse og emnelinje var i første omgang bare markert med vanlig tekst.

I neste utgave (Fyll ut med felt) forbedret vi malen ved å legge inn utfyllingsfelt. Når et dokument inneholder utfyllingsfelt, vil Word selv spørre etter informasjonen og legge den på riktig plass i dokumentet.

Dette var et klart fremskritt, men fortsatt litt tungvint, siden vi måtte innom seks utfyllingsfelt for å få registrert den nødvendige informasjonen. Det ville være mer elegant om alt var samlet på ett sted, med gode redigeringsmuligheter. Det som manglet var et godt brukergrensesnitt, og det skal vi kaste oss over nå.

Dialogbokser overalt

Når du bruker Windows-programmer, er du hele tiden innom små og store vinduer som representerer programmenes brukergrensesnitt. Ofte bruker du slike vinduer i en dialog med programmet for å legge inn informasjon eller endre innstillinger.

Slike vinduer kalles dialogbokser, og i Office kan du lage dem selv også. Dialogbokser består av et grafisk brukergrensesnitt og programrutiner (makroer) som får dem til å gjøre det du ønsker.

Selv om du ikke har programmeringserfaring fra før, er det fullt mulig å komme i gang med dialogbokser på en god måte. Vi må imidlertid innom en god del stoff, og bruker derfor to utgaver på dette: Først ser vi på hvordan du lager selve dialogboksen, mens vi i neste nummer skal programmere den.

Selv om vi bruker et konkret eksempel, er teknikkene svært generelle. Du vil derfor ha stor nytte av stoffet selv om du ikke er interessert i å lage ditt eget brevpapir.

Alt på ett sted

Oppgaven vår er å konstruere dialogboksen i figur 1. Her har vi samlet alle opplysningene som brukes i et brev på ett sted: Rammen Navn og adresse inneholder fem felt for mottakerens navn og adresse, mens brevets emnelinje har fått et eget felt for seg selv. Dialogen har dessuten to knapper: Når du klikker OK skal opplysningene settes inn på rett plass i brevet, klikker du Avbryt skal dialogboksen (og utfyllingen) avbrytes.

 

Figur 1. Arbeidstegning: Denne dialogboksen skal vi etter hvert bruke i vår brevmal.
 

Det er en fordel om du bruker vår første brevmal som utgangspunkt (altså ikke den med utfyllingsfelt). Du finner denne malen her. Du kan også gjerne bruke en mal du har laget selv, og det er heller ikke noe problem å starte med et tomt dokument. Pass da på å lagre dette som mal.

Det innebygde programmeringsverktøyet i Office heter Visual Basic for Applications (VBA). Når du har malen din klar, kan du velge Verktøy/Makroer/Visual Basic Editor fra menyen i Word for å aktivere VBA. Det er imidlertid langt raskere å taste Alt-F11, og du kan bruke den samme tasten for å hoppe frem og tilbake mellom malen og VBA.

Her vil du etter hvert møte flere vinduer og verktøy, men du skal starte med å sette inn en ny dialogboks i form av et vindu (eng. form). Det gjør du ved å velge Insert/User­Form fra menyen i VBA. Prosjektvinduet vil da se ut omtrent som i figur 2 (velg View/Project Explorer hvis du ikke ser det).

 

Figur 2. Prosjektvinduet i Visual Basic for Applications.
 

Dobbelklikk på UserForm1 i Project-vinduet. Du får nå opp en tom dialogboks som bare består av et tittelfelt øverst og ellers en tom flate. Du kan gjøre vinduet større ved å dra i nedre høyre hjørne. Sett gjerne av god plass til å begynne med, så kan du finjustere størrelsen til slutt.

Verktøykassen

Arbeidet med å utvikle dialogbokser består alltid av tre trinn:

1. Legge inn (tegne) alle objekter som representerer brukergrensesnittet. Eksempler er ledetekster, tekstbokser og kommandoknapper. Slike objekter kalles gjerne kontroller (eng. controls).

2. Definere egenskaper (eng. properties) for kontrollene.

3. Skrive programkode (Visual Basic-rutiner) som bestemmer hva dialogboksen skal gjøre og hvordan den skal takle forskjellige hendelser.

I denne artikkelen skal vi gjennomgå de to første oppgavene, mens vi tar for oss den tredje oppgaven i neste artikkel.

For å arbeide med den nye dialogboksen, må du klikke på den. Normalt vil du da se en verktøykasse kalt Toolbox, som vist i figur 3. Skulle den ikke være der, velger du View/Toolbox fra menyen.

 

Figur 3. Verktøykassen og de fire kontrollene vi bruker.
 

Etter at du har valgt riktig kontroll i Toolbox, kan du bruke forskjellige teknikker for å plassere den i dialogboksen:

Du kan flytte muspekeren til dialogen og klikke for å legge inn kontrollen, eller du kan tegne den opp selv ved å holde mustasten nede. Du kan også dra kontrollen fra Toolbox for å sette inn et eksemplar. Når kontrollen er på plass, kan du justere posisjon og størrelse, samt en rekke andre egenskaper.

Til vårt prosjekt trenger vi fire forskjellige kontroller: en ramme, seks ledetekster, seks tekstbokser og to kommandoknapper (se figur 3).

Bruk figur 1 som din arbeidstegning og start med å legge inn en ramme som er stor nok til de fem ledetekstene og tekstboksene. Pass på at rammen er merket, og legg inn de fem ledetekstene og tekstboksene inne i rammen. Ikke bry deg om feil ledetekster (Label1 osv.) og andre mangler, det kommer vi tilbake til.

Når du er ferdig med rammen og innholdet, klikker du nedenfor rammen slik at den ikke lenger er merket. Legg deretter inn ledeteksten og tekstboksen for emnelinjen, og til slutt de to kommandoknappene nederst. Også kommando­knappene har foreløpig bare standardtekster.

Tips og triks

Enkelt, hva? Når vi skriver det slik, virker det som jobben er gjort på et blunk, men i virkeligheten vil du trenge en del tid til å bli fortrolig med teknikkene.

Bruk derfor god tid på å eksperimentere og bli kjent med innlegging og justering av kontroller. Går det galt, er det bare å slette og prøve på nytt. Det finnes dessuten en rekke hjelpemidler for å forenkle arbeidet med kontroller:

For det første kan du kopiere og lime inn kontroller: Når du har lagt inn den første tekstboksen og er fornøyd med størrelsen, kan du (når den er merket) kopiere den på vanlig måte, for eksempel ved å taste Ctrl-C.

Deretter produserer du kjapt de neste fire tekstboksene innenfor rammen ved for eksempel å taste Ctrl-V fire ganger, og så dra de nye tekstboksene til riktig plass. Den siste tekstboksen skal være utenfor rammen. Klikk derfor utenfor rammen før du limer inn det siste eksemplaret.

Et annet viktig hjelpemiddel er rutenettet. Med menyvalget Tools/Options og skillearket General, kan du angi om rutenettet skal vises, hvor tett det skal være og om kontroller skal justeres mot punktene i rutenettet. Rutenettet er bra for å lage ryddige dialogbokser, men kan også være i veien for finere justeringer. Prøv deg frem.

I Format-menyen finner du et helt knippe med nyttige funksjoner for å justere merkede kontroller på forskjellige måter. Eksempler er Align, Make Same Size, Horizontal Spacing og Vertical Spacing. Når du for eksempel har plassert de fem tekstboksene i rammen noenlunde på riktig plass, kan du kjapt justere alle mot venstre ved å merke dem og velge Format/Align/Lefts.

Du kan merke kontroller med vanlige Windows-teknikker, men i VBA er det ofte enda enklere å lage et merkeområde med musen: For å merke en kontroll, klikker du på den. For å merke flere, trekker du opp et merkeområde ved å holde mustasten nede. Det holder at merkeområdet berører kontrollene du vil merke – det er ikke nødvendig at de er innenfor.

I Windows-programmer forventer brukerne at de kan flytte markøren fra felt til felt ved å taste Tab (tabulatortasten). Derfor er det viktig at tabulatorrekkefølgen i en dialogboks er korrekt. Det vil si at markøren ikke flytter seg i hytt og pine, men starter i det første feltet og deretter går videre til de neste i riktig rekkefølge.

Menyvalget View/Tab Order er et kjekt verktøy for å ordne dette (se figur 4). Du får da opp en liste over kontrollene du har laget, og kan enkelt arrangere dem i riktig rekkefølge istedenfor å gjøre dette manuelt med egenskapen Tab­Index.

 

Figur 4. Tab Order er nyttig for å sikre tabulatorrekkefølgen.
 

Denne jobben bør gjøres i slutten av designprosessen, og spesielt bør du vente med dette til du har gitt navn til kontrollene dine (se neste avsnitt). Merk også at kontroller innenfor rammer behandles for seg, og at du derfor må klikke utenfor rammen for å arrangere de øvrige kontrollene.

Viktig med gode egenskaper

Nå som vi er ferdig med tegnejobben, kommer fase 2, der vi skal definere kontrollenes egenskaper (eng. properties). For å kunne arbeide med egenskaper, må Properties-vinduet være synlig. Det ordner du med View/Properties. Du kan også taste F4 for å slå vinduet av og på.

Hver kontroll har forskjellige egenskaper, akkurat som andre objekter i Office og VBA. Hvis du for eksempel merker en av kommandoknappene, vil du se egenskaper som i figur 5. Mange egenskaper påvirker kontrollens utseende, mens andre styrer dens oppførsel. De fleste egenskaper kan endres fra programkoden, mens noen bare kan avleses.

 

Figur 5. Objektenes egenskaper spiller en svært viktig rolle.
 

Vi bruker i første omgang bare noen få egenskaper, men du vil lære mye av å bli kjent med og prøve ut de øvrige egenskapene. VBA gir god hjelp med dette: Når en egenskap er valgt, kan du taste F1 for å få utførlig dokumentasjon.

Øverst på listen over egenskaper finner du alltid (Name). Denne egenskapen er svært viktig for alle kontroller som du skal arbeide med fra programkoden. Ved å gi disse et beskrivende navn, kan du enkelt manipulere dem i programrutinene som hører til dialogboksen.

I vårt prosjekt skal vi arbeide med selve dialogboksen (som foreløpig heter UserForm1), med tekstboksene og med de to kommandoknappene. Ledetekstene er ikke annet enn tekster, så de trenger ingen navn.

Skikk og bruk

Navnet skal ikke bare være beskrivende, men bør også angi hvilken kontrolltype det dreier seg om. Dette gjør det vesentlig enklere å lese og forstå program­koden, og brukes også til variabler og andre objekter. Innenfor programmering er det skikk og bruk å sette av de tre første bokstavene i navnet til dette. For eksempel brukes txt til tekstbokser og cmd til kommandoknapper.

Men la oss starte med selve dialogboksen: Klikk på den uten å treffe noen av de andre kontrollene, og sjekk at det står UserForm øverst i Properties-vinduet. I feltet (Name) legger du nå inn navnet

frmBrev

På samme måte setter du navn på de seks tekstboksene, ovenfra og ned:

txtNavn

txtAdr1

txtAdr2

txtSted

txtLand

txtEmne

De to kommandoknappene OK og Avbryt (som foreløpig ikke viser disse tekstene ennå), kaller du

cmdOK

cmdAvbryt

I neste artikkel skal vi bruke disse navnene i programkoden, så pass på at du skriver dem nøyaktig som vist.

Neste skritt er å få skikk på tekstene i dialogboksen. Dette styres av egenskapen Caption. Vi starter igjen med selve dialogboksen, som nå heter frm­Brev. Sett Caption til «Mottaker og emne» (uten anførselstegn), slik at brukeren lett forstår hva som er formålet med dialogen.

Klikk på rammen og angi «Navn og adresse» som Caption. Legg deretter inn de seks ledetekstene, og merk deg at disse har en snarvei: Her kan du endre teksten direkte ved å klikke på den etter at du har merket kontrollen. Du behøver altså ikke gå via Caption, men vil se at den automatisk blir oppdatert. Til slutt bruker du samme teknikk for de to kommandoknappene, som skal ha teksten OK og Avbryt.

Nesten i mål

Nå er vi nesten i mål i forhold til vår arbeidstegning i figur 1. Det eneste som mangler er at ledetekstene ikke er høyrejustert ennå, og at knappene mangler understrekingen som viser hvilken hurtigtast som kan brukes.

Merk først de fem ledetekstene i rammen, og gå deretter til Properties-vinduet. I feltet Text­Align, velger du nå innstillingen fm­Text­Align­Right for å høyrejustere tekstene. Dette illustrerer enda et nyttig triks, nemlig at du ofte kan sette egenskaper for flere kontroller samtidig. Gjenta innstillingen for den nederste ledeteksten Emne:.

For å angi hurtigtaster for kommandoknapper (og en del andre kontroller), bruker du egenskapen Accelerator (se figur 5). Bruk bokstaven O for OK-knappen og A for Avbryt-knappen. Disse bokstavene blir nå understreket som vist i figur 1, og du kan bruke tastene ved å trykke Alt-O eller Alt-A.

De fleste dialogbokser har en standardknapp (eng. default button), som blir utført når du taster Enter i dialogen. Denne knappen er markert med en tykkere ramme. For å angi dette for OK-knappen, setter du egenskapen Default til True.

Tilsvarende har de fleste dialoger en Avbryt-knapp (eng. Cancel). Når du setter egenskapen Cancel til True for Avbryt-knappen, kan du taste Esc for å avbryte dialogen.

Alt dette for ingenting?

Nå er vi i mål med fase 1 og 2 av prosjektet vårt. Hvis du har gjort alt riktig, har du nå en lekker dialogboks som gjør – ingenting.

Det skyldes at vi først i neste artikkel skal lage programkoden som får dialogboksen til å utføre oppgavene sine. Du kan likevel teste dialogboksen ved å merke den og velge Run/Run Sub/­User­Form fra menyen eller taste F5. Du kan også bruke Run-knappen på verktøylinjen.

Dialogboksen vises nå, og du kan teste tabulatorrekkefølgen, skrive tekst i feltene og prøve tastene Enter og Esc. Ingen av knappene virker imidlertid, og du må lukke dialogen for å avslutte. Pass på å lagre malen når du er ferdig. VBA har også en lagreknapp som du bør bruke underveis.

 

Pedagogisk formaning

En brevmal med denne dialogboksen kan lastes ned her.

Når noe kan lastes ned, er det fristende å gjøre det, men vår formaning er at du bare laster ned denne malen hvis du blir stående helt fast med noe og trenger å sjekke «fasitsvaret». Du vil nemlig lære svært lite av å studere en ferdig dialogboks som andre har laget, mens du vil lære svært mye av å arbeide med oppgaver som i denne artikkelen.

Som vanlig i denne serien, er vi ikke først og fremst ute etter å presentere ferdige produkter, men ønsker å lære deg konsepter og prinsipper som gjør deg i stand til å lage egne løsninger.

Men vent, det er mer! Kunnskapene her er nemlig svært generelle. Nøyaktig de samme teknikkene kan brukes i frittstående Visual Basic og i de fleste andre utviklingsverktøy, som for eksempel Borland Delphi. Skulle du få smaken på programutvikling, har du derfor allerede tatt noen viktige skritt på veien.


Dialoger på boks, del 2 av 2

 

Av Willy Verwoerd | Publisert 02.03 2004 kl. 06:52

I Office trenger du ikke å nøye deg med hva Microsoft har laget til deg: Med makroer og egne brukergrense­snitt kan du programmere videre selv. I forrige artikkel laget vi karosseriet til en dialogboks – nå skal vi sette inn motoren.

Tidligere i høst startet vi i Office-eksperten arbeidet med å lage en Word-mal for ditt eget brevpapir (se Lag ditt eget brevpapir). Malen inneholdt alle elementer i et brevark, men manglet et godt brukergrensesnitt for å fylle ut mottakernavn, adresse og emnelinje.

I forrige utgave satte vi derfor i gang arbeidet med å forbedre malen ved å lage en dialogboks som vist i figur 1. Vi lærte deg hvordan du kommer i gang med utviklingsmiljøet i Office, Visual Basic for Applications, og hvordan du kan bruke såkalte kontroller for å utvikle dine egne brukergrensesnitt.

 

Figur 1. Med en dialogboks blir det mye enklere å bruke brevmalen.
 

Vi skal nå bygge direkte videre på forrige artikkel, og det er derfor en forutsetning at du har lest den. Har du ikke det, finner du den her.

Prosjektet vårt bruker den opprinnelige malen fra Lag ditt eget brevpapir som utgangspunkt. I denne malen var posisjonene for mottaker, adresse og emne bare markert med tekst på denne måten:

 Mottaker
  x
  x
  x
  x

I forrige nummer tok vi så første skritt på veien mot en bedre løsning ved å konstruere selve dialogboksen. Boksen kunne imidlertid ikke utføre noe som helst, og denne gangen skal vi derfor lage programkoden (makroene) som utgjør selve maskineriet:

Brukeren skal kunne fylle ut opplysningene til brevet, og klikke OK (eller taste Enter) hvis han er fornøyd. Opplysningene skal da settes inn på rett plass i brevet. Klikker brukeren Avbryt eller taster Esc, skal operasjonen avbrytes.

Bokmerker viser vei

Først må vi forholde oss til «rett plass». For øyeblikket inneholder malen bare våre primitive tekstmarkeringer. Disse fungerer fint for mennesker, men programrutiner trenger en mer eksakt metode for å sikre at informasjonen fra dialogboksen havner på de rette stedene i brevet. Det løser vi med bokmerker.

I Word kan du bruke navngitte bokmerker for å markere posisjoner i dokumentet. Bokmerkenavn må begynne med en bokstav og kan også inneholde tall og understrekingstegn. Mellomrom er ikke tillatt.

For å sette inn et bokmerke, flytter du markøren til ønsket posisjon i dokumentet. Så velger du Sett inn/Bokmerke fra menyen (eller taster Ctrl-Skift-F5) og skriver navnet på bokmerket (se figur 2). Enkleste måte for å gå til et bokmerke, er å taste F5 og skrive inn navnet eller velge det fra listen.

 

Figur 2. Bokmerker angir hvor tekstene fra dialogboksen skal plasseres.
 

Bokmerker er fine, men usynlige: De vises verken som feltkoder eller skjult tekst. For å få vite hvilke bokmerker du har, må du derfor bruke en av kommandoene ovenfor. I tillegg kan du få en visuell markering ved å velge Verktøy/Alternativer og skillearket Vis. Huk av for Bokmerker, slik at du ser merkene mens du jobber videre med malen.

Som nevnt har vår brevmal faste posisjoner for navn på mottaker, adresse, poststed, land og brevets emnelinje. Første oppgave er derfor å legge inn bokmerker i de samme posisjonene og deretter slette de opprinnelige tekstmarkørene. Bruk følgende navn på bokmerkene: Navn, Adr1, Adr2, Sted, Land og Emne.

Med bokmerkene på plass i malen, kan vår makro enkelt finne posisjonene til de forskjellige tekstene. OBS! Siden makroen skal referere til disse navnene, må du bruke nøyaktig samme navn som oss.

Klar for programmering

Mens vi i del 1 tegnet opp brukergrensesnittet og definerte egenskapene for de forskjellige objektene, er det nå klart for å vekke dialogboksen til liv med programsetninger som utfører dialogens oppgaver.

Vi skal altså programmere, og et helt sentralt poeng når du arbeider med Visual Basic for Applications (VBA) er at alt dreier seg om objekter. Det gjelder blant annet Office-programmene selv, dataene og dokumentene deres og dialogbokser og alt det de inneholder.

Alle Office-programmene gjør sin funksjonalitet og sine data tilgjengelig

for omverdenen i form av objekter, men i varierende grad. I Excel og Word er for eksempel nesten alt tilgjengelig, mens Outlook foreløpig bare har en svært begrenset objektmodell.

Objekter kan ha egenskaper, metoder og hendelser. På engelsk (som er arbeidsspråket i VBA) kalles disse henholdsvis Properties, Methods og Events.

I forrige artikkel jobbet vi med egenskapene til elementer i dialogboksen (kontroller). Vi ga for eksempel navn til tekstboksene, utstyrte knappene med passende tekster og bestemte at OK-knappen skulle være standardknapp. Egenskaper kan ikke bare stilles inn fra egenskapsvinduet i VBA slik vi gjorde forrige gang, men de fleste kan også endres eller avleses fra programkode.

I tillegg til egenskaper, har mange objekter metoder, det vil si handlinger som objektet kan utføre. En av metodene til tekstbokser heter for eksempel Copy. Når denne metoden utføres, blir innholdet av tekstboksen kopiert til utklippstavlen.

Hva skjer?

Til slutt spiller hendelser en viktig rolle. I et objektorientert utviklingsmiljø som VBA og Office, styres programmenes funksjoner i stor grad av hendelser. Mens tradisjonelle programmer startet øverst og arbeidet seg nedover, blir svært mye av jobben i dag gjort i form av frittstående programbiter som utløses av og er direkte knyttet til hendelser.

I vårt prosjekt finnes tre konkrete oppgaver som trenger programmering: Den mest «krevende» oppgaven er at verdiene fra dialogboksen skal legges inn i brevet når brukeren klikker OK. Programkoden som utfører dette er derfor knyttet til OK-knappens Click-hendelse, som inntreffer hver gang brukeren klikker på knappen.

Tilsvarende er rutinen for å avbryte knyttet til Click-hendelsen for Avbryt-knappen. (Merk at Click innebærer at knappen trykkes ned, enten det skyldes musen eller tastaturet.)

Den tredje oppgaven er å vise dialogboksen når brukeren åpner et nytt dokument som bygger på brevpapirmalen. Det løser vi med en spesiell standardmakro i Word som beskrevet nedenfor.

De fleste kontroller i VBA har et rikt utvalg av hendelser som du kan fange opp med programrutiner. I en tekstboks inntreffer for eksempel hendelsen Change når feltets innhold blir endret, mens Exit inntreffer når markøren forlater tekstboksen. Slik kan du for eksempel sjekke om tekstboksen inneholder en lovlig verdi.

I hjelpfilen til VBA kan du lære mye mer om objekter og deres egenskaper, metoder og hendelser. Der finner du også mange eksempler, så dette er anbefalt lesestoff!

Motoren

For å knytte programrutiner til en kommandoknapp, dobbelklikker du på knappen. Du kommer da rett inn i et redigeringsvindu i VBA der Click­-rutinen er klargjort for å skrive selve programkoden. Figur 3 viser programkoden for de to knappene, som vi i forrige artikkel ga navnene cmd­Avbryt og cmd­OK. Skriv inn programkoden nøyaktig som vist.

 

Figur 3. Programkode for de to kommandoknappene.
 

Programkoden for OK-knappen arbeider nesten i sin helhet med Selection-objektet i Word. Sammen med Range-objektet står dette sentralt når det gjelder redigeringsoppgaver.

Vi bruker objektets GoTo-metode for å gå til et bokmerke og deretter metoden TypeText for å legge inn teksten fra de respektive tekstboksene. Siden innholdet til en tekstboks er dens standardegenskap, trenger vi bare å skrive navnet på tekstboksen. Vi kunne også brukt for eksempel txt­Navn.Val­ue for å angi denne egenskapen eksplisitt.

Fordi alle tekstmetodene tilhører Selection-objektet, har vi pakket dem inn i en With Selection-blokk. Vi kan da for eksempel skrive .Go­To istedenfor Se­lec­ti­on.Go­To når vi bruker objektet. Dette medfører både atskillig mindre skriving og mer oversiktlig programkode.

Etter at alle tekstene er lagt på plass, lukker vi dialogboksen (som heter frmBrev) med kommandoen

Unload frmBrev

Når en dialogboks eller et vindu skal lukke seg selv, kan du også bruke den enklere formen

Unload Me

Avbryt-knappen skal bare avslutte dialogboksen, og trenger derfor bare denne ene kommandoen.

AutoNew

Alt som gjenstår nå er å sikre at dialogboksen faktisk vises når brukeren åpner et nytt dokument som bygger på malen – ellers har vi liten glede av den. Dette løser vi med standardmakroen Auto­New: Når det finnes en makro med dette navnet, vil Word automatisk utføre den når det åpnes et nytt dokument med malen.

Denne makroen hører til selve malen og ikke til dialogboksen. Bruk derfor først menykommandoen Insert/Module for å opprette en ny modul i VBA som du kan legge makroen i.

Du finner den nye modulen i prosjektvinduet (se figur 2 i forrige artikkel) med navnet Module1. Dobbelklikk på den for å vise kodevinduet, og skriv inn makroen som vist i figur 4. Når det er gjort, er det bare å lagre malen og sjekke om alt fungerer som ventet.

 

Figur 4. Dialogboksen aktiveres ved å bruke dens Show-metode.
 

Også denne malen kan lastes ned her. Som vanlig anbefaler vi at du bare laster ned våre eksempler hvis du står helt fast med noe. Dette fordi du lærer mye mer av å prøve deg på (og streve med!) oppgavene på egen hånd.

Løsningene i denne artikkelen er utviklet og testet i Office XP (Office 2002).


Dialogbokser i Excel

 

Av Willy Verwoerd | Publisert 26.03 2004 kl. 13:32

Dataregistrering i Excel kan bli både enklere og sikrere ved å bruke dialogbokser, samtidig som du kan utvikle gode og oversiktlige brukergrensenitt. Vi hjelper deg i gang med et konkret eksempel.

Tidligere (se artiklene «Dialoger på boks», del 1 og del 2), gjennomgikk vi i detalj hvordan du lager dialogbokser i Office med det innebygde utviklingsverktøyet Visual Basic for Applications (VBA). For å konstruere en dialogboks, må du først tegne selve boksen og definere kontroller og egenskaper, og deretter skrive den tilhørende programkoden (makrokoden).

Tidligere i fjor høst startet vi arbeidet med en brevmal for Word, og i de to artiklene fullførte vi denne ved å lage en dialogboks som forenklet utfyllingen av fast informasjon om mottaker, adresse og emne.

Sammenlignet med et Word-dokument, er et Excel-regneark svært strukturert. Mens det i et Word-dokument er vanskelig å angi entydige posisjoner, har cellene i et Excel-ark hver sin unike adresse. Cellene kan dessuten blant annet fargelegges og beskyttes for å forenkle og sikre utfyllingen av data.

Men selv om man skulle tro at dette var bra nok hjelpemidler, finnes det også i Excel mange fordeler ved å bruke dialogbokser: Du kan blant annet samle all utfylling på ett sted, styre dataene til ulike steder i arket basert på brukervalg og tilby et godt og oversiktlig brukergrensesnitt.

Som regel er det også enklere å kvalitetssikre dataene med programkoden i en dialogboks enn med formler i regnearket. Formlene i Excel har kraftige muligheter, men til mer komplekse oppgaver er det ofte mer effektivt og oversiktlig å bruke VBA.

Eksemplet vi gjennomgår nedenfor er ganske banalt, men demonstrerer likevel viktige prinsipper som du i neste omgang kan bygge videre på. Og som tidligere nevnt er vi i spalten ikke opptatt av å lage produkter, men av å lære deg teknikker som du kan ha nytte av i din Office-hverdag. Det er ikke vi som skal lage løsningene, men du!

Resten av artikkelen forutsetter at du er fortrolig med innholdet i artiklene «Dialoger på boks». De eldre artikleme er tilgjengelig her.

Alt på et brett

I eksemplet vårt tenker vi oss at brukeren av et regneark skal fylle ut en rapport med salgstallene for et bestemt kvartal (se figur 1). Istedenfor å la brukeren legge tallene rett inn i de enkelte cellene, lager vi en dialogboks der brukeren først velger kvartal og så registrerer tallene for hver region. Avhengig av brukerens valg av periode, skal tallene plasseres i forskjellige kolonner i arket.

 

Figur 1. Enkelt regneark for registrering av salgstall.
 

For en erfaren Excel-bruker kan dette virke som en merkelig omvei, men for en uerfaren bruker er denne løsningen et stort fremskritt. Hele arbeids­oppgaven er nemlig samlet på ett sted og med et grensesnitt som brukeren kjenner fra andre programmer.

Brukeren trenger derfor bare å forholde seg til dialogboksen, og klarer seg faktisk fint uten Excel-kunnskaper overhodet. Som utvikler av regnearket, har du en tilsvarende fordel: Du vet hvor du har brukeren, og kan utøve svært god kontroll over at oppgavene blir utført uten feil.

Egenskapene først

Og så til saken: Etter at du har åpnet et nytt regneark og satt det opp som vist i figur 1, åpner du VBA ved å taste Alt-F11. Bruk prosjektvinduet for å opprette en ny UserForm (til dialogboksen) og en ny Module til regnearket som beskrevet tidligere.

Første oppgave er å tegne og sette opp egenskaper (eng. Properties) for dialogboksen i figur 2. Selve dialogboksen kaller vi frmSalg.

 

Figur 2. Dialogboks som håndterer valg av periode og registrering av data.
 

Helt øverst bruker vi et nytt element, nemlig en kombinasjonsboks (eng. Com­bo­Box), som er en variant av en listeboks. Her skal brukeren velge hvilket kvartal tallene gjelder for.

Til komboboksen bruker vi navnet cbo­Peri­ode. Dialogboksen inneholder også en ramme med fire tekstbokser, samt to kommandoknapper nederst. Navngi disse kontrollene med henholdsvis txt­Øst, txt­Sør, txt­Vest, txt­Nord, cmd­OK og cmd­Avbryt. Bruk kommandoen View/Tab Order for å sette opp riktig tabulatorrekkefølge.

Vi skal se litt nærmere på kombinasjonsboksen, som kalles slik fordi brukeren både kan velge fra en liste og skrive inn en egen verdi. Den kan imidlertid også brukes som en ren listeboks, og det er hva vi trenger til vårt formål, siden de fire kvartalene skal være de eneste valgmulighetene. Det oppnår vi ved å sette egenskapen Style til fm­Style­Drop­Down­List.

Boksen kan reagere på forskjellige måter når brukeren taster tegn fra tastaturet. Vi ønsker at slike tegn bare skal sammenlignes med første tegn i postene i listen, og setter derfor Match­Entry til fm­Match­Entry­First­Letter.

Et kosmetisk tips er for øvrig at egenskapen Selec­tion­Margin som regel kan settes til False – ikke bare i listebokser, men også i tekstbokser. Dette gir en penere visning av innholdet, på bekostning av en merkemulighet som sjelden brukes.

Til slutt settes egenskapen Default til True for OK-knappen, mens Cancel skal være True for Avbryt-knappen.

Vi har ikke plass til å gå i detaljer om alle egenskapene, men hjelpfilen i VBA har fyldig informasjon om dette: Velg en egenskap i egenskapsvinduet, og tast F1 for å lese beskrivelsen. Det er også svært lærerikt å eksperimentere med forskjellige innstillinger og se hvordan dette påvirker dialogboksen.

Klart for programmering

Programkoden for vår dialogboks er vist i figur 3 (nederst på siden), og består av tre rutiner. Første oppgave er å sørge for at kombinasjonsboksen blir satt opp med de fire valgmulighetene.

Alle dialogbokser og skjemaer (eng. user forms) i VBA har en hendelse som heter Initialize som blir utløst når dialogboksen opprettes, men før den vises til brukeren. Dette er et fint tidspunkt for å initialisere innholdet av listebokser og andre variable:

Øverst i programkodevinduet finner du to lister. Velg først User­Form i den venstre listen og deretter Initialize i den høyre. VBA oppretter da automatisk en rutine med riktig navn som vist nederst i figur 3. Her bruker vi metoden Add­Item for å legge inn de fire valgene i kombinasjonsboksen.

Resten av programkoden håndterer de to knappene OK og Avbryt. Sistnevnte skal bare avslutte dialogboksen med Un­load, mens programkoden for OK-knappen gjør selve jobben som dialogboksen er til for. Den består av tre trinn:

Først bruker vi egenskapen List­Index for å sjekke hvilket valg brukeren gjorde i kombinasjonsboksen. Resultatet (som med våre fire valg er et tall fra 0 til 3) legger vi i variabelen Peri­ode­valg. Deretter bruker vi en Case-setning og variabelen Kolonne for å angi kolonnen i regnearket som tallene skal plasseres i. Til slutt bruker vi metoden Range for å legge inn de fire tallene i hver sin celle.

Kombinasjonsboksen returnerer verdien -1 hvis brukeren ikke gjorde noe valg. Det kan vi utnytte for å gi en påminnelse med kommandoen Msg­Box om at det må gjøres et valg her. Deretter bruker vi Set­Focus for å sende markøren til kombinasjonsboksen, slik at brukeren enkelt kan korrigere feilen.

Case-setningen er litt omstendelig, men gjør det enkelt for andre å forstå utviklerens tankegang. Et enklere, men litt mer kryptisk alternativ, er vist i figur 4 (nederst på siden). Her konstruerer vi i stedet kolonnen ved å bruke funksjonen Chr og legge sammen tegnkoden for bokstaven «B» med verdien fra List­Index.

Metoden Range (se hjelpteksten!) brukes mye i Excel-programmering for å håndtere innholdet av celler. I vårt eksempel forutsetter vi at dataene skal settes inn i nåværende ark, men du kunne også brukt for eksempel Salg.Range for å angi at arket Salg skal brukes. Legg merke til funksjonen Val, som konverterer teksten fra tekstboksene til tallverdier.

Siste oppgave er å sikre at dialogboksen vises automatisk når brukeren åpner regnearket. Dette gjør du ved å legge inn rutinen Sub Auto_Open i modulen som du opprettet da du startet. Denne rutinen skal bare inneholde én setning:

frmSalg.Show

Merk understrekingstegnet i Auto_Open, som ikke brukes i den tilsvarende makroen i Word.

Forbedringer

På grunn av begrenset plass, inneholder vår enkle løsning minimalt med kvalitetssikring av dataene, men som du sikkert forstår, finnes det store muligheter her.

Første trinn ville være å kontrollere at alle boksene faktisk er utfylt, og gi brukeren en feilmelding ved behov. I neste omgang kan du for eksempel sjekke at tallene holder seg innenfor et normalt område eller vise et kontrollspørsmål hvis det er store prosentvise avvik i forhold til forrige periode eller samme periode i året før.

Som vanlig vil du lære mest ved å utføre oppgavene i artikkelen og konstruere alt fra bunnen av. Men skulle du stå helt fast med noe, finner du det komplette eksemplet her.


Løsningene i denne artikkelen er utviklet og testet i Office XP (Office 2002).

 


 
Figur 3. Komplett programkode for dialogboksen:

Option Explicit

-------------------------------------------

Private Sub cmdAvbryt_Click()

  Unload Me  ‘ Lukk dialogboks

End Sub

-------------------------------------------

Private Sub cmdOK_Click()

  Dim Periodevalg As Integer

  Dim Kolonne As String

 

  Periodevalg = cboPeriode.ListIndex

 

  Select Case Periodevalg

    Case -1  ' Ingen periode valgt

      MsgBox "Du må velge salgsperiode.", _

        vbExclamation, "Periode mangler"

      cboPeriode.SetFocus

    Case 0   ' 1. kvartal

      Kolonne = "B"

    Case 1   ' 2. kvartal

      Kolonne = "C"

    Case 2   ' 3. kvartal

      Kolonne = "D"

    Case 3   ' 4. kvartal

      Kolonne = "E"

  End Select

 

  Range(Kolonne & "4").Value = Val(txtØst)

  Range(Kolonne & "5").Value = Val(txtSør)

  Range(Kolonne & "6").Value = Val(txtVest)

  Range(Kolonne & "7").Value = Val(txtNord)

 

  Unload Me  ‘ Lukk dialogboks

End Sub

-------------------------------------------

Private Sub UserForm_Initialize()

  cboPeriode.AddItem "1. kvartal"

  cboPeriode.AddItem "2. kvartal"

  cboPeriode.AddItem "3. kvartal"

  cboPeriode.AddItem "4. kvartal"

End Sub

 

Figur 4. Et enklere, men mer kryptisk alternativ til Case-setningen i figur 3:

Private Sub cmdOK_Click()

  Dim Periodevalg As Integer

  Dim Kolonne As String

 

  Periodevalg = cboPeriode.ListIndex

 

  If Periodevalg = -1 Then  ' Ikke valgt

    MsgBox "Du må velge salgsperiode.", _

      vbExclamation, "Periode mangler"

    cboPeriode.SetFocus

  Else

    Kolonne = Chr(66 + Periodevalg)

    Range(Kolonne & "4").Value = Val(txtØst)

    Range(Kolonne & "5").Value = Val(txtSør)

    Range(Kolonne & "6").Value = Val(txtVest)

    Range(Kolonne & "7").Value = Val(txtNord)

   

    Unload Me  ’ Lukk dialogboks

  End If

End Sub

 


 

Bedre Office-samarbeid med VBA

 

Av Willy Verwoerd | Publisert 25.05 2004 kl. 06:25

Visual Basic for Applications er ikke bare et kraftig verktøy for å forbedre hvert enkelt Office-program, men du kan også bruke det for å få i gang et godt samarbeid mellom programmene. Vi ser på hvordan du kan utbedre en svakhet i Outlook og få hjelp av Word med presentasjon og utskrift.

Skal du kunne utnytte Visual Basic for Applications (VBA) fullt ut, trenger du utdanning og erfaring i programutvikling og systemering. Men selv uten en slik bakgrunn, kan du oppnå svært mye ved å gå over terskelen og begynne å sette deg inn i VBA. Allerede med enkle programmer (eller makroer, som de kalles i Office), kan du raskt lage verktøy som kan bli til stor nytte for deg selv eller dine kolleger.

I tidligere artikler i serien, har vi sett på hvordan du kan lage makroer som utfører oppgaver innenfor et enkelt program som for eksempel Word eller Excel. Men Office er også ypperlig tilrettelagt for samarbeid mellom programmene, slik at du kan utnytte de ulike programmenes sterke sider for å få gjort jobben best mulig.

Vi skal illustrere dette med et eksempel, som både viser hvordan du kan utbedre en svakhet i et Office-program og få hjelp av et annet Office-program for å oppnå et enda bedre resultat.

Har du ikke brukt VBA tidligere, bør du først lese de to artiklene Dialoger på boks fra tidligere Office-eksperten -- disse finner du her

Påminnelser på papir

Som Outlook-bruker kjenner du sikkert til påminnelsesvinduet, som kom i Office XP. Her vises en samlet liste over alle påminnelser som er blitt utløst og som er aktive for øyeblikket.

Påminnelser blir vanligvis mest brukt til oppgaver og kalenderelementer, men også oppfølgingsflagg for meldinger og kontakter kan ha påminnelser. Det er imidlertid bare kontaktpåminnelser som vises i påminnelsesvinduet – meldinger med aktiv påminnelse skifter bare farge i innboksen.

Påminnelsesvinduet er et fint verktøy for å minne deg om de viktigste oppgavene dine, men hva om du skal ut av kontoret og vil ta listen med deg? Det går dessverre ikke, for den kan ikke skrives ut.

Riktignok kan du lage en visning som bare viser forfalte påminnelser (se Bli med på visning), men visninger kan du bare tilpasse for én mappe om gangen. Du vil derfor ikke få med deg alle aktive påminnelser.

Her kommer VBA inn i bildet: I Outlooks objektmodell er alle påminnelser nemlig tilgjengelig som en samling (eng. Collection) med navnet Reminders. Med noen få programlinjer kan du derfor få tilgang til og håndtere alle påminnelser.

Men så dukker neste problem opp: Outlook er ikke akkurat noen kløpper på lekre utskrifter. Det er fullt mulig å skrive ut fra VBA-rutiner i Outlook, men det er kronglete og primitivt. Vi trenger derfor hjelp fra en god håndverker som er flink med dokumenter.

Gode referanser

Det må selvfølgelig bli Word, som både har ekspertise og gode referanser på området. Vi skal se på hvordan Outlook og Word kan samarbeide om jobben. (Når du styrer et program fra et annet program (i dette tilfellet Word fra Outlook), kalles det automatisering, eller Automation på engelsk.)

Referansen trenger vi ikke bare i billedlig forstand, men også helt konkret i VBA. Man skulle tro at Outlook kjenner til Word, og det gjør den også. Men skal du bruke Word fra Outlook, er det flere fordeler ved å gi Outlook en spesifikk referanse til Word-objektet før du setter i gang.

Dette er knyttet til programmeringsbegrepene tidlig binding og sen binding. Når Outlook ikke har noen referanse til Word, kan du bare bruke sen binding. Det betyr at referansen først blir opprettet når makroen blir utført, noe som gir dårligere ytelse og en del andre ulemper.

Når Outlook har en forhåndsreferanse til Word, kan du definere Word-objekter allerede mens du skriver makroen (tidlig binding). Det betyr blant annet at alle egenskaper og metoder for Word-objekter automatisk spretter opp når du skriver programkoden. Arbeidet går derfor både vesentlig raskere og har bedre sikring mot feil (syntakskontroll).

Vi starter derfor med å angi en referanse til Word, og dette trenger du bare å gjøre én gang for hver installasjon: Start Outlook og tast Alt-F11 for å gå inn i VBA. Velg Tools/References fra menyen, og bla deg nedover i listen som vises til du finner Microsoft Word 10.0 Object Library. Huk av dette valget og klikk OK.

Figur 1 viser hvordan vinduet kan se ut etter at oppgaven er utført. Merk at de øvrige valgene i vinduet varierer med hva slags verktøy som ellers er installert på PCen din. De vil derfor antagelig avvike fra vårt eksempel.

 

Figur 1. En referanse til Word-objektet gir både bedre ytelse og enklere programmering.
 

Samarbeid i praksis

Nå er alt klart for å skrive selve makroen. Kort fortalt skal den bruke Outlook for å finne frem aktive påminnelser, mens Word får jobben med å skrive ut påminnelsene på en pen måte.

I Outlook legges vanlige makroer i modulen This­Out­look­Ses­sion, som blir opprettet automatisk og som ikke kan slettes (se prosjektvinduet i figur 2). Dobbelklikk på denne modulen for å åpne kodevinduet, og opprett makroen ved å skrive kommandoen Sub fulgt av makronavnet Skriv­ut­På­min­nel­ser.

 

Figur 2. I Outlook plasseres vanlige makroer i standardmodulen This­Out­look­Ses­sion.
 

Innholdet i makroen er vist i figur 3 og består av fem seksjoner, som er atskilt med tomme linjer. I første seksjon definerer vi de to variablene vi trenger til Outlooks del av jobben, én til selve applikasjonen og én til Reminder-objektet.

Figur 3:
 

Sub SkrivutPåminnelser()

  Dim olApp As Outlook.Application

  Dim olRem As Reminder

 

  Dim wdApp As Word.Application

  Dim wdDok As Word.Document

 

  Set olApp = Outlook.Application

 

  Set wdApp = New Word.Application

  With wdApp

    Set wdDok = .Documents.Add

    .Visible = True

    With .Selection

      .Paragraphs.TabStops.Add CentimetersToPoints(8)

      .Font.Name = "Arial"

      .Font.Size = 12

      .Font.Bold = True

      .TypeText "Påminnelser" & vbTab & "Varslingsdato" & vbCr

      .Font.Bold = False

    End With

  End With

   

  If olApp.Reminders.Count > 0 Then

    For Each olRem In olApp.Reminders

      If olRem.IsVisible Then

        wdApp.Selection.TypeText olRem.Caption & vbTab & _

        FormatDateTime(olRem.OriginalReminderDate, vbShortDate) & vbCr

      End If

    Next

    wdDok.PrintOut

    wdDok.Close wdDoNotSaveChanges

    wdApp.Quit

  Else

    MsgBox "Det finnes ingen påminnelser."

  End If

  Set wdDok = Nothing

  Set wdApp = Nothing

End Sub

 

I andre seksjon definerer vi på samme måte to variabler til Word-bruk. Her trenger vi et applikasjonsobjekt og et dokumentobjekt. Til Outlook-variablene bruker vi prefikset ol, mens Word-variablene har prefikset wd. Dette gjør det enkelt å se hvilken applikasjon variablene jobber for, og er i samsvar med måten VBA gjør det på.

Selve programmet starter i tredje seksjon, som bare består av én linje som initierer variabelen for applikasjonsobjektet i Outlook. Denne variabelen er strengt tatt ikke nødvendig, fordi objektet Outlook.Application automatisk finnes i Outlook. Men en variabel gjør det mye enklere å arbeide med Outlook-objektet, særlig i større makroer.

Fjerde seksjon har flere oppgaver: Den skal først klargjøre Word og opprette et Word-dokument. Deretter skal dokumentet settes opp med ønsket skrifttype, og vi skal legge inn en overskrift for listen over påminnelser.

Legg merke til første linje, der vi bruker kommandoen New for å opprette en ny Word-applikasjon. Dette var ikke nødvendig for Outlooks del, siden vi allerede er i Outlook.

Innenfor With-blokken oppretter vi først et nytt Word-dokument med metoden Add. Så bruker vi egenskapen Visible for å gjøre dokumentet synlig, mest for at du skal kunne se hva som foregår. Når alt fungerer som det skal, kan du derfor gjerne stryke denne setningen. Word vil da gjøre sin del av jobben helt usynlig, uten at du ser noe annet enn den ferdige utskriften.

Nå kommer vi til en ny (innfelt) With-blokk som klargjør selve dokumentet ved hjelp av Selection-objektet: Først oppretter vi en tabulator i posisjonen 8 cm. Så setter vi skriften til Arial i 12 punkter og halvfet. I neste linje bruker vi metoden TypeText for å skrive inn overskriftene «Påminnelser» og «Varslingsdato», atskilt med et tabulatortegn vb­Tab. Så stilles skriften tilbake til normal, som vi fra nå av skal bruke til selve påminnelsene.

 

Sakens kjerne

Dermed har vi kommet til makroens kjerne, nemlig femte seksjon i programkoden. Gjennom egenskapen Count sjekker vi først om det faktisk finnes noen påminnelser overhodet. Hvis antallet ikke er større enn null, får brukeren beskjed med en meldingsboks.

Hvis det finnes påminnelser, bruker vi en For Each-løkke for å undersøke hver enkelt påminnelse: Når egenskapen IsVisible er sann, betyr det at vi har en aktiv påminnelse som vises i påminnelsesvinduet. Påminnelsen blir da lagt inn i Word-dokumentet med påminnelsesteksten (Caption) og datoen da den ble varslet, igjen atskilt med et tabulatortegn, slik at vi får en pen liste.

Varslingsdatoen finnes i påminnelsens egenskap Ori­gi­nal­Re­min­der­Date, men den inneholder også klokkeslettet for påminnelsen. Vi bruker derfor funksjonen For­mat­Date­Time med parameteren vb­Short­Date for å plukke ut datoen i kort format. Linjene avsluttes med linjeskift (vbCr).

Når alle påminnelsene er gjennomgått, gjenstår det bare å skrive dem ut (PrintOut), lukke dokumentet uten å lagre det (Close) og avslutte Word-applikasjonen (Quit). Helt til slutt sletter vi de to Word-objektene våre ved å sette dem til Nothing.

For å gjøre makroen enkel å bruke, bør du opprette en verktøyknapp til den med menyvalget Verktøy/Tilpass i Outlook. Se artikkelen Bak spakene i Office (PC World Norge nummer 8/2003) for mer kunnskaper om hvordan du arbeider med verktøyknapper og andre tilpasninger.

Litteraturtips

I spalten er vi ofte kortfattet når det gjelder tekniske detaljer. Det skyldes ikke bare begrenset plass, men også at du må bli fortrolig med å finne informasjon på egen hånd.

Når du arbeider med VBA, er hjelpfilene et helt nødvendig verktøy for å finne mulighetene og spesifikasjonene for egenskaper, metoder og hendelser. Du bør for eksempel finne frem hjelptekstene for både Reminders-samlingen og Reminder-objektet og studere disse. Når du skriver programkode i VBA, kan du dessuten alltid taste F1 for å få detaljene om elementet som markøren står i for øyeblikket. Prøv!

Programkoden til eksemplet ovenfor finner du her, men har du lyst til å bli Office-ekspert, anbefaler vi som vanlig sterkt at du selv skriver inn makroen fra ende til annen. Bruk eksempelfilen bare hvis du står helt fast med noe.

Testet i Office XP

Løsningene i denne artikkelen er utviklet og testet i Office XP (Office 2002).


Mer om dialogbokser

 

Av Willy Verwoerd | Publisert 02.06 2004 kl. 00:24

I vår serie Office-eksperten har vi tidligere sett på grunnleggende teknikker for å lage dine egne brukergrensesnitt med dialogbokser. Nå skal vi utvide kunnskapene, samtidig som vi lager et verktøy som vil være nyttig for mange Word-brukere.

Gode valgmuligheter er en bra ting, men i Windows er det fort gjort å bli overveldet av svært mange skrifttyper. Har du for eksempel installert både Microsoft Office og et tegneprogram som Corel Draw, kan du raskt ende opp med 150-200 ulike skrifter å velge mellom. Da kan det bli tungvint å skifte skrifttype mens du arbeider med Word-dokumenter.

Riktignok hjelper det godt at Word husker de sist brukte skriftene og plasserer dem øverst i listen, men selv denne forkortede listen inneholder gjerne en del skrifter som du sjeldent bruker. Derfor skal vi lage et lite verktøy som gir deg enkel tilgang til dine egne favorittskrifter i Word.

Stilene i Word er ofte det beste hjelpemiddelet for å holde orden på skrifter. Verktøyet vi skal lage er likevel et godt supplement, og det fungerer på tvers av ulike stiler og maler du måtte ha satt opp. Dessuten får du sjansen til å lære mer om dialogbokser, og Office-eksperten dreier seg først og fremst om å formidle kunnskaper og ideer.

Artikkelen forutsetter at du er fortrolig med innholdet i de to tidligere artiklene «Dialoger på boks» del 1 og del 2.

Nye innslag i dialogen

Dialogboksen vi skal lage er vist i figur 1. Den bruker tre nye kontroller som vi ikke var innom i de to første artiklene, nemlig kombinasjonsbokser, radioknapper og avkrysningsbokser. Til sammen danner de et brukergrensesnitt der du kan velge skrifttype, skriftstørrelse og utheving.

 

Figur 1. Med denne dialogboksen kan du enkelt velge dine favorittskrifter i Word.
 

I en kombinasjonsboks (eng. Com­bo­Box) kan brukeren velge verdier fra en liste – i vårt tilfelle en liste over skrifter. Kombinasjonsbokser kan også kombinere (derav navnet) en liste med en tekstboks, slik at brukeren selv kan skrive inn en verdi. Her skal vi imidlertid bruke den som en ren liste.

Neste innslag er radioknappene (eng. Op­tion­But­ton), som vi bruker til å velge skriftstørrelse. Bare én av knappene i gruppen kan være aktiv om gangen, noe som passer bra med tanke på at en skrift bare kan ha én størrelse. Navnet stammer fra de gamle radioapparatene, der en nedtrykket knapp spratt opp når du trykket ned en annen knapp (funksjonen er fortsatt den samme i dag, men med mindre spretting).

Valg av utheving krever en annen løsning, siden en skrift godt kan være fet, kursiv og understreket samtidig. Til dette formålet bruker vi derfor avkrysningsbokser (eng. Check­Box).

Klar for konstruksjon

Første skritt er å konstruere selve dialogboksen med sine kontroller og egenskaper. Legg først inn ledeteksten «Skrifttype:» og deretter kombinasjonsboksen, som du gir navnet cbo­Skrift.

Siden vi skal ha en ren listeboks, må du sette egenskapen Style til fm­Style­Drop­Down­List. Vi ønsker også å kunne velge skrift fra listen ved å taste første tegn i skriftnavnet. Det oppnår vi ved å sette egenskapen Match­Entry til fm­Match­Entry­First­Letter.

Neste oppgave er å sette inn de to rammene (eng. Frame) for skriftstørrelse og utheving. Vi trenger ikke programtilgang til disse, men det er likevel praktisk at rammer har navn. Da er de enklere å arbeide med når du setter opp tabulatorrekkefølgen med menyvalget View/Tab Order i VBA. Vi har døpt rammene til fra­Stør­rel­se og fra­Ut­he­ving.

Rammene skal inneholde henholdsvis tre radioknapper for skriftstørrelse og tre avkrysningsbokser for utheving. Radioknapper innenfor en ramme tilhører automatisk samme gruppe, og er derfor gjensidig utelukkende. Du kan også bruke egenskapen Group­Name for å samle radioknapper i en gruppe, og de kan da plasseres hvor som helst i dialogen. Bruk navnene opt1, opt2 og opt3, og angi gjerne andre eller flere skriftstørrelser.

De tre avkrysningsboksene kalles chk­Fet, chk­Kur­siv og chk­Un­der­strek, og brukes for å slå av og på hver sin uthevingstype.

Så setter du inn de to knappene OK og Avbryt, som får navnene cmd­OK og cmd­Av­bryt. For OK-knappen setter du egenskapen Default til True, mens Cancel skal være True for Avbryt-knappen.

Til slutt bruker du egenskapen Accelerator for å definere hurtigtaster til avkrysningsboksene og kommandoknappene (se figur 1). Dermed er dialogboksen ferdig konstruert, og vi kan gå løs på programmeringen.

Programkode

Løsningen vår krever minimalt med programkode. Den er derfor enda et godt eksempel på hvordan du med ganske liten innsats kan lage nyttige verktøy med gode brukergrensesnitt.

Nesten all programkode er knyttet til dialogboksen, og er vist i figur 2. Koden består av tre rutiner: to for å betjene hver sin kommandoknapp og én for å sette opp dialogboksen.

Figur 2:

Private Sub cmdAvbryt_Click()

  Unload Me

End Sub

 

Private Sub cmdOK_Click()

  With Selection.Font

    .Name = cboSkrift

    If opt1 Then .Size = 10

    If opt2 Then .Size = 11

    If opt3 Then .Size = 12

    .Bold = chkFet

    .Italic = chkKursiv

    .Underline = chkUnderstrek

  End With

  Unload Me

End Sub

 

Private Sub UserForm_Initialize()

  cboSkrift.AddItem "Verdana"

  cboSkrift.AddItem "Arial"

  cboSkrift.AddItem "Courier New"

  cboSkrift.AddItem "Times New Roman"

  cboSkrift = "Verdana"

  opt2 = True

End Sub

 

Sistnevnte oppgave utføres med hendelsen UserForm_Initialize, som blir utført før dialogbokser vises for brukeren. Den passer derfor perfekt for å initialisere verdier og kontroller i en dialogboks. Opprett rutinen ved å velge UserForm fra den venstre listen øverst i programkodevinduet og deretter Initialize fra den høyre listen.

I rutinen setter vi først opp listen i kombinasjonsboksen cbo­Skrift med metoden Add­Item. Vi har lagt inn våre fire favorittskrifter, og du bør legge inn dine egne – så mange som passer deg. Du bør også sortere listen etter skriftene du bruker mest. Etter at listen er satt opp, gir du cbo­Skrift samme verdi som første valg på listen, slik at dette valget blir vist når dialogboksen åpnes.

Fordi vår vanligste skriftstørrelse er 11 punkter, setter vi opt2 (den andre av de tre radioknappene) til True, slik at 11 punkter blir standardvalget. Også her kan du selvfølgelig velge andre (eller flere) skriftstørrelser, men pass på at både ledetekstene og programkoden er i samsvar med dine valg.

På kommando

Vi må også takle kommandoknappene OK og Avbryt, og har derfor laget rutiner for de to Click-hendelsene. Avbryt-rutinen er som vanlig svært enkel: Alt den trenger å gjøre er å fjerne dialogboksen med kommandoen Unload Me.

OK-knappen har litt mer å jobbe med, men bare litt. Den skal utelukkende arbeide med underobjektet Font i Words Selection-objekt, og vi bruker derfor en With-setning rundt handlingene. Det reduserer ikke bare skrivearbeidet vårt, men øker også lesbarheten av programkoden.

Selection-objektet gir samme atferd som når du endrer skrift på vanlig måte i Word: Hvis ingen tekst er merket, gjelder innstillingene fra markørens plassering (innsettingspunktet). Hvis det finnes merket tekst, blir valgene dine utført på denne.

Først setter vi skriftnavnet Name lik valget (verdien) i kombinasjons­boksen. Deretter bruker vi tre If-setninger for å finne ut hvilken radioknapp som er valgt. Det ville vært mer korrekt å bruke en If-Then-Else-struktur her for å unngå unødvendige tester, men også mindre oversiktlig.

Skriftstørrelsen settes med Size i henhold til ledetekstene i dialogboksen. Pass på at du både justerer ledetekstene og tilpasser If-setningene hvis du bruker andre valg enn vi.

Font-egenskapene Bold, Ita­lic og Under­line kan alle ha verdien True eller False. Det gjelder også for avkrysningsbokser, og vi kan derfor rett og slett sette likhetstegn mellom skriftegenskapene og avkrysningsboksene. Jobben i dokumentet er nå gjort, og vi avslutter dialogboksen med Unload.

I programkoden benytter vi oss av at mange VBA-kontroller (inkludert alle vi bruker her) har en standardegenskap (eng. default property). Denne egenskapen kan du bruke uten å angi navnet eksplisitt.Det er grunnen til at vi slipper unna med for eksempel cbo­Skrift istedenfor cbo­Skrift­.Value.

I mål

Dermed er vårt nye verktøy fullført, men vi må også kunne bruke det: Vi trenger en liten makro for å vise dialogboksen. Opprett denne makroen i en modul i Normal-malen, og gi den navnet Velg­Skrift. Makroen trenger bare én programlinje:

frmSkrift.Show

For verktøy av denne typen, som er nært knyttet til arbeid med teksten (og derfor tastaturet), er det oftest best å definere en hurtigtast. Siden vi skal velge en skrift, kan det for eksempel passe med Ctrl-Skift-S.

Forutsatt at du har satt opp dialogboksen med skriften du bruker mest øverst i listen, trenger du nå bare å trykke hurtigtasten og Enter for å velge din favorittskrift. Samtidig har du kjapp tilgang til dine øvrige favorittskrifter og -størrelser.

Som vanlig anbefaler vi at du selv utfører oppgavene i artikkelen, slik at du lærer mest mulig. Et annet godt råd er å bruke hjelptekstene i VBA aktivt. De inneholder en komplett referanse med gode forklaringer og mange eksempler og kryssreferanser. Skulle du likevel trenge å studere fasiten, kan du laste ned dialogboksen og programkoden herfra.

Et lite forslag til slutt: Hvis du synes bruken av radioknapper blir for begrensende i forhold til å velge skriftstørrelse, kan du i stedet bruke en tekstboks der du skriver inn skriftstørrelsen direkte (du kan fortsatt ha en standardverdi på for eksempel 11 punkter).

Testet i Office XP

Løsningene i denne artikkelen er utviklet og testet i Office XP (Office 2002), men vil fungere omtrent tilsvarende i andre nyere utgaver av Office.


En omvisning i VBA

Office-eksperten

Av Willy Verwoerd | Publisert 17.08 2004 kl. 00:15

For en Office-ekspert er det ingen vei utenom Visual Basic for Applications, og vi har regelmessig skrevet om dette i serien. Men selve utviklingsmiljøet har viktige sider som vi ikke har sett på ennå. Derfor inviterer vi herved på utvidet omvisning i det ukjente Office-programmet.

Alle Office-brukere kjenner til programmer som Word, Excel og PowerPoint. Men inni alle disse, finnes det også et annet fullverdig program som mange ikke oppdager: Visual Basic for Applications – eller VBA til daglig. For å starte VBA, for eksempel i Excel, taster du Alt-F11 eller velger Verktøy/­Makro/­Visual Basic-redigering fra menyen.

Lesere som har fulgt med oss her i Office-eksperten, har allerede vært innom VBA flere ganger for å konstruere dialogbokser og skrive programkode til makroer (se referanser på slutten av artikkelen).

Vi hopper derfor over de grunnleggende verktøyene denne gangen, og nøyer oss med å nevne dem: Project-vinduet holder orden på dialogbokser og programmoduler, Toolbox inneholder kontroller som brukes i dialogbokser og Properties brukes for å sette opp egenskaper i blant annet dialogbokser. Også User­Form-vinduet for design av dialogbokser, og Code-vinduet for arbeid med programkoden er kjent fra før.

Vinduer overalt

Alle verktøyene vi har nevnt ovenfor har hvert sitt vindu i VBA, og i vår omvisning skal vi nå se nærmere på enda flere vinduer med ulike oppgaver.

Vinduene i VBA flyter i utgangspunktet fritt omkring innenfor hovedvinduet, men du kan også gjøre dem dokkbare (eng. Dockable). Vinduet vil da «dokkes» inntil hovedvinduet, skjermkanten eller andre dokkbare vinduer når du flytter dem.

Det er en atferd vi vanligvis ikke liker, men fordelen er at det aktuelle vinduet da kan dras utenfor VBA-vinduet. Dermed kan du enklere se vinduets innhold sammen med applikasjonen du utvikler en løsning for. Du kan gjøre et enkeltvindu dokkbart ved å høyreklikke på det og huke av Dockable, eller du kan bruke menyvalget Tools/Options og skillearket Docking.

Alle vinduene kan slås av og på fra View-menyen. Flere vinduer har også hurtigtaster (se menyen) og verktøyknapper.

De fleste vinduene vi skal se på har tilknytning til feilsøking. Unntaket er Object Browser, som du åpner fra View-menyen eller ved å taste F2. Object Browser (se eksempel i figur 1) er et flott oppslagsverk der du finner alle klasser, egenskaper, metoder, hendelser og konstanter – ikke bare fra tilgjengelige objektbiblioteker, men også fra ditt eget prosjekt.

 

Figur 1. Object Browser er et nyttig oppslagsverk, for eksempel for å finne navn på konstanter.
 

Søkefunksjonen er også svært nyttig, og Object Browser har dessuten et godt samspill med hjelpfunksjonen: Når du har merket et objekt eller et medlem, kan du taste F1 for å få en fyldig forklaring.

Feilsøking

VBA har omfattende støtte for feilsøking. Det er svært viktig, for uansett hvor erfaren du blir, vil programmene dine fra tid til annen inneholde feil som ikke er opplagte og som det kan kreve en del innsats å finne.

For å kunne finne feil, må du blant annet ha muligheten til å legge inn avbrudd i programkoden, du må kunne utføre programmet setning for setning og du må kunne holde et øye med verdien til variabler og uttrykk. VBA har gode løsninger for alt dette.

Med de tre øverste verktøyknappene i figur 2, kan du starte, avbryte eller tilbakestille en makro. Det holder at markøren er i makroen du arbeider med i kodevinduet, den behøver ikke å stå på første linje. Disse tre knappene spiller imidlertid ingen stor rolle for feilsøkingen før du har lagt inn avbrudd i programkoden.

 

Figur 2. Viktige standardknapper for feilsøking, men du bør ha med deg én til (se teksten).
 

Det ordner du ved å plassere markøren i programsetningen der utføringen skal stoppe og bruke verktøyknappen Toggle Breakpoint (se figur 2) eller taste F9. En enda enklere måte er å klikke i den grå margen til venstre for setningen som skal avbrytes.

Når makroen kommer til et avbrudd, fører dette til en pause i utføringen. Makroen stopper altså ikke – det skjer først når du bruker Reset-knappen. Dette innebærer at du for eksempel kan undersøke verdien på én eller flere variabler (eller endre disse), og deretter fortsette utføringen av makroen med Run-knappen eller setning for setning med en av Step-knappene.

Avbruddspunkter er beregnet for feilsøking og blir derfor ikke lagret sammen med makroen. Ønsker du et avbrudd som lagres, kan du legge inn en Stop-setning.

Skritt for skritt

Verktøyknappen Step Into (hurtigtast F8) utfører makroen setning for setning. Ved å gjøre VBA-viinduet mindre, kan du samtidig se hva som skjer i Office-applikasjonen du arbeider med.

Du kan også enkelt sjekke om verdien på en bestemt variabel i makroen er slik du forventer. Det gjør du rett og slett ved å holde markøren over variabelnavnet, som vist i figur 3.

 

Figur 3. I avbruddsmodus kan du holde markøren over en variabel for å se verdien.
 

Knappen Step Over (Skift-F8) fungerer som Step Into, men går ikke innom prosedyrer og funksjoner som kalles fra makroen din. Det sparer mye tid når du er sikker på at en rutine ikke inneholder feil.

For å utføre resten av makroen, bruker du Step Out (Ctrl-Skift-F8) eller Run-knappen (F5). Makroen vil da fortsette til den er ferdig eller til neste avbrudd.

Pass på at du får med deg knappen Step To Cursor (Ctrl-F8), som ikke finnes på verktøylinjen som standard. Den er likevel svært nyttig, fordi den kjører makroen frem til markørens plassering. Du kan tilpasse verktøylinjen ved å høyreklikke på den og velge Tilpass.

Møt lokalbefolkningen

Vi har allerede vist hvordan du kan sjekke en variabel ved å holde markøren over den, men VBA har også andre metoder.

Den enkleste av disse er å åpne Locals-vinduet, som viser verdien av alle lokale variabler som brukes av makroen som utføres for øyeblikket. Verdiene blir automatisk oppdatert etter et avbrudd eller når du gjennomgår makroen med Step-knappene.

Funksjonen Add WatchDebug-menyen er et langt kraftigere verktøy, der du kan sette opp avanserte overvåkinger av makroen din. Den enkleste bruksmåten er å legge inn et bestemt variabelnavn i feltet Expression, som vist i figur 4. Hvis markøren står i et variabelnavn eller uttrykk i programkoden, blir dette automatisk foreslått.

 

Figur 4. Add Watch er et kraftig verktøy for å overvåke hva som foregår i en makro.
 

Merk deg at feltnavnet Expression er bokstavelig ment: Her kan du gjerne legge inn mer eller mindre kompliserte uttrykk. Hvis du for eksempel vil at makroen din skal gå i avbruddsmodus når variabelen Antall blir større enn 20, legger du inn uttrykket

Antall > 20

og velger Break When Value Is True under Watch Type.

Som du ser, kan du også aktivere et avbrudd når verdien til en variabel eller et uttrykk endrer seg. Uttrykk kan dessuten gjerne inneholde funksjoner, se hjelpteksten.

Resultatene av alle Watch-uttrykkene dine vises i Watch-vinduet. Om du vil, kan du starte med en Quick Watch først ved å taste Skift-F9­ når markøren står i en variabel eller et uttrykk. Fra vinduet som vises nå, kan du eventuelt gå videre til Add Watch.

Løpende rapportering

En annen måte for å følge med på variabler eller uttrykk er å rapportere utviklingen underveis uten å avbryte makroen. Det kan du gjøre ved å vise en meldingsboks, men det kan ofte bli masete, siden du må klikke OK for å bekrefte den. En bedre måte er å «skrive ut» verdiene du trenger ved å bruke kommandoen Debug.Print i makroen, for eksempel:

Debug.Print Antall

Kommandoen sender resultatene sine til Immediate-vinduet.

Her kan du også selv se verdien av uttrykk ved å skrive et spørsmålstegn foran dem. Du kan til og med skrive inn programsetninger som utføres direkte som om de inngikk i makroen du jobber med. Det kan du for eksempel bruke for å teste nye programsetninger før du legger dem inn i makroen.

To tips til slutt: Du kan dra både variabelnavn og uttrykk fra makrokoden til Watch- eller Immediate-vinduet med musen. I vinduer som viser variabelverdier (deriblant Locals), kan du endre verdien, slik at makroen fortsetter med din korrigerte verdi.

Dermed har vi vært innom en del av de viktigste områdene i VBA, og vår tilmålte omvisning er over. Men akkurat som med andre omvisninger, har du bare fått et overblikk. For å forstå mulighetene, nytter det ikke å lese denne artikkelen på senga. Du må definitivt prøve ut funksjonene på egen hånd og samtidig bruke hjelpen i VBA flittig. Begge deler vil gi deg god uttelling!

Tidligere artikler

Følgende tidligere publiserte artikler er nyttig lesestoff for å få mest mulig utbytte av denne artikkelen (utgave i parentes):

«Dialoger på boks», del 1 og 2 (13 og 14/2003), «Dialogbokser i Excel» (2/2004), «Mer om dialogbokser» (5/2004). Disse artiklene finner du her.

Testet i Office XP

Løsningene i denne artikkelen er testet i Office XP (Office 2002), men vil fungere omtrent tilsvarende i alle nyere utgaver av Office.


Følg begivenhetene i Outlook

 

Av Willy Verwoerd | Publisert 24.09 2004 kl. 00:12

Både i Outlook selv og i alle objektene og elementene den tar hånd om, foregår det mange hendelser som du kan fange opp og utnytte med egen programkode. Teknikken er ikke helt triviell, men vi hjelper deg over terskelen med et eksempel.

Vi går denne gangen litt mer i dybden enn vanlig, så dette er ikke stedet å starte hvis du aldri har brukt Visual Basic for Applications (VBA) før. Da anbefaler vi at du først bruker en del tid på å lese (og ikke minst: utføre oppgavene) i tidligere artikler om VBA i Office-eksperten. Se denne siden for en oversikt over disse.

Outlook (og Access) er ikke på langt nær så enkel å automatisere som Word, Excel og PowerPoint. Det skyldes at du ikke kan registrere makroer. Makroregistrering er en rask og enkel teknikk, og en registrert makro vil ofte gjøre jobben du er ute etter. Hvis ikke, kan du finpusse den i VBA. Men trenger du en makro i Outlook, må du skrive den selv.

Fraværet av makroregistrering er nært knyttet til at også brukergrensesnittet i Outlook er langt mindre tilgjengelig for automatisering. Mens du for eksempel i Excel enkelt kan registrere menyvalg og valg i dialogbokser i en makro, må du i Outlook programmere slike ting selv – hvis det er tilgjengelig for programmering overhodet.

Hva skjer?

Du må altså jobbe litt mer for å få Outlook til å gjøre det du ønsker, men likevel er VBA også her et svært kraftig verktøy for å automatisere vanlige oppgaver eller utvide funksjonaliteten. Dette har vi tidligere sett på i artikkelen «Bedre Office-samarbeid med VBA». Der brukte vi VBA både for å utbedre en svakhet i Outlook og for å styre Word fra Outlook for å få god formatering og utskrift.

Denne gangen skal vi introdusere deg til hendelser (eng. Events) i Outlook. Akkurat som overalt ellers, skjer det ting i Outlook hele tiden. Alt dette er hendelser, og mange av dem kan du fange opp i din egen programkode. Du kan for eksempel bruke hendelsen Start­up for å utføre visse oppgaver hver gang Outlook starter.

Hendelser i Outlook kan inntreffe på forskjellige nivåer, tilsvarende programmets objektmodell. Det øverste nivået er applikasjonsnivået (objektet Application).

Neste nivå er mapper, utforskere og såkalte inspektører (eng. In­spec­tors) – de ulike verktøyene som viser en bestemt elementtype (oppgaver vises for eksempel på en annen måte enn notater). På laveste nivå finner vi elementhendelser for selve elementene i Outlook, som meldinger, avtaler og oppgaver.

Håndteringen av hendelsene blir mer kompleks jo lavere nivå du arbeider på, og i denne omgangen stopper vi derfor på mellomnivået. Det representerer likevel en fullt respektabel utfordring for vordende Office-eksperter.

Eksempler på applikasjonshendelser er Start­up (allerede nevnt), New­Mail (utløses når ny e-post ankommer) og Re­min­der, som inntreffer når en påminnelse blir aktivert.

På mellomnivå finnes for eksempel Item­Add og Item­Change, som inntreffer i mapper når et element blir tilføyd eller endret, og Be­fore­Fol­der­Switch, som utløses når en bruker skifter mappe, men før skiftet er utført.

På elementnivå (for eksempel en e-postmelding) kan du bruke en rekke hendelser som Open, Close, Read, Send, Re­ply og så videre. Det betyr at du har store muligheter for å gripe inn i brukerens arbeidsgang i Outlook og utføre tilpasninger, forbedringer og kontroller.

En god del hendelser kan avbrytes. Hvis e-post til en bestemt mottaker for eksempel alltid skal ha vedlegg, kan du sjekke dette med hendelsen Item­Send. Mangler vedlegget, kan du gi beskjed til brukeren og avlyse sendingen ved å sette Cancel til True.

Hendelser i praksis

Applikasjonshendelser er enkle å bruke. For å sette opp en applikasjonshendelse i Outlook, åpner du kodevinduet i modulen This­Out­look­Ses­sion. Klikk på listen øverst til venstre og velg App­li­ca­tion. Deretter kan du klikke i listen til høyre for å se alle tilgjengelige hendelser som vist i figur 1.

 

Figur 1. Applikasjonshendelser er enkle å ta i bruk.
 

Når du har valgt en hendelse i listen, blir den automatisk satt inn i kodevinduet med riktig navn og syntaks. Så er det opp til deg å skrive inn programkoden som utfører det du ønsker.

Hendelser på lavere nivå trenger et mer innfløkt støtteapparat, men når rammeverket først er på plass, får du pålitelige løsninger som du enkelt kan bygge videre på.

Vi skal forklare teknikkene med et eksempel fra virkeligheten: Vi bruker Outlook-oppgaver aktivt for å holde oversikten over ting som skal gjøres, og sorterer oppgavene etter forfallsdato. Men av og til blir forfallsdatoen glemt ved innlegging av en ny oppgave. Da kan også selve oppgaven lett bli glemt, fordi den havner helt i begynnelsen av listen istedenfor blant andre oppgaver med samme forfallsdato.

For å sikre at nye oppgaver alltid får en forfallsdato, kan vi bruke hendelsen Item­Add, som utløses hver gang det blir lagt inn en ny oppgave i oppgavemappen. Denne hendelsen er knyttet til Items-objektet, som inneholder elementene i en mappe, i vårt tilfelle oppgavene i oppgavemappen.

Tre trinn

Mens hendelser i applikasjonsobjektet som nevnt er tilgjengelig uten videre, må objekthendelser settes opp eksplisitt. Arbeidet med dette består av tre trinn:

1. Deklarere et håndteringsobjekt som fanger opp hendelsene for objekttypen vi skal arbeide med.

2. Initiere det deklarerte objektet.

3. Skrive prosedyrer for spesifikke hendelser.

Håndteringsobjektet må legges i en klassemodul (eng. Class Module). Standardmodulen This­Out­look­Ses­sion er selv en klassemodul, men det er ryddigere å bruke en egen klassemodul for hver objekttype.

Opprett en ny klassemodul med menyvalget Insert/Class Module i VBA. Gå deretter til egenskapsvinduet, og gi den nye modulen navnet Ele­ment­Hen­del­ser.

Programkoden for klassemodulen er vist i figur 2. Merk at vi alltid bruker Op­tion Ex­pli­cit for å slå på obligatorisk deklarering av variable, en god vane og god hjelp for å unngå problemer med feil variabelnavn.

 

Figur 2. Programkode for klassemodulen ElementHendelser.
 

Neste linje deklarerer objektvariabelen ol­Ele­men­ter som et Items-objekt, samtidig som With­Events angir at objektets funksjon er å håndtere hendelser.

Prosedyren Init­Ele­men­ter blir en metode for klassemodulen. Den oppretter selve objektet og knytter det til standardmappen Oppgaver. Det oppnår vi med metoden Get­De­fault­Fol­der og parameteren ol­Fol­der­Tasks, som står for oppgavemappen.

Selve håndteringsobjektet er nå på plass i form av vår egen objekttype med navnet Ele­ment­Hen­del­ser. Men akkurat som andre objekter, eksisterer det ikke (og kan derfor heller ikke fange opp hendelser) før det er blitt opprettet.

Løsningen vår skal alltid være i drift når vi bruker Outlook, og derfor oppretter vi objektet fra Outlooks Startup-hendelse som vist i figur 3. Dette sikrer at objektet – og dermed håndteringen av dets hendelser – alltid er aktivt etter at Outlook er startet. Merk at Startup-rutinen og den tilhørende deklarasjonen av variabelen E­Hen­del­ser ligger i This­Out­look­Ses­sion.

 

 
 

Begivenheten inntreffer

Selve rammeverket for å takle hendelser i mappen Oppgaver er nå på plass, men ingenting skjer før vi faktisk lager hendelsesprosedyrer. Gå tilbake til klassemodulen, og velg ol­Ele­men­ter fra listen til venstre og Item­Add fra listen til høyre.

VBA legger nå automatisk inn skjelettet for den andre prosedyren i figur 2. Rutinen blir utløst hver gang det blir lagt inn et nytt element i oppgavemappen, og den nye oppgaven blir overført som Item.

Vi bruker variabelen Opp­gave for å arbeide med den nye oppgaven og sjekke forfallsdatoen Due­Date. Outlook setter denne til 1.1.4501 (!) hvis brukeren ikke angir noen forfallsdato. Vi sjekker derfor om årstallet er større enn 3000 og bruker funksjonen Year for å sikre at det fungerer uansett regionale innstillinger.

Hvis forfallsdatoen mangler, setter vi den ganske enkelt til Now (i dag) og lagrer den endrete oppgaven med Save. Siden dette blir utført for hver nye oppgave, vil våre oppgaver fra nå av alltid ha en forfallsdato.

Den siste rutinen i figur 2 har ingen nytte overhodet, men er tatt med for å skape litt action og demonstrere hendelsen Item­Chan­ge: Hver gang en oppgave blir endret, får du en melding om dette. Du oppretter rutinen på samme måte som Item­Add – og vil antagelig snart ønske å slette den igjen. :-)

Viktig: Før du kan teste de nye rutinene, må du restarte Outlook, slik at Startup-hendelsen blir utløst og håndteringsobjektet initiert. Alternativt kan du under testingen kjøre Startup-rutinen direkte i VBA for å oppnå dette.

Du finner programkoden for denne artikkelen her, men bruk den bare hvis du står helt fast. Hvis du er her for å lære, bør du selv utføre oppgavene og skrive inn programkoden manuelt. For å lære mer om mulighetene og hvilke hendelser som finnes, kan du søke på «events» i hjelpen for VBA.

Hvorfor Office XP?

Vi har fått spørsmål om hvorfor artiklene i Office-eksperten bygger på Office XP og ikke Office 2003, som jo er siste versjon. Det skyldes vårt ønske om at stoffet i både Office-eksperten og tipsspalten for øvrig skal være til praktisk nytte, heller enn å vise frem mulighetene i nye versjoner.

Vi prøver derfor å treffe noenlunde på versjoner som flest mulig lesere bruker. Siden det vanligvis tar en god del tid før nye versjoner er blitt utbredt, tar stoffet vårt som regel utgangspunkt i nestsiste versjon. Når det gjelder Office, er tiden antagelig snart moden for å ta i bruk Office 2003 også i spalten.

 

Testet i Outlook XP

Løsningene i denne artikkelen er utviklet og testet i Outlook XP (Outlook 2002), men teknikkene vil fungere tilsvarende i Outlook 2000 og nyere.


Bedre eksport fra Excel

Office-eksperten

Av Willy Verwoerd | Publisert 19.11 2004 kl. 09:33

Pussig nok har Excel – av alle programmer – ingen funksjon for å eksportere data som ekte, komma-delte tekstfiler. Vi presenterer derfor en makro som gjør denne jobben på en elegant måte. Samtidig lærer du deg flere nyttige programmeringsteknikker.

Kommadelte datafiler er et gammelt og populært format for å utveksle data mellom ulike programmer, spesielt databaseprogrammer og regneark. En kommadelt datafil (eng. Comma Separated Values) inneholder bare ren tekst, og kan derfor enkelt leses av alle typer programmer. Bakgrunnen for navnet er at dataverdiene (datafeltene) i filen er atskilt med komma.

Enten dataene befinner seg i en database eller et regneark, er de logisk sett representert som tabeller som består av rader og kolonner. Hver datapost tilsvarer derfor en rad som inneholder én eller flere dataverdier, for eksempel tekst eller tall. I tillegg kan det finnes en overskriftsrad.

I følge reglene for dette filformatet, skal et felt som selv inneholder komma settes i anførselstegn. Dette sikrer at kommaet i feltet ikke feiltolkes som skille mellom to verdier.

Tekstverdier inneholder ofte komma, og komma brukes også som desimaltegn i Norge og mange andre land. Det er derfor like greit å sette alle dataverdier i anførselstegn, enten det dreier seg om tekst eller tall. En rad med tre verdier kan da for eksempel se slik ut:

"100","stk.","7,55"

Excel kan riktig nok eksportere til tekstfiler med lignende formater, der tabulator eller semikolon brukes som skilletegn. Men det mest grunnleggende kommaformatet er altså ikke tilgjengelig.

Likevel har minst én Microsoft-ansatt tenkt på saken. På et av Microsofts nettsteder kom vi nemlig over en makro som eksporterer et merket område i et regneark til en kommadelt fil. Vi har tilpasset og forbedret denne makroen, og du finner den i figur 1.

 

Figur 1. Makro for å eksportere et merket område til en kommadelt tekstfil.
 

Makroen

Som vanlig starter makroen med Dim-setninger som definerer variablene vi skal bruke. Du bør alltid definere variabler, fordi dette gjør programmet lettere å forstå for andre (og deg selv tre måneder senere!) og hindrer feil som skyldes at variabelnavn er feilstavet.

For å sikre at Visual Basic for Applications (VBA) sjekker dette, bruker du Tools/Options og slår på Require Variable Definition. Du kan også sette inn linjen Options Explicit øverst i programkoden.

Vi skal ikke gå nærmere inn på hvordan du legger inn en makro, siden dette er gjennomgått tidligere i serien Office-eksperten. Du finner en oversikt over disse her.

Anførselstegn er et sentralt innslag i jobben vi skal gjøre, men også et problem. VBA bruker nemlig selv anførselstegn i forbindelse med tekststrenger, så hvordan skal vi sette et anførselstegn i anførselstegn? Det lar seg gjøre ved å bruke fire (!) anførselstegn etter hverandre, men vi synes det er ryddigere med en egen variabel som vi har kalt Anf­Tegn. Den settes til tegnkoden 34, som tilsvarer anførselstegnet.

Neste skritt er å be brukeren om navnet på filen som dataene skal eksporteres til. Når du trenger informasjon fra brukeren av en makro, kan du bruke funksjonen In­put­Box. Resultatet ser du i figur 2. Dette fungerer helt fint, men har i vårt tilfelle også noen ulemper. Det skal vi fikse senere i artikkelen.

 

Figur 2. Funksjonen Input­Box er fin når du skal be brukeren om informasjon, men har rom for forbedring.
 

Hvis brukeren ikke oppgir noe filnavn eller avbryter dialogen, vil filnavnet være tomt. I så fall avsluttes makroen med End.

Hvis det derimot ble oppgitt et filnavn, skal vi opprette en ny fil med dette navnet. For å arbeide med filer, trenger vi først et unikt filnummer, som vi får tildelt med funksjonen Free­File.

Før vi prøver å opprette filen, slår vi av feilhåndteringen i VBA med setningen On Error Resume Next. Det betyr at vi (midlertidig) skal ta oss av eventuelle feilmeldinger selv, istedenfor å overlate det til VBA. Dette gir oss muligheten til å vise brukeren en feilmelding hvis det blir problemer med å opprette filen.

Hvis alt gikk bra, slår vi på VBAs egen feilhåndtering igjen med On Error Goto 0.

Dobbel løkke

Dermed er vår nye tekstfil åpen og klar for bruk, og vi kan gå løs på selve kjernen i makroen. Som nevnt skal vi eksportere et merket område i regnearket. Når du skal eksportere data, må du altså først merke dem og så starte makroen.

Siden vi skal gjøre en del forskjellige operasjoner med det merkede området, bruker vi With Selection for å spare skrivearbeid og gjøre makroen mer lesbar. Istedenfor å skrive for eksempel Selection.Rows.Count, slipper vi nå unna med .Rows.Count (pass på å få med punktumet i starten!).

Dataområdet består av rader og kolonner, og vi lager derfor to For-Next-løkker som gjennomgår alle cellene i det merkede området. Den ytterste løkken gjennomgår radene, mens den indre løkken tar for seg de enkelte kolonnene i hver rad. Egenskapene .Rows.Count og .Columns.Count forteller oss hvor mange rader og kolonner området består av.

For å skrive dataene til filen, bruker vi kommandoen Print #FilNr. Når denne kommandoen avsluttes med et semikolon, vil neste Print-kommando fortsette på samme linje. Mangler semikolonet, blir det linjeskift.

Dette bruker vi midt i løkken for å skrive én og én dataverdi til filen. Etter hver verdi skriver vi enten et komma eller et linjeskift, avhengig av om vi har kommet til den siste kolonnen eller ikke. Etter at begge løkkene er fullført, lukker vi filen helt til slutt i makroen.

Løkkene våre er gode eksempler på hvordan du kan bruke VBA for å arbeide med data i et regneark. Egenskapene og metodene vi bruker er stort sett selvforklarende, men du bør absolutt slå dem opp i hjelpteksten for VBA slik at du fullt ut forstår mulighetene: Sett markøren i et stikkord (for eksempel Cells) og tast F1. Se også kommentarene i programkoden.

Makroen kan kjøres ved å taste Alt-F8 og velge den fra listen. Hvis du regner med å bruke den regelmessig, bør du lage en verktøyknapp og/eller en hurtigtast til den – se tidligere artikler i serien.

For å importere kommadelte filer til Excel, bruker du menyvalget Data/Importer eksterne data. Velg deretter Importer data og følg veiviseren. Samme teknikk brukes også for andre typer tekstfiler.

Mer eleganse

Som nevnt er InputBox en bra funksjon for å be om informasjon fra brukeren. I vårt tilfelle er vi imidlertid ute etter et filnavn, og da er denne løsningen egentlig for primitiv. Den har ingen mulighet for å navigere i mapper, og du må derfor selv skrive hele filbanen og filnavn med filtype fullt ut. Det er ikke bare tungvint, men det er også fort gjort å skrive feil.

Det vi ønsker oss er en ordentlig fildialog, akkurat som når vi ellers lagrer filer, for eksempel fra Excel. Slike dialoger er tilgjengelig fra VBA, og du har stor grad av innflytelse på hvordan de brukes.

Applikasjonsobjektet i Excel tilbyr metoden Get­Save­As­File­name, som er skreddersydd for jobben. Figur 3 viser hvordan den brukes. For å sette inn denne programkoden i makroen, stryker du de fire linjene under kommentaren «Be brukeren om filnavn». Så setter du inn programkoden fra figur 3 på samme sted.

 

Figur 3. Metoden Get­Save­As­File­name er et langt bedre verktøy for å arbeide med filnavn.
 

Metoden har fire parametere, og vi bruker alle unntatt den tredje. Første parameter heter Ini­tial­File­name og kan brukes for å foreslå et filnavn eller en filtype. Vi bruker *.csv slik at eventuelle eksisterende kommadelte filer vises i dialogboksen. Hvis du utelater denne parameteren, brukes arbeidsbokens nåværende filnavn.

Den andre parameteren File­Filter består av en tekstdel og et filtype-filter. Begge vises til brukeren i fildialogen, og sistnevnte sikrer at filene våre blir av typen *.csv.

Tredje parameter (se hjelpteksten) styrer bruken av standardfiltere, mens fjerde parameter Title spesifiserer teksten i toppen av dialogboksen.

Metoden returnerer enten en komplett filbane med gyldig filnavn eller teksten «False» hvis brukeren avbrøt dialogen. I så fall avslutter vi makroen, akkurat som i første variant av løsningen.

Resultatet av forbedringen ser du i figur 4. Den nye metoden er langt mer brukervennlig, og gir full tilgang til alle hjelpemidler for håndtering av filer og mapper. Dessuten sikrer den at brukeren oppgir et lovlig filnavn.

 

Figur 4. Med en standard fildialog, blir makroen både mer brukervennlig og sikrere – og penere. (Klikk for større bilde)
 

Programkoden for makroen kan lastes ned her, men hvis du er her for å lære deg VBA, får du ikke lov. Når du skriver inn makroen selv, vil du nemlig få en vesentlig bedre forståelse av hvordan den fungerer enn ved å kopiere den fra artikkelen. I tillegg bør du som nevnt bruke hjelpteksten flittig for å slå opp de ulike elementene vi bruker. Lykke til!

Testet i Excel XP og 2003

Løsningene i denne artikkelen er utviklet og testet i Excel XP (Excel 2002) og Excel 2003.


Klar for sending?

 

Av Willy Verwoerd | Publisert 09.12 2004 kl. 01:48

Reglene i Outlook gir omfattende muligheter for automatisk håndtering av e-posten din, men de har osgå sine klare begrensninger. Det gjelder spesielt ved sending av meldinger, men tar du i bruk Visual Basic for Applications til dette, åpner det seg en ny verden.

For å arbeide med regler i Outlook 2003, velger du Verktøy/Regler og varsler fra menyen (Regelveiviser i tidligere versjoner). Du kan nå konstruere regler enten fra grunnen av eller basert på ferdige maler.

Du vil raskt se at mulighetene ved sending av meldinger er atskillig mer begrenset enn ved mottak. Dessuten blir reglene først aktivert etter at meldingen er sendt – du kan ikke gripe inn før de sendes. Ved å bruke en innebygd hendelse (eng. Event) i Outlook og programmere denne i Visual Basic for Applications (VBA) etter behov, får du imidlertid full kontroll over meldinger du sender.

For å lære mer om hendelser i Outlook, bør du først lese artikkelen «Følg begivenhetene i Outlook». I artikkelen «Ditt eget regelvelde» kan du lære mer om Outlook-regler. Har du ikke noen VBA-erfaring fra før, bør du dessuten lese våre tidligere artikler som introduserer deg til VBA. Du finner en oversikt over disse her.

Vern dine venner

Uønsket e-post eller spam er blitt et alvorlig problem, og du bør derfor passe godt på at e-postadressen din ikke kommer på avveie. Men enda viktigere er det å beskytte adressene til dine venner og forretningsforbindelser.

En vanlig tabbe blant uerfarne e-postbrukere er å plassere alle mottakere i Til-feltet, uansett hvor mange det dreier seg om. Resultatet av dette er at alle adressene er synlige for og derfor blir distribuert til alle mottakere. Hvis det for eksempel gjelder en kundeliste, betyr det altså at alle kundene får tilgang til hele kundelisten din – og står fritt til å utnytte den til egne formål.

Skaden er ikke så stor hvis det dreier seg om fem eller ti mottakere, men det er ikke uvanlig at meldinger sendes til hundrevis av mottakere på denne måten. De færreste kunder vil sette pris på at du sender deres e-postadresse til uvedkommende, så dette er mildt sagt et dårlig trekk for å opparbeide gode kundeforhold.

For å unngå dette, må du alltid bruke Blindkopi-feltet når du sender meldinger til mottakere som ikke kjenner hverandre. Dette sikrer at hver enkelt mottaker bare kan se sin egen adresse, og ikke adressene til andre mottakere. Hvis dette feltet ikke vises når du starter en ny melding, kan du aktivere det med Vis/Felt for blindkopi.

Med denne problemstillingen som bakgrunn, skal vi lage en VBA-rutine som sjekker antall mottakere i Til- og Kopi-feltet, og flytter dem til Blindkopi-feltet hvis det er for mange. Dermed styrer du unna pinlige tabber som kan gi deg lav anseelse hos dine forbindelser.

ItemSend

Nøkkelen til vår løsning og alle andre oppgaver der du ønsker å fange opp sending av meldinger, er applikasjonshendelsen Item­Send. For å legge inn denne rutinen, åpner du Visual Basic-redigering ved å taste Alt-F11. I prosjektvinduet i VBA, dobbelklikker du på modulen This­Out­look­Session slik at kodevinduet åpnes.

I kodevinduet velger du først Application i listen øverst til venstre, og deretter Item­Send i listen til høyre. Outlook legger nå inn et skjelett for Item­Send-rutinen der du kan skrive programkoden som skal løse oppgaven.

Item­Send har to parametere: Item inneholder selve meldingen som skal sendes, mens Cancel kan brukes for å avbryte sendingen.

 

Figur 1. Denne VBA-rutinen hindrer deg i å begå pinlige e-posttabber. (Klikk for større bilde)
 

Vår rutine er vist i figur 1, og vi skal se på hvordan den virker. Som nevnt blir alle adresser du legger inn i Til-feltet eller Kopi-feltet i en melding, synlige for alle mottakere av meldingen. Finner vi for mange slike synlige adresser, skal vi hindre at de blir tilgjengelig for uvedkommende ved å flytte adressene til Blindkopi-feltet.

Rutinen starter med konstanten Grense, som angir det maksimale antallet synlige adresser som vi kan akseptere. Hvis antallet er høyere, blir alle adressene flyttet til Blindkopi-feltet etter at brukeren har fått en melding og godkjent flyttingen.

Vi sjekker også om det finnes én eller flere distribusjonslister blant adressene. Distribusjonslister inneholder normalt en del adresser. Derfor er dette i seg selv nok til at vi aktiverer flyttingen av adresser, uansett hvor mange synlige adresser som ellers finnes.

Programkoden fortsetter med Dim-setninger som definerer de fem variablene vi trenger: Mottaker brukes for å arbeide med hver enkelt mottaker, Antall­Synlig teller opp antall synlige mottakere, Distrib blir sann hvis det er en distribusjonsliste blant adressene, Adr­Type brukes for å sjekke dette, mens Svar håndterer brukerens svar på meldingsboksen.

To oppgaver

Etter at de to variablene Antal­lSynlig og Distrib er satt til sine startverdier, kan rutinen påbegynne selve arbeidet. Jobben består av to oppgaver: Først teller vi opp antall adresser i feltene Til og Kopi. Hvis det finnes en distribusjonsliste blant adressene, blir Distrib satt til True.

Siden hele rutinen arbeider med meldingen (Item), har vi pakket inn alle setningene i en With Item-setning, slik at Item er lett tilgjengelig overalt.

Hver melding har en samling (eng. Collection) med navnet Recipients som inneholder meldingens mottakere. Vi kan derfor lage en For Each-løkke som ser nærmere på alle mottakere av typen Til (olTo) eller Kopi (olCC, eng. «Carbon Copy»). For hver mottaker vi finner i et av de to feltene, øker vi telleren med 1.

Deretter bruker vi egenskapen Address­Entry.Dis­play­Type for å sjekke om adressetypen er en distribusjonsliste. Det er tilfellet hvis den har verdien ol­Dist­List eller o­lPr­ivate­Dist­List.

Med løkken har vi nå kartlagt to ting: Hvor mange synlige mottakere meldingen har, og om det finnes én eller flere distribusjonslister blant adressene. Hvis det finnes flere synlige mottakere enn grensen vår eller vi har funnet minst én distribusjonsliste, flytter vi samtlige adresser til Blindkopi-feltet.

Det ville være litt uhøflig å gjøre dette uten videre, og vi har derfor laget en meldingsboks som informerer brukeren om hva vi har funnet. Meldingsboksen er vist i figur 2.

 

Figur 2. Brukeren får beskjed når meldingen har for mange synlige mottakere.
 

Brukeren kan godkjenne flyttingen av adresser ved å klikke OK. Alle adressene fra Til- og Kopi-feltene blir da flyttet til Blindkopi-feltet og meldingen sendes.

Klikker brukeren Cancel, blir sendingen avbrutt ved å sette parameteren Cancel til True. Brukeren kommer da tilbake til den usendte meldingen, og kan selv endre mottakerne og deretter prøve å sende meldingen på nytt.

Flyttingen til Blindkopi-feltet er enkel å utføre: Vi gjennomgår på nytt alle mottakerne med en For Each-løkke. Hvis mottakeren er av typen olTo eller olCC, settes typen i stedet til olBCC (eng. «Blind Carbon Copy»).

Noen utfordringer

Rutinen vår gjør en god jobb, men har også et par svakheter. Hvis meldingen har flere mottakere enn grensen, og du ikke vil plassere disse i Blindkopi-feltet, får du rett og slett ikke sendt meldingen (for eksempel en melding til seks venner som alle kjenner hverandre og allerede har hverandre e-postadresse).

En annen kosmetisk svakhet er at Outlook 2003 legger din egen avsenderadresse i Til-feltet når du sender meldinger som blindkopier. Det er bedre å bruke et mer beskrivende mottakernavn i Til-feltet, som for eksempel «Våre kunder» (men fortsatt med din egen adresse). Mottakerne forstår da at meldingen også er sendt til andre enn dem selv.

Begge disse punktene kan rettes med noen ekstra programsetninger, og vi foreslår at du tar utfordringen. Det vil være gode øvelser for å bli bedre kjent med VBA og objektmodellen i Outlook. Bruk hjelpfilen for å finne frem, og ta kontakt for å få noen hint om du blir stående helt fast.

Som vanlig bør du også skrive inn denne rutinen selv, slik at du blir godt fortrolig med å skrive VBA-kode. Hvis du eventuelt trenger å sjekke at alt er korrekt, kan du laste ned programkoden her.

Testet i Outlook 2003

Løsningene i denne artikkelen er utviklet og testet i Outlook 2003, men vil så vidt vi vet fungere tilsvarende i Outlook XP.


Lag fakturaen med Word, del 1 av 2

 

Av Willy Verwoerd | Publisert 07.01 2005 kl. 00:45

I to deler skal vi se på hvordan du kan bruke Word for å fylle ut, beregne og skrive ut profesjonelle fakturaer. Underveis i prosjektet lærer du teknikker som du kan bruke på mange andre områder også.

Hvis du driver næringsvirksomhet av litt omfang, bør du anskaffe et regnskapsprogram med faktureringsmulighet, og bruke dette til å fakturere dine kunder. Det finnes flere gode og rimelige programmer på markedet – se vår test «9 rimelige regnskapsprogrammer».

 

Figur 1. Lær hvordan du kan produsere profesjonelle fakturaer med Word. (Klikk for større bilde)
Trenger du derimot bare å sende en faktura en gang i blant, kan Word være en veldig god løsning. Ved å bruke forhåndstrykte giroblanketter, kan du lage lekre fakturaer som vil gjøre et godt inntrykk på dine kunder. Slike blanketter finnes også med medlemskort som egner seg bra for foreninger. Ved å kombinere Words flettemuligheter med det du lærer i våre to artikler, kan du sende ut kontingentkravene på et blunk. 

Vår favorittblankett for fakturering kommer fra Wittusen og Jensen (www.wj.no), og har varenummer 840.020. Dette er en pen og nøytral blankett med blå bakgrunn, som passer fint til både fakturering og purringer. Vi skal bruke denne blanketten i prosjektet vårt, og ferdig utfylt ser den ut som i figur 1.

Forutsetningen for å ha utbytte av artiklene, er at du har arbeidet deg gjennom våre tidligere artikler om dialogbokser og Visual Basic for Applications (VBA). Du finner en oversikt over disse artiklene her.

God hjelp fra skanneren

En vanlig teknikk for å sette opp en Word-mal for utfylling av forhåndstrykte blanketter, er prøving og feiling: Man starter med å plassere tekster og felter i noenlunde riktige posisjoner, og etter mange forsøk og utskrifter har alt til slutt havnet på riktig plass.

Vi skal bruke en langt bedre og morsommere metode: Vi skanner inn blanketten, og bruker den som bakgrunn mens vi konstruerer malen. Dette gjør det svært mye enklere å plassere alle elementene på rett plass, og du vil allerede ved første forsøk ha et resultat som bare trenger finjustering for å bli perfekt.

Hvis du bruker vinduskonvolutter, bør du markere plasseringen av vinduet på blanketten før du skanner den. Pass på å ta rom for at blanketten kan flytte seg i konvolutten mens den er i posten, slik at du markerer et område som alltid er synlig. Tegn dette inn med en sort penn eller tusj, slik at det vises tydelig etter skanningen.

Vi har lagt ut den skannede blanketten i Filguiden på våre Web-sider, slik at du kan utføre oppgavene i artikkelen selv om du verken har blanketter eller skanner. Se slutten av artikkelen.

Start med å opprette et nytt Word-dokument som du lagrer som mal. Du kan for eksempel kalle den «Faktura.dot». Vi legger den skannede blanketten inn som topptekst. Fordelen med dette er både at den da befinner seg bak teksten, og at den får en lysere tone som gjør det enklere å se tekstene vi selv skal legge inn.

Velg Vis/Topptekst og bunntekst fra menyen, og plassér markøren i toppteksten. Bruk deretter Sett inn/Bilde/Fra fil for å sette inn filen med den skannede blanketten. Klikk i bildet slik at det er merket, og velg Format/Bilde fra menyen. Velg skillearket Oppsett, og angi at bildet skal plasseres Bak teksten.

Du kan nå fritt plassere bildet på siden, og dra ut hjørnene for å sikre at den innskannede blanketten fyller nøyaktig hele arket. Ta en utskrift for å sjekke at malen og originalblanketten stemmer nøyaktig overens (legg de to arkene sammen og hold dem mot lyset for å kontrollere dette).

Når du er fornøyd, bruker du igjen Vis/Topptekst og bunntekst for å gå tilbake til vanlig tekst i dokumentet. Du kan også bruke knappen Lukk i verktøylinjen for topptekst og bunntekst.

Klart for tekst

Nå er alt klart for å begynne jobben med selve malen. Det første vi skal gjøre, er å legge inn faste tekster og forskjellige ledetekster som vist i figur 1. I første omgang gjelder det opplysningene om din egen virksomhet.

Øverst på arket legger du inn navn, adresse, telefonnummer o.l. Pass på å få med organisasjonsnummeret hvis du har et registrert foretak (dette er påbudt). Du kan også gjerne legge inn firmalogoen. Vi har plassert den i en ramme (bruk knappen Sett inn ramme på verktøylinjen Skjema), slik at den kan plasseres fritt på arket.

Til høyre for vindusfeltet som brukes til mottakerens navn og adresse, legger du inn ledetekster for fakturadato og forfall. Bruk høyrestilte tabulatorer for å plassere disse, og deretter vanlig tabulator et lite stykke videre på samme linje for plassering av selve datoene.

Til datoen har vi satt inn feltet Create­Date med menyvalget Sett inn/Felt (hurtigtast Ctrl-F9). Fakturaen får da datoen da den ble opprettet, noe som sikrer at den beholder samme dato hvis du senere trenger å skrive ut en kopi. Samme felt brukes også på girodelen under «Betalingsinformasjon».

Nederst på fakturadelen, til venstre for kvitteringen, har vi satt inn tre ledetekster som spesifiserer nettobeløp ekskl. mva., merverdiavgift og beløpet som skal betales (se figur 1). Her bruker du høyrestilt tabulator for å plassere både ledetekstene og beløpene.

Nederst til høyre på kvitteringsdelen legger du inn ditt eget kontonummer. Dette skal også stå i beløpslinjen nederst på giroen under «Til konto». Til slutt legger du inn ditt eget firmanavn og adressen din i feltet «Betalt til» på giroen.

Justeringer

Særlig i det siste punktet, er det viktig at elementene plasseres helt nøyaktig der de skal skrives ut på blanketten. Den vannrette plasseringen er enkel å ordne med vanlige tabulatorer (hold Alt-tasten nede for finjustering), mens loddrett justering krever litt mer nøyaktighet og innsats:

Utfør først grovjusteringen ved å sette inn eller fjerne tomme linjer etter behov. For å finjustere de enkelte linjene der innholdet skal treffe felt i blanketten, merker du den aktuelle linjen. Bruk deretter Format/Avsnitt for å finjustere avstanden før linjen. Med denne funksjonen kan du plassere en linje nøyaktig i høyden ved å justere antall punkter før linjen.

Dermed er vi ferdig med alle faste tekster og ledetekster, men det viktigste gjenstår: selve fakturadelen. Under overskriften «Faktura», har vi satt inn en tabell med 6 kolonner og 11 rader, som vist i figur 2. Første rad inneholder overskriftene for hvert felt i fet skrift, mens de øvrige 10 radene brukes som varelinjer.

 

Figur 2. Kjernen i fakturaen er tabellen for å registrere varelinjer (du kan også se bokmerket «Start» under overskriften «Antall»). (Klikk for større bilde)
 

Fra tabellens rutenett har vi bare beholdt streken under første rad, fordi vi synes det blir penest. Som det fremgår av figur 2, er rutenettet likevel synlig når du arbeider i dokumentet, slik at det er enkelt å legge inn data i de forskjellige feltene.

Etter hvert kan du tilpasse kolonnene til dine behov, men siden oppsettet vårt brukes aktivt i neste artikkel, bør du i denne omgangen beholde det slik det er. Feltet «Mva. %» skal for eksempel brukes for å angi hvilken mva-sats som gjelder for det enkelte produktet (0, 12 eller 24 %).

Først nå trenger du å ta en utskrift for å sjekke at alt innhold har havnet i korrekt posisjon på originalblanketten. Det kan hende du må gjøre noen små justeringer, men i utgangspunktet gir denne metoden et vellykket resultat allerede på første forsøk.

Bokmerker overalt

Alt fast innhold i malen er nå på plass, og dermed kan vi ta fatt på de variable elementene. På samme måte som i tidligere artikler (se «Dialoger på boks», del 1 og 2), skal vi bruke en dialogboks for å registrere informasjon om mottaker og forfallsdato. Dialogboksen er vist i figur 3, og vi kommer tilbake til den litt senere.

 

Figur 3. Faktureringen starter med å registrere informasjon om mottaker og forfallsdato i denne dialogboksen.

Datafeltene fra dialogboksen skal – med hjelp av en liten VBA-rutine – settes inn i dokumentet på forskjellige steder. For å angi posisjonene, bruker vi bokmerker slik du har lært tidligere. Alle dataene skal faktisk brukes to steder, og derfor trenger vi to sett med bokmerker: Mottakerens navn og adresse skal nemlig plasseres både i vindusfeltet og i giroen, og også forfallsdatoen vises både i fakturaen og giroen.

Til dette bruker vi følgende bokmerker – pass på at du legger dem inn med nøyaktig samme navn:

Navn1
Adr1_1
Adr2_1
Sted1
Navn2
Adr1_2
Adr2_2
Sted2
Forfall1
Forfall2

Det er viktig at bokmerkene er synlige mens du arbeider med å lage malen. Dette ordner du med menyvalget Verktøy/Alternativer og skillearket Vis. Slå av visningen igjen når malen er ferdig.

For å legge inn et bokmerke, plasserer du først markøren der bokmerket skal være. Bruk deretter hurtigtasten Ctrl-Skift-F5 for å legge inn selve bokmerket (som mye annet, går dette raskest med hurtigtast).

Det første settet med bokmerker for navn, adresse og poststed, legger du inn fordelt på fire linjer i vindusfeltet i øvre venstre del av fakturaen. Det andre settet legger du i feltet «Betalt av» i giroen. Bokmerket Forfall1 legges til høyre for ledeteksten «Forfall:» i fakturaen, mens Forfall2 legges i feltet «Betalingsfrist» i giroen som vist i figur 1.

Til slutt legger du inn et bokmerke med navnet Start i tabellcellen under overskriften «Antall» (altså første celle i første varelinje). Det er her markøren skal plasseres etter at makroen har satt inn de øvrige variable opplysningene i blanketten.

Nå som alt innhold i malen er blitt tilordnet sine plasser, kan du fjerne bildet av den innskannede blanketten ved å bruke Vis/Topptekst og bunntekst og slette bildet. Ta likevel vare på filen med bildet. Den kan være nyttig å ha ved senere endringer eller hvis samme blankett skal brukes på andre måter.

En god dialog

Som nevnt skal vi bruke dialogboksen i figur 3 for å registrere opplysningene om mottaker og forfallsdato. Dialogboksen kalles frm­Mottaker, og har følgende feltnavn i tekstfeltene:

txtNavn
txtAdr1
txtAdr2
txtSted
txtForfall

Hvis du har laget malen fra de tidligere artiklene, kan du faktisk gjenbruke (altså kopiere) det meste av dialogboksen derfra. Du åpner da malen i Word, slik at både den gamle og nye malen er tilgjengelig i VBA.

Etter at dialogboksen er ferdig, skal du som vanlig knytte programkode til knappene OK og Avbryt. Koden er vist i figur 4.

 

Figur 4. Programkode for dialogboksen.
 

Når brukeren klikker på Avbryt eller taster Esc, blir dialogboksen fjernet med Unload Me, og deretter blir dokumentet lukket. Parameteren False angir at dokumentet ikke skal lagres.

Hovedoppgaven til rutinen for OK-knappen, er å sette inn teksten fra feltene i dialogboksen ved de tilsvarende bokmerkene i dokumentet. Dette medfører en del markørflytting i dokumentet, og for at brukeren skal slippe å se dette, setter vi Screen­Updating til False mens rutinen arbeider.

Siden vi har mange bokmerker, har vi laget subrutinen Sett­Inn for å sette inn tekst ved et bokmerke. Subrutinen finnes i kodemodulen, og er vist i figur 5, sammen med rutinen AutoNew, som sørger for å vise dialogboksen når du åpner et nytt dokument.

 

Figur 5. Programkode i modulen.
 

Etter at alle bokmerkene har fått tildelt sine tekster, avrunder vi med å flytte markøren til bokmerket Start. Det er her registreringen av selve varelinjene starter.

For å sikre at hele tabellen er synlig, ruller vi dokumentet 25 % opp med egenskapen Ver­tical­Per­cent­Scrol­led. Dette kan virke som en pirkete detalj, men det er alltid viktig å tenke på hva du kan bidra med for å gjøre dine løsninger enklere for brukeren.

Til slutt slår vi på oppdateringen av skjermen igjen og fjerner dialogboksen. Dermed har vi fullført del 1 av malen, og du kan teste den for å se om den fungerer som ventet.

Neste gang

Selv om vi ikke er i mål med prosjektet vårt ennå, har vi kommet langt på vei. Du kan allerede bruke denne malen til å produsere fakturaer, selv om du foreløpig må gjøre alle beregninger selv og manuelt fylle ut beløpsfeltene i fakturaen og giroen.

I neste artikkel skal vi fullføre malen ved å automatisere beregninger, innlegging av beløpsfeltene, utskrift og lagring. I mellomtiden kan du gjerne lese artikkelen «Ditt eget skjemavelde» som hjemmelekse. Her lærer du å bruke skjemaer og skjemafelt – teknikker som vi skal bruke aktivt i del 2 av artikkelen.

Som nevnt er filen med den innskannede blanketten lagt inn på www.pcworld.no, se her. Her finner du også den ferdige malen for del 1, som du kan se på hvis du står fast med noe. Men for å lære mest mulig, bør du absolutt lage din egen mal fra bunnen av som beskrevet her. Ta gjerne kontakt om du har noen spørsmål.

Testet i Word 2003

Løsningene i denne artikkelen er utviklet og testet i Word 2003, men prinsippene er tilsvarende i andre nyere versjoner av Word.


Lag fakturaen med Word, del 2 av 2

 

Av Willy Verwoerd | Publisert 28.02 2005 kl. 15:17

Word er godt egnet til å produsere profesjonelle fakturaer, og vi kom langt på vei med vår fakturamal i første del av artikkelen. Nå skal vi fullføre prosjektet og lære deg enda flere nyttige Word-teknikker underveis.

 

 
Allerede i del 1 kom vi frem til en mal som var fullt brukbar til å lage fakturaer. Du måtte imidlertid gjøre alle beregninger selv og manuelt fylle ut beløpsfeltene i fakturaen og giroen – en nokså tungvint løsning. Denne gangen skal vi fullføre malen ved å automatisere beregninger, innlegging av beløpsfelt og utskrift og lagring. Teknikkene du lærer i de to artiklene, kan du også bruke på mange andre områder. 

Vi forutsetter at du har lest og utført oppgavene i forrige artikkel. Og har du gjort hjemmeleksen, har du i mellomtiden også lest artikkelen «Ditt eget skjemavelde» (se PC World Norge nummer 3/04 eller go.pcworld.no/11099). Der lærer du å bruke skjemaer og skjemafelt, som vi nå skal bruke aktivt.

Allsidige tekstfelt

 

Lag profesjonelle fakturaer med Word.
Fakturamalen vi skal frem til er vist til høyre. Hovedarbeidet vårt foregår denne gangen i tabellen med varelinjene. Her skal vi sette inn skjemafelt for utfylling og formelfelt for beregninger. Vi bruker også formelfelt for å beregne totalbeløpene nederst til venstre i fakturadelen. 

Før fakturaen kan skrives ut, må totalbeløpet også legges inn i beløpsfeltene i faktura- og girodelen. Deretter er det klart for utskrift og lagring. Disse avsluttende oppgavene løser vi med makroer senere i artikkelen.

Slå på verktøylinjen Skjemaer, og bruk knappen Skyggelegging i skjemafelt for å sikre at feltene er synlige i malen. Plassér markøren i første ledige celle i kolonnen «Antall» (altså i rad 2), og klikk på knappen Tekst for å sette inn et tekstfelt. Vi skal bruke tekstfelt i alle de fire første kolonnene, men i litt forskjellige varianter.

Det første tekstfeltet settes opp som vist i figuren under. Velg Tall som Type, og angi deretter tallformatet «0», siden antall produkter vanligvis er et heltall. Når du legger inn et nytt tekstfelt, blir det automatisk tildelt et bokmerke. Disse trenger vi ikke, så pass på å slette bokmerket.

 

Slik setter du inn skjemafelt.
 

Hvis du glemmer dette, får malen en stor mengde formålsløse bokmerker. De gjør ingen skade, men gjør det vanskeligere å holde oversikten over bokmerkene vi faktisk bruker.

Til slutt slår du på valget Beregn ved avslutning. Dette sikrer at alle felt i dokumentet blir oppdatert når markøren forlater feltet, noe som er viktig for våre formelfelt. Klikk OK for å sette inn feltet.

Istedenfor å gjenta dette for hver celle nedover i kolonnen, kopierer du nå den første cellen du har laget. Deretter limer du den inn i de ni neste cellene nedover. Dette går ekstra raskt når du bruker tasten F4 (Rediger/Gjenta) for å gjenta kopieringen etter at du har kopiert den første cellen.

Bruk tilsvarende teknikk for de tre neste kolonnene, men med følgende tilpasninger: Kolonnen «Beskrivelse» skal ha typen Vanlig tekst og trenger derfor ikke beregning ved avslutning.

Kolonnen «Enhetspris» settes opp som «Antall», men siden priser har to desimaler, bruker du nå følgende tallformat:

# ##0,00

Dette formatet tar med desimalene og skiller tusengrupper med mellomrom. Vi skal bruke det samme formatet en del andre steder i malen også.

Kolonnen «Mva. %» er den siste som skal inneholde skjemafelt. Her kan brukeren registrere avgiftssatsen for hver vare. Dette er også heltall, så feltene i denne kolonnen settes opp identisk med kolonnen «Antall».

Til slutt trenger vi fire skjemafelt til beløpene i kvitteringsdelen nederst til høyre på fakturaen og nederst på giroen. Blanketten har separate felt til kroner og øre, så vi trenger to felt i hver posisjon.

Disse feltene settes opp litt annerledes enn feltene i tabellen. Vi bruker fortsatt tekstfelt (som også skal inneholde tekst, ikke tall), men pass på å slå av valgene Fyll-inn aktivert og Beregn ved avslutning. Og mens bokmerker så langt har vært uønsket i våre skjemafelt, skal disse fire tekstfeltene ha hvert sitt bokmerkenavn, henholdsvis:

Kroner1
Øre1
Kroner2
Øre2

Siden feltene skal inneholde tekst, trenger du ikke å tenke på tallformatet.

Excel Light

Har du gjort alt riktig, er alle utfyllingsradene i de fire første kolonnene nå fylt med skjemafelt. Dette er de eneste skjemafeltene som brukeren får tilgang til når malen brukes (de fire beløpsfeltene vi laget til slutt, fylles ut av en makro).

Neste oppgave er å beregne beløpene i de to siste kolonnene i tabellen, samt i oppsummeringen i nedre del av fakturaen (under tabellen). Nestsiste kolonne viser beløpet ekskl. mva., mens siste kolonne viser totalbeløpet for hver varelinje.

Vi kunne brukt skjemafelt til disse beregningene (se typen Beregning i tekstfelt), men disse gir oss ikke tilstrekkelig kontroll med tallformatet. Vi bruker derfor formelfelt i stedet, og som bonus lærer du deg enda en teknikk i Word.

Flytt markøren til første celle under overskriften «Ekskl. mva.». Velg Sett inn/Felt fra menyen eller bruk hurtigtasten Ctrl-F9 for å sette inn den første formelen.

I dialogboksen som vises nå, velger du først kategorien (Alle) og deretter feltnavnet =(Formula). Så klikker du på knappen Formel, som åpner dialogboksen som er vist på neste side. Sett inn følgende formel:

=A2*C2

I listen Tallformat velger du samme tallformat som vi brukte i kolonnen «Enhetspris». I tillegg skriver du inn to semikolon på slutten av formatet, som vist i figuren. Dette er viktig, og bygger på et formateringstriks som du også kan bruke i Excel.

Det vi egentlig gjør her er å angi tre forskjellige tallformater, atskilt med semikolon: Det første formatet gjelder for positive tall, det andre for negative tall og det tredje for verdien null. Ved å bruke et tomt format for de to siste valgene, sikrer vi at de ikke vises. Hadde vi ikke gjort dette, ville vi fått synlige nullverdier i alle varelinjer uten varer, noe som ville vært ganske skjemmende.

Et annet fellestrekk med Excel er at du kan gjøre enkle beregninger i Word-dokumenter. Når disse utføres i en tabell, bruker du samme bokstav/tall-notasjon som i Excel. Vi skal multiplisere antall varer i celle A2 med enhetsprisen i celle C2, og bruker derfor formelen A2*C2.

I tillegg til de grunnleggende regneartene kan du bruke en del funksjoner. Merk deg imidlertid at cellereferanser i Word alltid er absolutte. Når du bruker A2 i Word, tilsvarer det altså $A$2 i Excel.

Gå videre til første ledige celle i kolonnen «Totalt», og sett inn den første av formlene som er vist under skjermbildet på neste side. Her bruker vi verdien i kolonne E, og tilføyer eventuell merverdiavgift som spesifisert i kolonne D.

Fyll opp med formler

De to første formlene er nå på plass i hver sin kolonne, og vi må gjenta operasjonen for de neste ni radene. Siden cellereferansene er absolutte, blir de ikke endret automatisk når du kopierer dem til andre celler som i Excel. Det er likevel en god idé å kopiere cellene på samme måte som du gjorde med skjemafeltene. Istedenfor å bruke Sett inn/Felt i hver eneste celle, kan du spare mye arbeid ved å redigere formlene direkte i teksten.

Når alle formlene er kopiert til sine celler, velger du Verktøy/Alternativer fra menyen og skillearket Vis. Slå på visning av feltkoder og klikk OK. Word har også en kjekk verktøyknapp for å slå av og på visning av feltkoder. Vi anbefaler at du legger den inn på en verktøylinje med Verktøy/Tilpass.

Når feltkodene vises, kan du redigere hver formel i tabellen som tekst. Bruk dette for å endre cellereferansene slik at de passer med raden, og sjekk nøye at det blir korrekt. Slå av visningen av feltkoder igjen når du er ferdig.

Nå er det bare tre beregninger som gjenstår, nemlig totalbeløpene til venstre under tabellen. Her setter du inn formelfelt med de tre siste formlene i figuren under, i samme rekkefølge som vist.

 

Formelverktøy (merk tallformatet) og formler (se teksten).
 

De tre siste formlene viser hvordan du kan referere til en hel kolonne og bruke funksjonen SUM for å summere tallene. Fordi formlene er utenfor tabellen, må vi fortelle Word hvilken tabell de skal arbeide med. Det gjør vi med bokmerket «Varer», som vi skal tildele tabellen om et øyeblikk.

Alle beregningene er nå på plass, og alle formelfeltene vil automatisk bli oppdatert hver gang markøren forlater et tallfelt i skjemaet.

Før vi kan starte arbeidet med makroen, trenger vi imidlertid enda to bokmerker. Det første heter «Varer» og brukes som nevnt til å identifisere tabellen med varelinjene:

Sett markøren i første celle i tabellen (A1), og legg inn bokmerket. Det er ikke nødvendig å merke tabellen på forhånd – det holder at bokmerket finnes et sted i tabellen.

Det siste bokmerket «Sum» er litt spesielt fordi det skal angi et område, og ikke bare en posisjon. Makroen bruker dette bokmerket for å hente fakturaens totalbeløp, som står utenfor ledeteksten «Å betale».

Før du legger inn bokmerket, må du sørge for at feltkoden med formelfeltet er synlig. Deretter merker du hele feltkoden (ikke bare formelen) og setter inn bokmerket. Når dette er gjort, kan du slå av visningen av feltkoder igjen.

Maskineriet

Dermed er nesten alle elementene på plass i malen, og formlene våre sørger for at alle beløp oppdateres automatisk og fortløpende – unntatt totalbeløpene i kvitteringen og giroen.

Vi skal lage makroen «Ferdig» for å fylle ut disse feltene, og skrive ut fakturaen og lagre den. Men hvordan skal vi aktivere makroen? Vi kan for eksempel lage en verktøyknapp og/eller hurtigtast som starter den, men den enkleste måten er å følge brukerens naturlige arbeidsprosess: Når fakturaen er fylt ut, skal den normalt skrives ut.

Som nevnt mangler fakturaen imidlertid fortsatt noen beløp, så vi kan ikke la brukeren skrive den ut uten videre. Vi kan likevel løse dette ved å overstyre Words utskriftsfunksjoner, slik at vi selv bestemmer hva som skjer når brukeren prøver å skrive ut dokumentet.

Word-dokumenter kan skrives ut på flere måter. Trykker du på utskriftsknappen, blir dokumentet sendt direkte til nåværende standardskriver. Bruker du menyvalget Fil/Utskrift eller hurtigtasten Ctrl-P, åpnes utskriftsdialogen der du kan velge skriver og andre innstillinger. Vi må derfor fange opp begge disse mulighetene.

De fleste av Words innebygde funksjoner kan overstyres ved å definere makroer med samme navn som funksjonen. Når en slik makro finnes, vil den bli utført istedenfor den innebygde funksjonen. For å fange opp de to utskriftsvariantene, bruker vi makroene File­Print og File­Print­Default. Begge har bare én oppgave, nemlig å starte makroen «Ferdig».

Før vi går løs på den nye makroen vår, må vi imidlertid gjøre en liten tilføyelse i makroen cmdOK_Click fra forrige gang: Foran linjen

Unload Me

på slutten av makroen legger du inn linjen som står øverst i figuren under.

 

Nye makroer og en tilføyelse til den gamle (se teksten).
 

Denne linjen er viktig, fordi den sørger for å beskytte dokumentet. Dette sikrer at brukerne bare får tilgang til skjemafeltene, noe som også er helt nødvendig for at skjema- og formelfeltene skal fungere.

Et beskyttet dokument kan ikke redigeres – verken av mennesker eller makroer. Makroen ville derfor ikke ha klart å sette inn opplysningene om mottaker og forfall hvis dokumentet allerede var beskyttet. Derfor slår vi på beskyttelsen først etter at tekstene er lagt inn.

Nye makroer

Den nye programkoden er vist under streken (se forrige side), og tilføyes til de to makroene som vi la inn i modulen i del 1. De to første makroene har vi allerede vært innom, og vi skal derfor gå rett løs på hovedmakroen «Ferdig».

Som vanlig starter vi med å definere variablene som brukes. Deretter viser vi for sikkerhets skyld en meldingsboks som sjekker om fakturaen virkelig skal skrives ut nå. Når dette er bekreftet, henter vi fakturaens totalbeløp fra formelfeltet med bokmerket «Sum». Deretter deler vi opp beløpet i kroner og øre med strengfunksjonene Left og Mid. Funksjonen In­Str brukes for å finne kommaets plass i beløpet.

Kronene og ørene settes nå inn i sine respektive skjemafelt med egenskapen Form­Fields. Til slutt oppdaterer vi alle feltene med Fields.Up­date for å sikre at alt vises korrekt til brukeren.

Nå er fakturaen klar for utskrift, og det bringer oss frem til enda en interessant teknikk: Du kan ikke bare overstyre innebygde funksjoner i Word, men også de fleste innebygde dialoger.

I vårt tilfelle bruker vi egenskapen Dialogs med parameteren wd­Dia­log­File­Print for å aktivere Words vanlige utskriftsdialog. Fordi fakturaer normalt skrives ut i to kopier (én til kunden, én til deg) og for å gi deg en smaksprøve på hvordan du kan manipulere slike dialoger, har vi satt antall kopier til 2 med egenskapen Num­Copies. Deretter bruker vi Show for å vise dialogboksen og overlater til brukeren å fullføre den.

Til slutt gjenstår bare lagring av dokumentet med metoden Close. Den gir en feilmelding hvis brukeren avbryter den, og vi bruker derfor On Error Resume Next for å ignorere en eventuell feilmelding.

Nesten ferdig

Etter to lange artikler er vi så godt som ferdig med vårt fakturaprosjekt. Malen vår mangler likevel et element som vi ikke har hatt plass til å behandle, nemlig et fortløpende fakturanummer. Dette er faktisk påbudt, noe vi først ble klar over like før artikkelen gikk i trykken (takk til leseren som tipset om dette!).

Fakturanummeret kan automatiseres med en makro som du finner i brukertipset Automatisk fakturanummer i neste utgave av bladet (og nå også publisert på web). I mellomtiden kan du praktisere det du har lært: Legg selv inn et felt for fakturanummer som du i første omgang fyller ut manuelt (bruk dialogboksen for mottaker og forfallsdato).

Selv om vi har laget en profesjonell Word-løsning, finnes det selvfølgelig flere andre måter å løse oppgavene på. For eksempel kunne betalingsbeløpene vært taklet med (nokså intrikate) formelfelt istedenfor en makro. Vi har imidlertid lagt vekt på bredde i metodene slik at du skal lære mest mulig.

Omtalen av de forskjellige VBA-funksjonene er som vanlig spartansk, men hjelpfilene for VBA har fyldige forklaringer. Du bør absolutt lese videre der for å forstå de forskjellige teknikkene best mulig.

Du finner den ferdige malen på go.pcworld.no/11152, men bruk den bare hvis du står helt fast med noe. Du lærer mest av å løse oppgavene selv og konstruere malen bit for bit fra bunnen av. Ta gjerne kontakt hvis du har spørsmål eller forslag (klikk på forfatternavnet øverst i artikkelen).

Testet i Word 2003

Løsningene i denne artikkelen er utviklet og testet i Word 2003, men prinsippene er tilsvarende i andre nyere versjoner av Word.

Office-eksperten

Går du under overflaten i Office, finner du mange funksjoner og verktøy som kan lette arbeidet ditt. I Office-eksperten utforsker vi mulighetene og hjelper deg å bli en mer avansert Office-bruker. Forslag og kommentarer kan sendes til forfatteren ved å klikke på forfatternavnet øverst i artikkelen.

 

 

 

 

 

 

 

 

 

 

 


 

Startside ] Opp ] [Søk]

Copyright © 2002 Øyvind Haugland
Sist endret:  13 januar 2019
 

  Interested in this stuff? Please write to:
 

HTML Counter            stats counter