Kommunicera med Officeprogrammen
Förord
I denna artikel tänkte jag visa några exempel på hur du kan etablera kommunikation med de vanligaste programmen som ingår i Microsoft Officefamiljen (Word, Excel, Powerpoint etc.). Det finns många olika metoder man kan tillämpa genom att länka till Officeprogrammen där jag ämnar visa några olika exempel. Först en metod för att hämta in data från Excel till VB. Sedan ett exempel där jag använder Word för att generera utskrifter från information ur en databas. Artikeln innehåller även ett utskriftsexempel där Access rapportdel utnyttjas och ytterligare ett kodexempel där kommunikation upprättas med presentationsprogrammet Powerpoint.
Hämta data från Excel
Jag börjar med att visa ett exempel på hur man till sitt Visual Basic-program kan hämta data från kalkylceller i ett kalkylblad i Excel och sedan infoga samma information i en Listviewkontroll. Först av allt får man se till att ha ett lämpligt kalkylblad tillgängligt och jag har för ändamålet tagit en skärmdump på ett blad som jag ämnar använda till detta exempel. Kolumnerna som jag tänkt att använda mig utav i nedanstående kalkylblad är Märke, Modell, Årsmodell. Färg och Km. Efter att kalkylbladet är klart för användning skapar du en listviewkontroll i ditt VB-formulär och döper lämpligen kolumnerna i denna till samma namn som de i Excelbladet. Skriv sedan in följande kod för att hämta data från kalkylbladet och sedan addera dessa till din listviewkontroll. (Läs mer om hur du skapar en listviewkontroll här).
Vi börjar med att skriva in API;erna FindWindow och SendMessage. Dessa gör att ditt program hittar Excelfönstret utan att du behöver definiera namnet i din kod. Finns det flera Excelfönster öppna så hittar programmet det senast aktiva.
I modul:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long
Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Skriv sedan in nedanstående kod som först kontrollerar om Excel är öppet och sedan hämtar information från Excelbladet.
I formulär:
Dim MyXL As Object
Dim ExcelWasNotRunning As Boolean
Dim obKalkylblad As Object
'Hämta excelobjekt.
Set MyXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then ExcelWasNotRunning = True
Err.Clear
Const WM_USER = 1024
Dim hwnd As Long
'Om Excel är öppet...
hwnd = FindWindow("XLMAIN", 0)
If hwnd = 0 Then ' 0 betyder att Excel inte är öppet.
Exit Sub
Else
SendMessage hwnd, WM_USER + 18, 0, 0
End If
Set obKalkylblad = MyXL.ActiveSheet
'Sätt variabeln som definierar radnummer i Excelbladet till 3
i = 3
'Lägg in kalkylbladscellerna i variabler.
Do Until obKalkylblad.Cells(i, 1).Value = ""
clMärke = obKalkylblad.Cells(i, 1)
clModell = obKalkylblad.Cells(i, 2)
clYear = obKalkylblad.Cells(i, 3)
clColor = obKalkylblad.Cells(i, 4)
clKm = obKalkylblad.Cells(i, 5)
'Addera cellvärdena till din Listviewkontroll.
Set itmX = ListView1.ListItems.Add()
With itmX
.Text = clMärke
.SubItems(1) = clModell
.SubItems(2) = clYear
.SubItems(3) = clColor
.SubItems(4) = xKm
End With
i = i + 1
Loop
Frigör Excelobjektet från minnet om det inte kördes.
MyXL.Parent.Windows(1).Visible = True
If ExcelWasNotRunning = True Then
MyXL.Application.Quit
End If
Set MyXL = Nothing
Nu har förhoppningsvis värdena i kalkylbladet kopierats in i din listview. När du använder denna kod är det viktigt att felhantera ordentligt. Min erfarenhet av denna kod säger att mycket kan gå snett. Dels kanske inte Excel är öppet överhuvudtaget. Dels kanske fel datatyper lätt kan läggas in i variablerna om användaren matar in fel värden i kalkylbladscellerna.
Använda Word från ditt VB-program
Att kommunicera med ordbehandlingsprogrammet Microsoft Word kan dra med sig en rad fördelar. Du kan t ex designa en mall i Word som sedan kan ligga till grund för dina utskrifter. Med denna metod har du tillgång till alla funktioner som Microsoft Word erbjuder och du kan därigenom få till väldigt snygga utskrifter. En nackdel med denna metod är att det kräver en del prestanda av din dator och är inte att rekommendera om du har en gammal dator. För detta exempel har jag designat en worddokument enligt bilden nedan. Jag har infogat en tabell med fem kolumner i dokumentet. Du kan ju också använda dig av tabbar om du föredrar det. Jag har i det här fallet valt att använda tabell för att det är lättare att styra informationen dit man vill och också lättare att identifiera och navigera i dokumentet från ditt VB-program.
Skapa ett bokmärke som heter StartCell i den första tabellcellen och spara sedan dokumentet som en Wordmall (t ex bilar.dot).
Nu är det dags att skriva lite kod för att få till en utskrift, men börja med att bocka för Microsoft Word x.0 Object Library under References i Project-menyn för att skapa en referens till Words objektbibliotek. I nedanstående exempel har jag valt att hämta information från en accessdatabas.
Skriv in följande kod under ett lämpligt objekt i ditt formulär.
Dim objWord As Word.Application
Dim docSplintdok As Word.Document
Dim db As Database
Dim rs As Recordset
'Skapa ett nytt Wordobjekt i ditt program
Set objWord = New Word.Application
'Gör Word osynligt
objWord.Visible = False
Set docSplintdok = Documents.Add("bilar.dot", 1)
'Hämta informationen från en databas (DAO)
Set db = OpenDatabase("bilar.mdb")
Set rs = db.OpenRecordset("SELECT * FROM Bilar")
'Gå till den första cellen med bokmärket StartCell
Selection.GoTo What:=wdGoToBookmark, Name:="StartCell"
'Lägg in data i Worddokumentet
Do While Not rs.EOF
Selection.TypeText Text:=rs.Fields(1)
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=rs.Fields(2)
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=rs.Fields(3)
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=rs.Fields(4)
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=rs.Fields(5)
Selection.MoveRight Unit:=wdCell
rs.MoveNext
Loop
'Skriv ut dokumentet
With docSplintdok
.PrintOut
End With
DoEvents
'Spara inte ändringar eftersom det är en mall
docSplintdok.Close SaveChanges:=False
'Frigör Word från minnet
objWord.Quit
Set objWord = Nothing
'Glöm inte att stänga databasen
rs.close
db.close
En annan metod för att få något utfört i Word är att först spela in ett makro som utför godtyckliga åtgärder i ett dokument och sedan kalla på makronamnet i ditt Visual Basic-program.
Även här måste du skapa en referens till Microsoft Word i Project-menyn. Skriv därefter in följande kod:
Dim objWord as Word.Application
Set objWord = New Word.Application
objWord.Visible = True
objWord.Run "makronamn"
objWord.Quit
Set objWord = Nothing
Använda Powerpoint från ditt VB-program
Det finns några olika metoder att tillämpa för att komma åt Powerpointpresentationer från ditt VB-program. Du kan skapa en referens till en öppen presentation på två olika sätt. Dels genom att använda Application-objektets ActivePresentation egenskap eller genom att använda Presentation objektet som en medlem av Presentations samlingen. Här finns det tre sätt att tillgå:
- Genom att använda filnamnet (Set prsPres = Presentations("PowerpointTools.ppt").
- Genom att använda Caption egenskapen i fönstret som innehåller presentationen (Set prsPres = Presentations("PowerpointTools").
- Genom att använda index. Powerpoints presentationsfiler är indexerade i den ordning de har öppnats (Set prsPres = Presentations(1)).
Du kan ju naturligtvis också öppna dina presentationer som som är sparade på disk på samma sätt som vi gjorde med Word och Excel-exemplen tidigare.
Dim ppApp As Powerpoint.Application
Dim prsPres As Powerpoint.Presentation
'Skapa ett nytt Powerpointobjekt i ditt program
Set ppApp = New Powerpoint.Application
Set prsPres = ppApp.Presenations.Open("C:\sökväg\powerpointtools.ppt")
With prsPres
'Lägg in din kod här...
End With
Skapa en ny presentation
Du kan också skapa en helt ny presentation genom att använda Add metoden som finns i Presentations samlingen:
Dim ppApp As Powerpoint.Application
Dim prsPres As Powerpoint.Presentation
Set ppApp = New Powerpoint.Application
With ppApp
Set prsPres = .Presentations.Add(msoFalse)
With prsPres
'kod för att utföra godtyckliga åtgärder i Powerpoint
End With
End With
Harry Rosendahl
Bra artikel i alltid aktuellt ämne