Objekt-modellen
I de sidste par artikler om Visual Basic for Applications, Microsofts scripting-sprog til Office-pakken, har vi set på kontroller, som er brugerfladeelementer i VBA, samt på hjælpefiler og debugging. I denne artikel kigger vi på, hvordan man kan manipulere med de objekter, som programmerne er skabt til: Tekst i Word, og tal og formler i Excel.
Objekt-modellen
Mulighederne for at manipulere med Word og de andre programmer foregår via Offices objektmodel. Og hvad er sådan en størrelse så egentlig? Objekterne i Word kan være synlige objekter, som knapperne i den forrige artikel, eller de kan være bestemte egenskaber i et dokument som for eksempel afsnittene i et Word-dokument. Objekter har to ting, man kan pille ved: Egenskaber, som kan aflæses og sættes, og metoder, som man kan få udført. For at gøre et eller andet i Word eller andre Office-programmer, skal man have fat i det objekt, som indehaver den egenskab man vil læse eller sætte, eller den metode, man vil have udført.
I forrige artikel så vi blandt andet på radioknapper, eller optionbuttons, som de hedder i VBA-terminologien. Knappens tilstand, altså om den er slået til eller fra, er således en egenskab ved knapobjektet. Derfor kan vi slå knappen til med sætningen
OptionButton1.Value = True
Sætningen foroven læses således: "Vi sætter egenskaben Value ved objektet OptionButton1 til sand (true)".
Egenskaber
Undertiden kan et objekts egenskab være et andet objekt, og derfor kan listen af objekter, man skal igennem for at sætte en bestemt egenskab, blive ganske lang. For eksempel kunne man have en sætning, der ser sådan ud:
ActiveDocument.Range.Style = wdStyleHeading1
Her sættes typografien (Style) i en del af teksten i det aktive dokument (Range) til wdStyleHeading1.
Hvis man tænker alle objekterne ind i en træstruktur, kan man således tegne et diagram, hvor alle objekterne indgår. Det er hvad der menes med objekt-modellen.
Herover ses nogle af de objekter, som man har til rådighed i Word. Derudover findes der tilsvarende objekt-hierarkier til de andre programmer i Office, og de objekter, som Visual Basic selv stiller til rådighed som udgangspunkt. Det er objekter til eksempelvis åbning og læsning af filer.
Hjæpen er nær
Her får du hjælp
Hjælpefilerne er gode og informative, og forklaringerne er ikke mere tekniske og indviklede, end at man sagtens kan få en masse ud af dem.
Når man vælger menuen Help i VBA-editoren, ses punktet Microsoft Word Visual Basic Reference. Hvis man skal bruge hjælpefilerne til et af de andre Office-programmer, skal man åbne VBA-editoren fra det program. En anden mulighed er at benytte objekt-browseren i VBA-editoren, således som vi gjorde i forrige artikel.
Da mange objekter kan indgå i flere forskellige sammenhænge, er det ikke lige sådan til at sætte sig ned at tegne det hele op på et stykke papir, men det kan være en god ide at få princippet ind på rygmarven, specielt når man er på udkig efter et objekt, der skal løse et helt specifikt problem.
Data fra Excel
Word og Excel
Lad os til sidst se på et lille eksempel, hvor vi henter data fra et Office-dokument til et andet. Vi vil prøve at programmere en slags primitiv brevfletning, selv om at Word har en indbygget funktion, der kan klare sagen meget bedre. Men det er jo også blot et eksempel.
Vi forestiller os, at vi har en adresseliste i et Excel-ark, og at vi gerne vil indsætte værdier fra regnearket ind på bestemte steder i tekstdokumentet.
Det nemmeste er at afvikle vores script fra Makro-menuen, da alle makroer bygger på VBA.
Åbn Word, og vælg Funktioner > Makro > Makroer. Skriv "MinMakro" i feltet Makronavn for oven, og klik på knappen Opret. Nu åbnes VBA-editoren, og editoren har allerede indsat følgende linier:
Sub MinMakre()
'
' MinMakre Makro
' Makro oprettet 12-09-2001 af Tania Andersen
'
End Sub
Når man gemmer, gemmes scriptet i filen Normal, som indeholder Words globale makroer.
Vi forestiller os, at Word-dokumentet, hvor teksten skal indsætttes, er åbent.
Først skal vi have et Excel-objekt. Det kan lyde lidt mystisk, men vi skal have et eller andet at referere til, og det er lige som alt andet via objekter. Objektet skabes med sætningen
Set ExcelSheet = CreateObject("Excel.Sheet")
Ved at slå op på Open i VBAs hjælpefiler (åbnet fra Excel, vel at mærke), ser vi, at et ark åbnes med Workbooks-objektets Open-metode. Lidt luskeri viser, at Workbooks hører til Application-objektet, som vi kan benytte på vores netop oprettede Excel-objekt.
Alt i alt ser det sådan ud:
ExcelSheet.Application.Workbooks.Open "adresser.xls"
...til Word
Nu vil vi godt kopiere en celle fra Excel-arket, så vi søger på Cell i VBA-hjælpefilerne. Her finder vi egenskaben Cells, som Application-objektet tilbyder. Ved et eksempel ses, at en celle kan sættes eller aflæses ved egenskaben Value. Det ser sådan ud:
ExcelSheet.Application.Cells(1, 1).Value
Til sidst er det blot at indsætte værdien af cellen det rigtige sted i Word-dokumentet. Word-dokumentet kan vi referere til som ActiveDocument, da makroen ligger i Words globale makro-ark.
Der er en lang række måder, hvorpå man kan referere til steder i teksten i et Word-dokument. Her benytter vi Sections, som returnerer de enkelte dele i et dokument, når metoden kaldes med et indeks som parameter.
Sub indsaetTekst()
'
' MinMakre Makro
' Makro oprettet 12-09-2001 af Tania Andersen
'
Set ExcelSheet = CreateObject("Excel.Sheet")
ExcelSheet.Application.Workbooks.Open _
"adresser.xls"
Navn = ExcelSheet.Application.Cells(1, 1).Value
ActiveDocument.Sections(1).Range.InsertBefore _
"Kære " & Navn & "."
End Sub
Eksemplet her er selvfølgelig lidt kortfattet, men forhåbentlig har det demonstreret, at man kan finde alle de objekter, som man har brug for, og komme frem til en løsning, i særdeleshed ved at benytte de mange eksempler, der findes i hjælpefilerne.