天天看點

Visual Basic調用Excel之技巧

Visual Basic調用Excel之技巧

  Visual Basic(以下簡稱VB)是一套可視化、面向對象、事件驅動方式的結構化程式設計語言,已經成為許多程式設計者甚至專業程式員用來開發WINDOWS應用程式的首選開發工具。但用過VB的程式設計人員都知道,要想用VB輸出複雜的表格來,是十分困難的。能不能用VB調用EXCEL呢?Active技術标準為我們解決了這個問題。最近筆者為機關開發“土工試驗資料整理”的某個子產品時,涉及到複雜資料表格的輸出問題,經過筆者的摸索,用VB調用EXCEL,取得了很好的效果。本文從程式設計實踐的角度對使用VB控制EXCEL的技術作簡要說明。

1 EXCEL的對象模型

  如果一個應用程式支援自動化技術,那麼其它的應用就可以通過其暴露的對象,對它進行控制,控制程式稱為客戶機,而被控制的一方就稱為伺服器,被控制的對象就是Active對象。VB正是通過EXCEL顯露的各級對象來控制EXCEL工作的。每個對象都有各自的方法和屬性,通過方法可以實作對對象的控制,而屬性則可以改變對象的各種狀态。

  了解EXCEL的對象模型是對其程式設計的基礎。EXCEL是以層次結構組織對象的,其對象模型中含有許多不同的對象元素,這些對象元素就是VB可以操縱的。在EXCEL對象的層次結構中,最頂層是Application對象,是Excel本身。從該對象開始往下依次是:

.workbooks對象集,是Application對象的下層,其指的是Excel的工作簿檔案。

.worksheets對象集,是Workbooks對象集的下層,它表示的是Excel的一個工作表。

.Cells和Range對象,它們是worksheets對象的下層,它則指向Excel工作表中的一個或多個單元格。

  以上介紹的四個對象是Excel中最重要也是用得最多的對象,而且從上面的介紹中也不難看出,要控制Excel中的某個具體對象,如某個工作簿中某一表格中的單元格,就必須從Excel層次結構對象的最上層即Application對象開始周遊。

2 Excel對象的使用

2.1 application對象的使用

如前所述,Application對象位于Excel層次結構對象的最上層,它代表的是Excel自身,我們的應用程式理應從Application對象的建立開始。VB控制Excel的啟動方式有幾種,在這裡我們使用了API調用,可以確定目前系統中隻有一個Excel副本在運作,程式代碼和說明如下:

Option Explicit

Public xlapp As Object‘Excel對象

Public xlbook As Object‘工作簿

Public xlsheet As Object‘工作表

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, lParam_

     As Any) As_  Long

  以上是公有變量和API函數應在子產品中聲明。

    Sub GetExcel()

   Dim MyXL As Object  '用于存放Microsoft Excel 引用的變量。

   Dim ExcelWasNotRunning As Boolean '用于最後釋放的标記。

   On Error Resume Next  '延遲錯誤捕獲。

   '不帶第一個參數調用 Getobject 函數将傳回對該應用程式的執行個體的引用。

    '如果該應用程式不在運作,則會産生錯誤。

   Set MyXL = GetObject(, "Excel.Application")

   If Err.Number <> 0 Then ExcelWasNotRunning = True

   Err.Clear '如果發生錯誤則要清除 Err 對象。

   '檢測 Microsoft Excel。如果 Microsoft Excel 在運作,則将其加入運作對象表。

  DetectExcel      '該過程檢測并登記正在運作的 Excel

   '設定其 Application 屬性,顯示 Microsoft Excel。

   '然後使用 MyXL 對象引用的 Windows 集合,顯示包含該檔案的實際視窗。

   MyXL.Application.Visible = True

   MyXL.Parent.Windows(1).Visible = True

   '如果在啟動時,Microsoft Excel 的這份副本不在運作中,

   '則使用 Application 屬性的 Quit 方法來關閉它。

   '注意,當試圖退出 Microsoft Excel 時,

     '标題欄會閃爍,并顯示一條消息詢問是否儲存所加載的檔案。

   If ExcelWasNotRunning = True Then

    MyXL.Application.Quit

   End If

    Set MyXL = Nothing  '釋放對該應用程式和電子資料表的引用。

