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在運作,是不是很友善? 以上隻是本人的一點心得,若有錯誤,不吝賜教。 |