下面是EXCEL對象的詳解
1 前言
做為壹種簡捷、系統的 Windows應用程序開發工具,VB具有強大的數據處理功能,提供了多種數據訪問方法,可以方便地存取Microsoft SQL Server、Oracle、XBase等多種數據庫,被廣泛應用於建立各種信息管理系統。但是,VB缺乏足夠的、符合中文習慣的數據表格輸出功能,雖然使用Crystal Report控件及 Crystal Reports程序可以輸出報表,但操作起來比較麻煩,中文處理能力也不理想。Excel在表格方面有著強大的功能,我們可以用VB編寫直接控制Excel操作的程序,方法是用VB的OLE自動化技術獲取Excel的控制句柄,從而直接控制Excel的壹系列操作。本文結合自己的實踐和體會,談談如何在VB6.0應用程序中調用Exce12000,供大家參考。
2 Excel對象模型
為了在VB應用程序中調用Excel,必須要了解Excel對象模型。Excel對象模型描述了Excel的理論結構,所提供的對象很多,涉及VB調用Excel時最可能用到的對象有:
/wiki/ow.asp?p=Excel%B6%D4%CF%F3%C4%A3%D0%CD&a=print
3 調用Excel
在VB應用程序中調用Excel,實質是將Excel作為壹個外部對象來引用,由Excel對象模型提供能從VB應用程序內部來程序化操縱的對象以及相關的屬性、方法和事件。
3.1 在VB工程中添加對Excel類型庫的引用
為了能從VB應用程序中訪問Excel豐富的內部資源,使Excel應用程序運行得更快,需要在VB工程中添加對Excel類型庫的引用。具體步驟如下:
1) 在VB應用程序中調用Excel,妳的計算機系統中必須安裝Excel。從VB5“工程”菜單中選擇“引用”;
2) 在“引用”對話框中選擇Excel類型庫:"Microsoft Excel9.0 Object Library";
3) 單擊左邊小方框,使之出現“√”符號;
4) 按“確定”退出。
3.2 引用Application對象
Application對象是Excel對象模型的頂層,表示整個Excel應用程序。在VB應用程序中調用Excel,就是使用Application對象的屬性、方法和事件。為此,首先要聲明對象變量:
Dim VBExcel As Object
或直接聲明為Excel對象:
Dim VBExcel As Excel.Application
在聲明對象變量之後,可用CreateObject函數或GetObject函數給變量賦值新的或已存在的Application對象引用。
1)用CreateObject函數生成新的對象引用:
Set VBExcel=CreateObject ("Excel.Application")
字符串“Excel.Application”是提供Excel應用程序的編程ID,這個變量引用Excel應用程序本身。
2)用GetO場ect函數打開已存在的對象引用:
Set AppExcel=GetObject("Temp.XLS")
上面語句打開文件Temp.XLS。
3)Application對象常用的屬性、方法
Visible屬性取True或False,表明Excel應用程序是否可見。
Left,Top屬性Excel窗口的位置;
Height, Width屬性Excel窗口的大小;
WindowState屬性指定窗口的狀態;
Quit方法,退出Microsoft Excel;
Calculate方法,重新計算所有打開的工作簿、工作表或單元格。
Evaluate方法,求值數學表達式並返回結果。
3.3 使用Excel應用程序
下面分類給出其中常用的屬性和方法。
1)使用工作薄
Workbook對象代表Excel應用程序中當前打開的壹個工作簿,包含在Workbooks集合中。可以通過Workbooks集合或表示當前活動工作簿的Active Workbook對象訪問Workbook對象。
常用的方法有:
Add方法:創建新的空白工作簿,並將其添加到集合中。
Open方法:打開工作簿。
Activate方法:激活工作簿,使指定工作簿變為活動工作簿,以便作為Active Workbook對象使用。
Save方法:按當前路徑和名稱保存現有工作簿(如是首次保存,則將其保存到缺省名稱中,如BOOK1.XLS)。
SaveAs方法:首次保存工作簿或用另壹名稱保存工作簿。
Close方法:關閉工作簿。
PrintOut方法:打印工作簿,語法為:
PrintOut (from, To, Copies, Preview, Printer, ToFile, Collate)
可選參數:
From:打印的起始頁號,如省略將從起始位置開始打印。
To:打印的終止頁號,如省略將打印至最後壹頁。
Copies:要打印的份數,如省略將只打印壹份。
Preview:如果為True則Excel打印指定對象之前進行打印預覽。如果為False或省略則立即打印該對象。
Printer:設置活動打印機的名稱。
ToFile:如果為True則打印輸出到文件。
Collate:如果為True則逐份打印每份副本。
下面語句將活動工作簿的2到5頁打印3份:
ActiveWorkbook.PrintOut From:=2 To 5 Copies:=3
2)使用工作表
Sheets集合表示工作簿中所有的工作表。可以通過Sheets集合來訪問、激活、增加、更名和刪除工作表。壹個Worksheet對象代表壹個工作表。
常用的屬性、方法有:
Worksheets屬性:返回Sheets集合。
Name屬性:工作表更名。
Add方法:創建新工作表並將其添加到工作簿中。
Select方法:選擇工作表。
Copy方法:復制工作表。
Move方法:將指定工作表移到工作簿的另壹位置。
Delete方法:刪除指定工作表。
PrintOut方法:打印工作表。
示例:將C盤工作簿中的工作表復制到A盤工作簿中:
Dim VBExcel As Excel.Application
Set VBExcel=CreateObject("Excel.Application")
With VBExcel
Workbooks.Open "C:\Temp\Ex1.XLS"
Workbooks.Open"A:\Ex2.XLS"
Workbooks("Ex1.XLS").Sheets ("Sales").Copy
Workbooks("Ex2.XLS")
Workbooks("Ex2.XLS").Save
Workbooks("Ex1.XLS").Close
Workbooks("Ex2.XLS").Close
Quit
End With
3)使用單元範圍
Range對象代表工作表的某壹單元格、某壹行、某壹列、某壹選定區域或者某壹三維區域。
常用的屬性、方法有:
Range屬性:Range (arg)其中arg為A1樣式符號,表示單個單元格或單元格區域。
Cells屬性:Cells (row, col )(其中row為行號,col為列號)表示單個單元格。
ColumnWidth屬性:指定區域中所有列的列寬。
Rowl3eight屬性:指定區域中所有行的行寬。
Value屬性:指定區域中所有單元格的值(缺省屬性)。
Formula屬性:指定單元格的公式,由A1--樣式引用。
Select方法:選擇範圍。
Copy方法:將範圍的內容復制到剪貼板。
C1earContents方法:清除範圍的內容。
Delete方法:刪除指定單元範圍。
4)使用圖表
Chart對象代表工作簿中的圖表。該圖表既可為嵌人式圖表(包含於ChartObject對象中)也可為分立的圖表工作表。
常用方法有:
Add方法:新建圖表工作表,返回Chart對象。
PrineOut方法:打印圖表。
ChartWizard方法:修改給定圖表的屬性,其語法為:
ChartWizard(Source, Gallery, Format, P1otBy, CategoryLabels, SeriesLabels, HasLegend, Title, CategoryTitle, ValueTitle, ExtraTitle)
其中:
Source:包含新圖表的源數據的區域。如省略,將修改活動圖表工作表或活動工作表中處於選定狀態的嵌人式圖表。
Gallery:圖表類型,其值可為下列常量之壹:xlArea, x1Bar, xlColumn, xlLine, x1Pie, xlRadar,x1XYScatter, xlCombination, x13DArea, x13Dbar,x13DColumn, x13DLine, x13Dpie,x13 Dsurface,xlDoughnut或xlDefaultAutoFormat。
Format:內置自動套用格式的編號。如省略,將選擇默認值。
P1otBy:指定系列中的數據是來自行(xlRows)還是列(xlColumns)。
CategoryLabels:表示包含分類標誌的源區域內行數或列數的整數。
SeriesLabels:表示包含系列標誌的源區域內行數或列數的整數。
HasLegend:若指定True,則圖表將具有圖例。
Title:圖表標題文字。
CategoryTitle:分類軸標題文字。
ValueTitle:數值軸標題文字。
ExtraTitle:三維圖表的系列軸標題,或二維圖表的第二數值軸標題。
可組合使用Add方法和ChartWizard方法,以創建包含工作表中數據的圖表工作表。下例基於工作表“Sheetl”中單元格區域“A1:A20”中的數據生成新的折線圖並打印。
With Charts.Add
ChartWizard source:=Worksheets ("sheet1").Range_
("a1:a20"),gallery:=xlLine, title:=“折線圖表”
Printout
End With
5)使用Excel工作表函數
在VB語句中可使用大部分的Excel工作表函數,可通過WorksheetFunction對象調用Excel工作表函數。下面的Sub過程用Min工作表函數求出指定區域中單元格的最小值,並通過消息框顯示結果值。
Sub UserFunction()
Dim myRange As Range
Set myRange=Worksheets ("Sheet1").Range("B2:F10")
answer=Application.WorksheetFunction.Min(myRange)
MsgBox answer
End Sub
如果使用以區域引用為參數的工作表函數,必須指定壹個Range對象。如可用Match工作表函數對A1:A10區域的所有單元格進行搜索。
Sub FindFirst()
myVar=Application.WorksheetFunction.Match_
(9,orksheets( 1).Range("A1:A10"),0)
MsgBox myVar
End Sub
要在單元格中插人工作表函數,可將該函數指定為對應於Range對象的Formula屬性值。在以下示例中,將當前工作簿Sheetl內A1:B3區域的Formula屬性指定為RAND工作表函數(此函數產生二個隨機數)。
Sub InsertFormula()
Worksheets ("Sheet1" ).Range("A1:B3").Formula="RAND()"
End Sub
以上簡要介紹了Excel對象模型中部分對象及其屬性和方法,更詳細的信息可參閱Excel 2000幫助中的“Microsoft Excel Visual Basic參考”壹節的內容。實際上,Microsoft Office家族的Word,PowerPoint, Access和Project等應用程序都可以在VB應用程序中調用,其原理和步驟完全相同,只是其對象模型有所不同而已。
4、示例:
首先建立壹個窗體(FORM1),在窗體中加入壹個DATA控件和壹按鈕,引用Microsoft office/9.shtml' target='_blank' class='article'>Excel類型庫:從"工程"菜單中選擇"引用"欄;選擇Microsoft Excel 9.0 Object Library;選擇"確定"。
在FORM的LOAD事件中加入:
Data1.DatabaseName = 數據庫名稱
Data1.RecordSource = 表名
Data1.Refresh
在按鈕的CLICK事件中加入
Dim Irow, Icol As Integer
Dim Irowcount, Icolcount As Integer
Dim Fieldlen() "存字段長度值
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
With Data1.Recordset.MoveLast
If .RecordCount < 1 Then
MsgBox ("Error 沒有記錄!")
Exit Sub
End If
Irowcount = .RecordCount "記錄總數
Icolcount = .Fields.Count "字段總數
ReDim Fieldlen(Icolcount).MoveFirst
For Irow = 1 To Irowcount + 1
For Icol = 1 To Icolcount
Select Case Irow
Case 1 "在Excel中的第壹行加標題
xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1).Name
Case 2 "將數組FIELDLEN()存為第壹條記錄的字段長
If IsNull(.Fields(Icol - 1)) = True Then
Fieldlen(Icol) = LenB(.Fields(Icol - 1).Name)
Else
Fieldlen(Icol) = LenB(.Fields(Icol - 1))
End If
xlSheet.Columns(Icol).ColumnWidth = Fieldlen(Icol)
xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1)
Case Else
Fieldlen1 = LenB(.Fields(Icol - 1))
If Fieldlen(Icol) < Fieldlen1 Then
xlSheet.Columns(Icol).ColumnWidth = Fieldlen1
Fieldlen(Icol) = Fieldlen1
Else
xlSheet.Columns(Icol).ColumnWidth = Fieldlen(Icol)
End If
xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1)
End Select
Next
If Irow <> 1 Then
If Not .EOF Then .MoveNext
End If
Next
With xlSheet
.Range(.Cells(1, 1), .Cells(1, Icol - 1)).Font.Name = "黑體"
.Range(.Cells(1, 1), .Cells(1, Icol - 1)).Font.Bold = True
.Range(.Cells(1, 1), .Cells(Irow, Icol - 1)).Borders.LineStyle = xlContinuous
End With
xlApp.Visible = True
xlBook.Save
Set xlApp = Nothing
End With