End Sub

   '該過程檢測并登記正在運作的 Excel。

Sub DetectExcel()

Const WM_USER = 1024

    Dim hwnd As Long

'如果 Excel 在運作,則該 API 調用将傳回其句柄。

    hwnd = FindWindow("XLMAIN", 0)

    If hwnd = 0 Then  '0 表示沒有 Excel 在運作。

    Exit Sub

    Else

     'Excel 在運作,是以可以使用 SendMessage API'函數将其放入運作對象表。

     SendMessage hwnd, WM_USER + 18, 0, 0

     End If

End Sub

      有了Application對象,就可以非常友善地通路Excel應用程式中的其它對象,以及這此對象的屬性和方法。

    2.2 workbooks對象的使用

    dim xlbook as object    ‘定義一個指向工作簿變量

set xlbook=xlapp.application.workbooks.add

  使用ADD方法建立一個空白的工作簿。

    2.3 worksheets對象的使用

    dim xlsheet as object    ‘定義一個指向工作表的變量

set xlsheet=xlapp.application.workshets.add

或者:set xlsheet=xlapp.application.worksheet(1)   ‘指向目前工作簿的第一頁

2.4 Cells和Range對象的應用

      引用一個工作表(xlsheet)中的某個機關格用以下代碼:

      xlsheet.cells(I,j)=100  ‘表示在第I行第J列中寫入100這個數。

      引用工作表中的多個機關格用以下代碼:

    With xlsheet                          '設定邊框為是實際上線

.Range(.Cells(7,1),.Cells(28,29)).Borders.LineStyle = xlContinuous

End With

3 應用執行個體

  該執行個體給出怎樣運作Excel建立複雜表格以及向表格填充資料的完整過程。在開始應用程式前,我們要做的準備工作是建立一個我們所需格式的Excel模闆。模闆的作用相信大家都不會陌生。我所做的模闆如下(模闆檔案取名為“土工試驗成果表”):

  模闆可以存在指定的檔案夾裡,也可以在于Excel存放模闆的檔案夾裡。

  打開VB程式設計環境,選擇建立一标準工程。要想在VB中很好地調用Excel,首先必須打開VB程式設計環境“工程”菜單中的“引用”項目,并選取項目中的“Microsoft Excel8.0 object library項。然後在窗體中加入一指令按鈕,其caption屬性為:Excel輸出。

Visual Basic調用Excel之技巧

  即command1.caption= Excel輸出。

  以下是代碼,其中子產品中的代碼和上面介紹的application使用代碼是一樣的,不再列出。

    Private Sub Command1_Click()

 Dim i, j As Integer

 Call GetExcel

 Set xlapp = GetObject("土工試驗成果表.XLS")     '打開模扳檔案

xlapp.Parent.Windows(1).Visible = True        '使父窗體可見

 Set xlsheet = xlapp.Application.Worksheets(1)'目前工作簿的第一頁

 For i = 7 To 28‘這段代碼是将整數1到29寫入機關格中,實際應用時可

   For j = 1 To 29 ‘讀一資料檔案并按要求寫入表格中

     xlsheet.Cells(i, j) = j   '目前工作簿第一頁的第I行第J列

   Next j

 Next i

 With xlsheet                                '設定邊框為是實線

    .Range(.Cells(7, 1), .Cells(28, 29)).Borders.LineStyle = xlContinuous

 End With

xlsheet.SaveAs "d:/temp/w2.xls"           ‘按指定檔案名存盤

' 引用目前工作簿的第二頁

 Set xlsheet = xlapp.Application.Worksheets(2) 

     xlsheet.Cells(7, 2) = 789   ‘在第二頁的第7行第2列寫入789

    Set xlbook = xlapp.Application.Workbooks.Add '建立一空白工作簿

End Sub

  參照上述代碼,就可以随心所欲地發揮你的程式設計藝術了。其實你還可以讓Excel在背景運作,甚至于直接在列印機上輸出結果,認人感覺不到Excel在運作,是不是很友善?

  以上隻是本人的一點心得,若有錯誤,不吝賜教。

繼續閱讀