Bra Utbildning AB

 

<-- Back
VBA & Objektmodeller
Arbeta med text
Bokmärken
Range
Fält
Formulärfält
Autotext
Doc var & Doc Prop
Words kommandon
Words dialogrutor
Automation
Externa Databaser

Arbeta med Automation


En applikation som exponerar sin objektmodell och stöder automation kan anropas och startas  från andra applikationer. En Excel-lösning kan dra igång Word eller Access och utföra kommandon utan användaren medverkan (samt avsluta och städa efter sig) och vice versa. En programvara (som t.ex. ett fakturaprogram utvecklad i t.ex. "ren" VB) kan använda sig av den programvara som är bäst lämpad för att producera proffsiga utskrifter, t.ex. Word. Därigenom slipper utvecklaren ägna tid åt att skapa utskriftsrutiner - dvs sådana rutiner som ingår i Word från start.

Exempel: 
Starta Excel från t.ex. Word eller Access och kontrollera att antalet blad i arbetsboken är minst tre och ändra bladens namn. Spara arbetsboken och stäng både dokument och avsluta Excel.  Med vald teknik körs Excel i bakgrund och man är som användare inte varse att Excel är igång.

Denna kod infogas i t.ex. Word eller Access i en kodmodul. Det fordras också en referens (Verktyg-Referenser/Tools-Referenser) till valt program/typbibliotek, dvs Excel i detta fall. Det innebär tidig bidning av objektvariablerna/early binding. 



Dim oApp As Excel.Application
Dim oBok As Excel.Workbook
Dim iAntalBlad As Long

'Se också GetObject o CreateObject nedan, fungerar också bra
Set oApp = New Excel.Application

Set oBok = oApp.Workbooks.Add
With oBok
      iAntalBlad = .Worksheets.Count
      If iAntalBlad < 3 Then .Worksheets.Add Count:=3 - iAntalBlad

      .Worksheets(1).Name = "Sammanställning"
      .Worksheets(2).Name = "Januari"
      .Worksheets(3).Name = "Februari"

      .Close SaveChanges:=True, FileName:="c:\Data\TestRapport.xls"
End With

oApp.Quit
Set oApp = Nothing

Detta exempel visar hur att arbeta med Word från t.ex. Access eller Excel.  
Referens sätts till Word typbibliotek i Verktyg-Referenser (Tools-References) under utvecklingsarbetet. I och med att referens satts kan objektvariabler skapas med tidig bidning/early binding, vilket bland annat gör att kod körs snabbare. 

Sub CallWord()
Dim oApp As Word.Application
Dim oDoc As Word.Document
Dim bClosed As Boolean

On Error GoTo Errorhandler 
Set oApp = GetObject(, "Word.Application")

With oApp 
   Set oDoc = .Documents.Add("sökväg o mallnamn.dot") 
   oDoc.PrintOut 
   oDoc.Close wdDoNotSaveChanges

   'Stäng Word om Word tidigare inte var igångkörd
   If bClosed Then
      .Quit
   End If

End With
Bye:

set oApp = Nothing

Exit Sub
'---------------------------------------- 
Errorhandler: 
   Select Case Err 
      Case 429 
         Set oApp = CreateObject("Word.Application")
         bClosed = True
         Resume Next 
      Case Else 
         MsgBox "Följande fel har inträffat: " & Err.Description 
         Resume Bye
   End Select
End Sub

Det här är också ett exempel hur hur att använda automation för att arbeta med Word från annan programvara som t.ex. Access eller Excel. 

Bakgrund: 
- Du har ingen kunskap om vilken version av Word som används
- Du är inte beredd att ta risken att sätta en referens till en äldre Word-version (Word97) i förhoppning att koden ändå ska fungera på senare vesioner
- Ingen referens sätts till Word (Verktyg-Referenser/Tools-References)

Objektvariablerna skapas när makrot körs. Denna sena bidning/late binding gör att kod körs långsammare samt att man under utvecklingsfasen inte får hjälp med IntelliSense-rullgardiner med metoder och egenskaper.

Sub AnropaWordIngen()
Dim oApp As Object
Dim oDoc As Object
Dim bClosed As Boolean

On Error GoTo Errorhandler
Set oApp = GetObject(, "Word.Application")

With oApp
   Set oDoc = .Documents.Add("sökväg och mallnamn.dot")
   oDoc.PrintOut
   oDoc.Close 0

   'Stäng Word om Word tidigare inte var igångkörd
   If bClosed Then
      .Quit
   End If

End With
Bye:

Set oDoc = Nothing
Set oApp = Nothing

Exit Sub
'----------------------------------------
Errorhandler:
   Select Case Err
      Case 429
         Set oApp = CreateObject("Word.Application")
         bClosed = True
         Resume Next
      Case Else
        MsgBox "Följande fel har inträffat: " & Err.Description
        Resume Bye
   End Select
End Sub