一,VBA入門知識
1,激活工作簿
2,創(chuàng)建新工作簿
3,打開工作簿
4,用編號引用工作表
5,用名稱引用工作表
6,將文檔保存為 Web 頁
7,用 A1 樣式的記號引用單元格和單元格區(qū)域
8,用編號引用單元格
9,引用行或列
10,用快捷記號引用單元格
11,引用命名單元格區(qū)域
12,按相對于其他單元格的方式來引用單元格
13,用 Range 對象引用單元格
14,引用工作表上的所有單元格
15,引用若干單元格區(qū)域
16,在單元格區(qū)域中循環(huán)
17,選定和激活單元格
18,處理三維區(qū)域
19,處理活動單元格
20,在工作表上使用 ActiveX 控件
21,在文檔中使用 ActiveX 控件
22,創(chuàng)建自定義對話框
23,在窗體上使用 Microsoft Office Web 組件
24,內(nèi)置對話框參數(shù)表
25,使用 Microsoft Excel 對象的事件
26,在 Visual Basic 中使用 Microsoft Excel 工作表函數(shù)
27,處理形狀(圖形對象)
28,在某一 Microsoft Office 應(yīng)用程序中控制其他 Microsoft Office 應(yīng)用程序
29,OLE 程序標識符
30,關(guān)于數(shù)字簽名
31,啟動 Microsoft Excel 時不運行"自動執(zhí)行宏"
32,焦點
二,了解對象,屬性,方法和事件
1,了解對象,屬性,方法和事件
2
2,Application 對象
3,Workbook 對象
4,Workbooks 屬性
5,Range 對象
6,Range 屬性
7,Cells 屬性
8,Caller 屬性
9,Offset 屬性
10,Rows 屬性
11,Activate 事件
12,Activate, Deactivate 事件
13,Activate 方法
14,WorkbookActivate 事件
15,WindowActivate 事件
16,On Error 語句
17,在工作表上使用 ActiveX 控件
18,Add 方法(Scenarios 集合)
19,Scenarios 集合對象
20,Add 方法 (Validation 對象)
21,Validation 對象
22,Validation 屬性
23,Open 事件
24,Open 方法
25, Click 事件
26,Close 方法
27,Change 事件
28,Value 屬性
29,DblClick 事件
30,SheetBeforeRightClick 事件
31,Select 方法
32,Select 事件
33,Goto 方法
34,Worksheet 對象
35,SheetChange 事件
36,SheetActivate 事件
37,OpenLinks 方法
38,Enabled 屬性
三,VBA語法
(一)Visual Basic 的命名規(guī)則
1,寫 Visual Basic 語句
2,寫聲明語句
3
3,Dim 語句的語法
4,Activate 方法的語法
5,Set 語句
6,MsgBox 函數(shù)的語法
7,選項語句的語法
8,AddressOf 運算符
9,了解變體
10,寫賦值語句
11,寫可執(zhí)行的語句
12,Public 語句
13,Private 語句
14,使用數(shù)組
15,使用常數(shù)
16,AppActivate 語句
17,Beep 語句
19,Date 語句
20,Error 語句
21,Exit 語句
22,GoSub...Return 語句
23,GoTo 語句
24,Input # 語句
25,Let 語句
26,Load 語句
27,Name 語句
28,On...GoSub,On...GoTo 語句
29,Open 語句
30,Rem 語句
31,Stop 語句
32,Time 語句
33,While...Wend 語句
(二)邏輯語句
1,If...Then...Else 語句
2,使用 Select Case 語句
3,使用 For...Next 語句
4,For Each...Next 語句
5, Do...Loop 語句
6, With 語句
(三)過程
1,寫 Sub 過程
2,寫 Function 過程
3,寫 Property 過程
4
四, ActiveX 控件
1,AfterUpdate 事件
2,Click 事件
3,Click 事件,命令按鈕控件,Accelerator 和 Caption 屬性示例
4,DblClick 事件
5,Error 事件
6,KeyDown 和 KeyUp 事件
7,KeyPress 事件
8,KeyPress 事件示例
9,MouseDown 和 MouseUp 事件
10,MouseMove 事件
11,列表框控件
12,SpinDown 和 SpinUp 事件
13,SpinDown,SpinUp 事件和 Delay 屬性示例
14,組合框控件
15,命令按鈕控件
16,標簽控件
17,列表框控件,DataObject 對象,MouseMove 事件和 StartDrag,SetText 方法示例
18,多頁控件
19,選項按鈕控件
20,文本框控件
21,切換按鈕控件
22,用戶窗體窗口
5
一,VBA入門知識
1,激活工作簿
用 Activate 方法激活工作簿后,該工作簿將放在活動窗口中.下述過程激活已打
開的工作簿"MyBook.xls".
Sub MakeActive()
Workbooks("MyBook.xls").Activate
End Sub
2,創(chuàng)建新工作簿
如果要用 Visual Basic 創(chuàng)建新的工作簿,應(yīng)使用 Add 方法.下述過程創(chuàng)建了新工
作簿.Microsoft Excel 自動將該工作簿命名為"BookN",其中 N 是下一個可用的數(shù)字.
新工作簿將成為活動工作簿.
Sub AddOne()
Workbooks.Add
End Sub
創(chuàng)建新工作簿的較好的方法是將其賦給一個對象變量.下例中,由 Add 方法返回的
Workbook 對象賦給了對象變量 newBook.然后,又設(shè)置了 newBook 的若干屬性.使用對
象變量可以很容易地控制新工作簿.
Sub AddNew()
Set newBook = Workbooks.Add
With newBook
.Title = "1995 Sales"
.Subject = "Sales"
.SaveAs filename:="95Sales.xls"
End With
End Sub
3,打開工作簿
用 Open 方法打開一個工作簿時,該工作簿將成為 Workbooks 集合的成員.下述過
程打開 C 盤上"MyFolder"文件夾內(nèi)的工作簿"MyBook.xls".
Sub OpenUp()
Workbooks.Open("C:\MyFolder\MyBook.xls")
End Sub
4,用編號引用工作表
編號是賦予工作表的連續(xù)的數(shù)字,這些數(shù)字的順序,是根據(jù)同一類型的工作表的標
簽位置按由左而右的順序確定的.下述過程使用 Worksheets 屬性激活活動工作簿上的第
一張工作表.
Sub FirstOne()
Worksheets(1).Activate
End Sub
如果要處理所有類型的工作表(工作表,圖表,模塊表和對話框編輯表),可用 Sheets
屬性.下述過程激活工作簿中的第四張工作表.
Sub FourthOne()
6
Sheets(4).Activate
End Sub
注意 移動,添加或刪除工作表時,編號順序?qū)淖?
5,用名稱引用工作表
使用 Worksheets 屬性和 Charts 屬性時,可用名稱標識工作表.下述語句激活活
動工作簿內(nèi)的不同工作表.
Worksheets("Sheet1").Activate
Charts("Chart1").Activate
DialogSheets("Dialog1").Activate
可用 Sheets 屬性返回工作表,圖表,模塊表或?qū)υ捒蚓庉嫳?Sheets 集合包含了
所有這些表.下例激活活動工作簿內(nèi)的圖表"Chart1".
Sub ActivateChart()
Sheets("Chart1").Activate
End Sub
注意 嵌入到工作表上的圖表是 ChartObjects 集合的成員,而那些位于單獨的表上
的圖表則屬于 Charts 集合.
6,將文檔保存為 Web 頁
在 Microsoft Excel 2000 中,可以將工作簿,工作表,圖表,區(qū)域,查詢表,數(shù)
據(jù)透視表報表,打印區(qū)域或自動篩選區(qū)域保存到 Web 頁中.也可以直接在 Excel 中編輯
HTML 文件.
將文檔保存為 Web 頁
將文檔保存為 Web 頁是一個創(chuàng)建并保存 HTML 文件及其支持文件的過程.要完成此
過程,可使用 SaveAs 方法,如下例所示,此示例將活動工作簿保存為文件
"C:\Reports\myfile.htm".
ActiveWorkbook.SaveAs _
Filename:="C:\Reports\myfile.htm", _
FileFormat:=xlHTML
自定義 Web 頁
通過設(shè)置 DefaultWebOptions 對象和 WebOptions 對象的屬性,用戶可以自定義
HTML 文檔的外觀,內(nèi)容,瀏覽器支持,編輯支持,圖形格式,屏幕分辨率,文件組織和
編碼.DefaultWebOptions 對象中包含應(yīng)用程序級別的屬性.而任何具有相同名稱的工作
簿級別的設(shè)置(包含在 WebOptions 對象中)會覆蓋這些設(shè)置.
設(shè)置完屬性后,可以使用 Publish 方法將工作簿,工作表,圖表,區(qū)域,查詢表,
數(shù)據(jù)透視表報表,打印區(qū)域或自動篩選區(qū)域保存到 Web 頁中.下例設(shè)置了一些應(yīng)用程序
級別的屬性,然后又設(shè)置了活動工作簿的 AllowPNG 屬性,而此設(shè)置將覆蓋應(yīng)用程序級別
的默認設(shè)置.最后,本示例將該區(qū)域保存為"C:\Reports\1998_Q1.htm".
With Application.DefaultWebOptions
.RelyonVML = True
.AllowPNG = True
.PixelsPerInch = 96
End With
7
With ActiveWorkbook
.WebOptions.AllowPNG = False
With .PublishObjects(1)
.FileName = "C:\Reports\1998_Q1.htm"
.Publish
End With
End With
也可以直接將文件保存到 Web 服務(wù)器上.下例將一個區(qū)域保存到 Web 服務(wù)器上,
假定該 Web 頁的 URL 地址為
http://example.homepage.com/annualreport.htm.With ActiveWorkbook
With .WebOptions
.RelyonVML = True
.PixelsPerInch = 96
End With
With .PublishObjects(1)
.FileName = _
"
http://example.homepage.com/annualreport.htm"
.Publish
End With
End With
在 Microsoft Excel 中打開 HTML 文檔
要在 Excel 中編輯 HTML 文檔,請首先使用 Open 方法打開該文檔.下例打開文件
"C:\Reports\1997_Q4.htm"以便進行編輯.
Workbooks.Open Filename:="C:\Reports\1997_Q4.htm"
打開文件后,就可以通過設(shè)置 DefaultWebOptions 和 WebOptions 對象的屬性自定
義該 HTML 文檔的外觀,內(nèi)容,瀏覽器支持,編輯支持,圖象格式,屏幕分辨率,文件組
織和編碼.
7,用 A1 樣式的記號引用單元格和單元格區(qū)域
可在 Range 方法中以 A1 樣式的記號引用單元格和單元格區(qū)域.下述 Sub 過程將
單元格區(qū)域 A1
5 的字體設(shè)置為加粗.
Sub FormatRange()
Workbooks("Book1").Sheets("Sheet1").Range("A1
5") _
.Font.Bold = True
End Sub
下表演示了用于 Range 方法的一些 A1-樣式的引用.
引用 含義
Range("A1") 單元格"A1"
Range("A1:B5") 從單元格"A1"到單元格"B5"的區(qū)
域
8
Range("C5
9,G9:H16") 多塊的選定區(qū)域
Range("A:A") "A"列
Range("1:1") 第一行
Range("A:C") 從"A"列到"C"列的區(qū)域
Range("1:5") 從第一行到第五行的區(qū)域
Range("1:1,3:3,8:8") 第 1,3 和 8 行
Range("A:A,C:C,F:F") "A"列,"C"列和"F"列
8,用編號引用單元格
可用 Cells 屬性及行號和列標引用單個單元格.該屬性返回代表單個單元格的
Range 對象.下例中,Cells(6,1) 返回工作表"Sheet1"上的單元格"A6",然后將
Value 屬性設(shè)置為 10.
Sub EnterValue()
Worksheets("Sheet1").Cells(6, 1).Value = 10
End Sub
因為可用變量代入單元格索引值,所以 Cells 屬性非常適于在單元格區(qū)域中循環(huán),
如下例所示.
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1").Cells(counter, 3).Value = counter
Next counter
End Sub
注意 如果要同時對某一區(qū)域內(nèi)的所有單元格修改屬性或應(yīng)用方法,可用 Range 屬
性.有關(guān)的詳細內(nèi)容,請參閱"用 A1 樣式的記號引用單元格和單元格區(qū)域".
9,引用行或列
可用 Rows 屬性或 Columns 屬性處理整行或整列.這兩個屬性返回代表單元格區(qū)域
的 Range 對象.下例中,用 Rows(1) 返回工作表"Sheet1"上的第一行,然后將該行的
Font 對象的 Bold 屬性設(shè)置為 True.
Sub RowBold()
Worksheets("Sheet1").Rows(1).Font.Bold = True
End Sub
下表演示了使用 Rows 屬性和 Columns 屬性的一些行和列的引用.
引用 含義
Rows(1) 第一行
Rows 工作表上所有的行
9
Columns(1) 第一列
Columns("A") 第一列
Columns 工作表上所有的列
如果要同時處理若干行或列,可先創(chuàng)建一個對象變量,然后用 Union 方法把對 Rows
屬性或 Columns 屬性的多個調(diào)用組合起來.下例將活動工作簿中第一張工作表上的第一
行,第三行和第五行的字體設(shè)置為加粗.
Sub SeveralRows()
Worksheets("Sheet1").Activate
Dim myUnion As Range
Set myUnion = Union(Rows(1), Rows(3), Rows(5))
myUnion.Font.Bold = True
End Sub
10,用快捷記號引用單元格
可用方括號將 A1 樣式的引用或命名區(qū)域的名稱括起來,作為 Range 屬性的快捷方
式.這樣就不必鍵入"Range"和引號,如下述各例所示.
Sub ClearRange()
Worksheets("Sheet1").[A1:B5].ClearContents
End Sub
Sub SetValue()
[MyRange].Value = 30
End Sub
11,引用命名單元格區(qū)域
用名稱比用 A1 樣式的記號更容易標識單元格區(qū)域.如果要命名選定的單元格區(qū)域,
單擊公式欄左端的名稱框,鍵入名稱,然后按 ENTER 鍵.
引用命名單元格區(qū)域
下例引用了工作簿"MyBook.xls"中的單元格區(qū)域"MyRange".
Sub FormatRange()
Range("MyBook.xls!MyRange").Font.Italic = True
End Sub
下例在工作簿"Report.xls"中引用了特定于工作表的單元格區(qū)域
"Sheet1!Sales".
Sub FormatSales()
Range("[Report.xls]Sheet1!Sales").BorderAround weight:=xlthin
End Sub
如果要選定命名的單元格區(qū)域,可用 GoTo 方法,該方法將激活指定區(qū)域所在的工
作簿和工作表,然后選定該區(qū)域.
Sub ClearRange()
Application.Goto Reference:="MyBook.xls!MyRange"
Selection.ClearContents
10
End Sub
下例顯示了在活動工作簿中對上述同一過程的寫法.
Sub ClearRange()
Application.Goto Reference:="MyRange"
Selection.ClearContents
End Sub
在命名區(qū)域中的單元格上循環(huán)
下例用 For Each...Next 循環(huán)語句在命名區(qū)域中的每一個單元格上循環(huán).如果該區(qū)
域中的任一單元格的值超過 limit 的值,就將該單元格的顏色改為黃色.
Sub ApplyColor()
Const limit As Integer = 25
For Each c In Range("MyRange")
If c.Value > limit Then
c.Interior.ColorIndex = 27
End If
Next c
End Sub
12,按相對于其他單元格的方式來引用單元格
處理位于相對于其他單元格的某一位置單元格的常用方法是使用 Offset 屬性.下
例中,將位于活動工作表上活動單元格下一行和右邊三列的單元格的內(nèi)容設(shè)置為雙下劃
線.
Sub Underline()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
注意 可用 Offset 屬性而不用絕對引用方式來記錄宏.指向"工具"菜單內(nèi)的"錄
制宏"子菜單,然后單擊"使用相對引用"命令即可.
如果要在單元格區(qū)域中循環(huán),可在循環(huán)中將 Cells 屬性和變量共用.下例用從 5 到
100 的值以 5 為步長填充第三列的前 20 個單元格.變量 counter 用作 Cells 屬性的
行號.
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1").Cells(counter, 3).Value = counter * 5
Next counter
End Sub
13,用 Range 對象引用單元格
將對象變量設(shè)置為 Range 對象,即可用變量名方便地操縱該單元格區(qū)域.
下述過程創(chuàng)建了對象變量 myRange,然后將活動工作簿中工作表"Sheet1"上的單
元格區(qū)域"A1
5"賦予該變量.隨后的語句用該變量代替該區(qū)域?qū)ο?以修改該區(qū)域的
屬性.
Sub Random()
11
Dim myRange As Range
Set myRange = Worksheets("Sheet1").Range("A1:D5")
myRange.Formula = "=RAND()"
myRange.Font.Bold = True
End Sub
14,引用工作表上的所有單元格
如果對工作表應(yīng)用 Cells 屬性時不指定索引,該屬性將返回代表工作表上所有單元
格的 Range 對象.下述 Sub 過程清除活動工作簿中工作表"Sheet1"上的所有單元格的
內(nèi)容.
Sub ClearSheet()
Worksheets("Sheet1").Cells.ClearContents
End Sub
15,引用若干單元格區(qū)域
使用適當?shù)姆椒梢院苋菀椎赝瑫r引用若干單元格區(qū)域.可用 Range 和 Union 方
法引用任意組合的單元格區(qū)域;用 Areas 屬性可引用工作表上選定的一組單元格區(qū)域.
使用 Range 屬性
使用 Range 屬性時,在兩個或多個引用之間加上逗號,就可以引用多重區(qū)域.下例
清除了工作表"Sheet1"上三個單元格區(qū)域的內(nèi)容.
Sub ClearRanges()
Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18"). _
ClearContents
End Sub
命名區(qū)域使得用 Range 屬性處理多重區(qū)域更為容易.下例可在三個命名區(qū)域處于同
一工作表時運行.
Sub ClearNamed()
Range("MyRange, YourRange, HisRange").ClearContents
End Sub
使用 Union 方法
用 Union 方法可將多個單元格區(qū)域組合到一個 Range 對象中.下例創(chuàng)建了名為
myMultipleRange 的 Range 對象,并將其定義為單元格區(qū)域"A1:B2"和"C3:D4"的組
合,然后將該組合區(qū)域的字體設(shè)置為加粗.
Sub MultipleRange()
Dim r1, r2, myMultipleRange As Range
Set r1 = Sheets("Sheet1").Range("A1:B2")
Set r2 = Sheets("Sheet1").Range("C3:D4")
Set myMultipleRange = Union(r1, r2)
myMultipleRange.Font.Bold = True
End Sub
使用 Areas 屬性
可用 Areas 屬性引用選定的單個單元格區(qū)域或多塊的選定區(qū)域集合.下述過程計算
選定區(qū)域內(nèi)的塊數(shù)目,如果選定區(qū)域中有多個塊,就顯示警告消息.
12
Sub FindMultiple()
If Selection.Areas.Count > 1 Then
MsgBox "Cannot do this to a multiple selection."
End If
End Sub
16,在單元格區(qū)域中循環(huán)
使用 Visual Basic 時,經(jīng)常需要對某一區(qū)域內(nèi)的每個單元格運行同一段語句.為
達到這一目的,可將循環(huán)語句和標識每個單元格的一個或多個方法組合使用,每循環(huán)一次,
就對一個單元格執(zhí)行一次操作.
在單元格區(qū)域中循環(huán)的一種方法是使用 For...Next 循環(huán)語句和 Cells 屬性.使用
Cells 屬性時,可用循環(huán)計數(shù)器(或其他變量或表達式)作為單元格編號.下例中,變量
counter 代替了行號.此過程將在單元格區(qū)域"C1:C20"中循環(huán),將所有絕對值小于 0.01
的數(shù)字都設(shè)置為 0(零).
Sub RoundToZero1()
For counter = 1 To 20
Set curCell = Worksheets("Sheet1").Cells(counter, 3)
If Abs(curCell.Value) < 0.01 Then curCell.Value = 0
Next counter
End Sub
在單元格區(qū)域中循環(huán)的另一種簡便方法是使用 For Each...Next 循環(huán)語句和由
Range 方法返回的單元格集合.在每一次循環(huán)過程中,Visual Basic 都為下一次循環(huán)所
用的單元格自動設(shè)置一個對象變量.下述過程在單元格區(qū)域"A1:D10"中循環(huán),將所有絕
對值小于 0.01 的數(shù)字都設(shè)置為 0(零).
Sub RoundToZero2()
For Each c In Worksheets("Sheet1").Range("A1:D10").Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
如果不知道要循環(huán)的單元格區(qū)域的確切邊界,可用 CurrentRegion 屬性返回活動單
元格周圍的區(qū)域.例如,下述過程在工作表上運行時,將在活動單元格周圍的區(qū)域內(nèi)循環(huán),
將所有絕對值小于 0.01 的數(shù)字都設(shè)置為 0(零).
Sub RoundToZero3()
For Each c In ActiveCell.CurrentRegion.Cells
If Abs(c.Value) 1 Then
MsgBox "You cannot carry out this command " & _
"on multi-area selections"
End If
End Sub
10,Rows 屬性
Application 對象:返回一個 Range 對象,此對象代表當前工作表的所有行.如果
當前文檔不是工作表, Rows 屬性無效.只讀.
Range 對象:返回一個 Range 對象,此對象代表指定區(qū)域中的所有行.只讀.
Worksheet 對象: 返回一個 Range 對象,此對象代表指定工作表中的所有行.只
讀.
有關(guān)返回一個集合中單個成員的詳細內(nèi)容,請參閱返回集合中的對象.
說明
在不用對象識別符的情況下使用此屬性等價于 ActiveSheet.Rows.
當應(yīng)用于多選區(qū)域的Range對象時,該屬性只返回該范圍中第一個區(qū)域的行.例如,
如果 Range 對象有兩個 areas — A1:B2 和 C3:D4 — Selection.Rows.Count 返回 2
而不是 4. 要在一個可能包含多選區(qū)域的范圍時,利用Areas.Count來判斷該范圍是否
包含多個選擇區(qū)域.如果是,則象第 3 個示例中所示,在該范圍中的每個區(qū)域循環(huán).
Rows 屬性示例
本示例刪除 Sheet1 的第三行.
Worksheets("Sheet1").Rows(3).Delete
47
本示例檢查工作表一當前區(qū)域中的行,如果某行的第一個單元格值與前一行的第一
個單元格的值相等,則刪除此行.
For Each rw In Worksheets(1).Cells(1, 1).CurrentRegion.Rows
this = rw.Cells(1, 1).Value
If this = last Then rw.Delete
last = this
Next
本示例顯示 Sheet1 選定區(qū)域的行數(shù).如果是多重選定區(qū)域,本示例將對每一個子
區(qū)域進行循環(huán).
Worksheets("Sheet1").Activate
areaCount = Selection.Areas.Count
If areaCount <= 1 Then
MsgBox "The selection contains " & _
Selection.Rows.Count & " rows."
Else
i = 1
For Each a In Selection.Areas
MsgBox "Area " & i & " of the selection contains " & _
a.Rows.Count & " rows."
i = i + 1
Next a
End If
11,Activate 事件
激活一個工作簿,工作表,圖表或嵌入式圖表時產(chǎn)生此事件.
語法
Private Sub object_Activate()
object Chart,Workbook,或者 Worksheet.有關(guān)使用 Chart 對象的事件的詳細內(nèi)
容,請參閱嵌入式圖表事件的用法.
說明
切換兩個顯示同一工作簿的窗口時,將產(chǎn)生 WindowActivate 事件,但不產(chǎn)生工作
簿的 Activate 事件.
新建窗口時不產(chǎn)生本事件.
Activate 事件示例
本示例當激活工作表時對 A1:A10 區(qū)域進行排序.
Private Sub Worksheet_Activate()
Range("a1:a10").Sort Key1:=Range("a1"), Order:=xlAscending
End Sub
Activate 方法示例
本示例激活工作表"Sheet1".
Worksheets("Sheet1").Activate
本示例選定工作表"Sheet1"中的單元格區(qū)域"A1:C3",并激活單元格"B2".
48
Worksheets("Sheet1").Activate
Range("A1:C3").Select
Range("B2").Activate
本示例激活工作簿 Book4.xls.如果工作簿 Book4.xls 有若干窗口,本示例激活第
一個,即 Book4.xls:1.
Workbooks("BOOK4.XLS").Activate
12,Activate, Deactivate 事件
在對象變成活動窗口的時候就會發(fā)生 Activate 事件.而當對象不再是活動窗口時,
則會發(fā)生 Deactivate 事件.
語法
Private Sub object_Activate()
Private Sub object_Deactivate()
object 代表一個對象表達式,其值為"應(yīng)用于"列表中的對象.
說明
對象可使用代碼中的 Show 方法變成活動的.
只有在對象是可見的時候才會發(fā)生 Activate 事件.除非使用 Show 方法,否則用
Load 加載的 UserForm是不可見的.
只有在應(yīng)用程序中移動焦點時才會發(fā)生 Activate 及 Deactivate 事件.而將焦點
移出或移動到另一個應(yīng)用程序中的對象并不會觸發(fā)此事件.
在卸載對象時,并不會發(fā)生 Deactivate 事件.
13,Activate 方法
激活對象,如下表所示.
對象 說明
Chart,ChartObject 使該圖表成為活動圖表.
Worksheet 使該工作表成為活動工作表.等同于單擊工作表的選項卡.
OLEObject 激活對象.
Pane 激活窗格.如果該窗格不在活動窗口,則該窗格所屬的窗口也
將激活.不能激活凍結(jié)的窗格.
Range 激活單個單元格,該單元格必須處于當前選定區(qū)域內(nèi).可用
Select 方法選定單元格區(qū)域.
Window 將窗口提到 Z-次序的最前面.這樣不會引起可能附加在工作
簿上的 Auto_Activate 或 Auto_Deactivate 宏的運行(可用
RunAutoMacros 方法運行這些宏).
Workbook 激活與該工作簿相關(guān)的第一個窗口.這樣不會引起可能附加在
工作簿上的 Auto_Activate 或 Auto_Deactivate 宏的運行(可用
RunAutoMacros 方法運行這些宏).
語法
expression.Activate
expression必選.該表達式返回"應(yīng)用于"列表中的對象.
14,WorkbookActivate 事件
49
當激活任一工作簿時產(chǎn)生此事件.
語法
Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
app 在類模塊中帶有事件聲明的 Application 類型對象.有關(guān)詳細內(nèi)容,請參閱
Application 對象事件的用法.
Wb 激活的工作簿.
WorkbookActivate 事件示例
本示例當激活一個工作簿時對所有打開的窗口進行排列.
Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
Application.Windows.Arrange xlArrangeStyleTiled
End Sub
工作簿的窗口激活時,將產(chǎn)生本事件.
語法
Private Sub object_WindowActivate(ByVal Wb As Excel.Workbook, ByVal Wn As
Excel.Window)
object Application 對象或 Workbook 對象.有關(guān) Application 對象事件用法的
詳細內(nèi)容,請參閱 Application 對象事件的用法.
Wb 僅用于 Application 對象.顯示在活動窗口中的工作簿.
Wn 激活的窗口.
15,WindowActivate 事件示例
本示例使工作簿窗口激活時最大化.
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
Wn.WindowState = xlMaximized
End Sub
16,On Error 語句
啟動一個錯誤處理程序并指定該子程序在一個過程中的位置;也可用來禁止一個錯
誤處理程序.
語法
On Error GoTo line
On Error Resume Next
On Error GoTo 0
On Error 語句的語法可以具有以下任何一種形式:
語句 描述
On Error
GoTo line
啟動錯誤處理程序,且該例程從必要的 line 參數(shù)中指定的 line
開始.line 參數(shù)可以是任何行標簽或行號.如果發(fā)生一個運行時錯誤,
則控件會跳到 line,激活錯誤處理程序.指定的 line 必須在一個過程
中,這個過程與 On Error 語句相同; 否則會發(fā)生編譯時間錯誤.
On Error
Resume Next
說明當一個運行時錯誤發(fā)生時,控件轉(zhuǎn)到緊接著發(fā)生錯誤的語句
之后的語句,并在此繼續(xù)運行.訪問對象時要使用這種形式而不使用 On
Error GoTo.
On Error 禁止當前過程中任何已啟動的錯誤處理程序.
50
GoTo 0
說明
如果不使用 On Error 語句,則任何運行時錯誤都是致命的;也就是說,結(jié)果會導(dǎo)
致顯示錯誤信息并中止運行.
一個"允許的"錯誤處理程序是由 On Error 語句打開的一個處理程序;一個"活
動的"錯誤處理程序是處理錯誤的過程中允許的錯誤處理程序.如果在錯誤處理程序處于
活動狀態(tài)時(在發(fā)生錯誤和執(zhí)行 Resume,Exit Sub,Exit Function 或 Exit Property 語
句之間這段時間)又發(fā)生錯誤,則當前過程的錯誤處理程序?qū)o法處理這個錯誤.控件返
回調(diào)用的過程.如果調(diào)用過程有一個已啟動的錯誤處理程序,則激活錯誤處理程序來處理
該錯誤.如果調(diào)用過程的錯誤處理程序也是活動的,則控件將再往回傳到前面的調(diào)用過程,
這樣一直進行下去,直到找到一個被允許的但不是活動的錯誤處理程序為止.如果沒有找
到被允許而且不活動的錯誤處理程序,那么在錯誤實際發(fā)生的地方,錯誤本身是嚴重的.
錯誤處理程序每次將控件返回調(diào)用過程時,該過程就成為當前過程.在任何過程中,一旦
錯誤處理程序處理了錯誤,在當前過程中就會從 Resume 語句指定的位置恢復(fù)運行.
注意 一個錯誤處理程序不是 Sub 過程或 Function 過程.它是一段用行標簽或行
號標記的代碼.
錯誤處理程序依靠 Err 對象的 Number 屬性中的值來確定錯誤發(fā)生的原因.在其它
任何錯誤發(fā)生之前,或在調(diào)用一個可能會導(dǎo)致錯誤發(fā)生的過程之前,錯誤處理程序應(yīng)該先
測試或存儲 Err 對象中相關(guān)的屬性值.Err 對象中的屬性值只反映最近發(fā)生的錯誤.
Err.Description 中包含有與 Err.Number 相關(guān)聯(lián)的錯誤信息.
On Error Resume Next 會使程序從緊隨產(chǎn)生錯誤的語句之后的語句繼續(xù)執(zhí)行,或是
從緊隨最近一次調(diào)用含有 On Error Resume Next 語句的過程的語句繼續(xù)運行.這個語句
可以置運行時錯誤于不顧,使程序得以繼續(xù)執(zhí)行.可以將錯誤處理程序放置在錯誤發(fā)生的
地方,而不必將控件傳輸?shù)竭^程中的其它位置.在調(diào)用另一個過程時,On Error Resume Next
語句成為非活動的,所以,如果希望在例程中進行嵌入錯誤處理,則應(yīng)在每一個調(diào)用的例
程中執(zhí)行 On Error Resume Next 語句.
注意 當處理在訪問其它對象期間產(chǎn)生的錯誤時,與其使用 On Error GoTo 指令,
不如使用 On Error Resume Next.每次和對象打交道,在不知道用代碼訪問哪個對象時,
檢查一下 Err 都會打消這種疑慮.可以確定是哪個對象產(chǎn)生錯誤(Err.Source 中指定的
對象),也可以確定是哪個對象將錯誤代碼放在 Err.Number 中.
On Error GoTo 0 停止在當前過程中處理錯誤.即使過程中包含編號為 0 的行,它
也不把行 0 指定為處理錯誤的代碼的起點.如果沒有 On Error GoTo 0 語句,在退出過
程時,錯誤處理程序會自動關(guān)閉.
在錯誤未發(fā)生的時候,為了防止錯誤處理程序代碼運行,請像在下段程序中那樣,
在緊靠著錯誤處理程序的前面寫入 Exit Sub,Exit Function 或 Exit Property 語句.
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
51
. . .
Resume Next
End Sub
此處,錯誤處理程序代碼在 Exit Sub 語句之后,而在 End Sub 語句之前,從而與
過程中的流程分開.錯誤處理程序代碼可以在程序中的任何地方寫入.
當對象作為文件運行時,對象中未捕獲的錯誤都被返回控制應(yīng)用程序.在開發(fā)環(huán)境
中,如果設(shè)置了正確選項,未捕獲的錯誤只返回控制應(yīng)用程序.請參考主應(yīng)用程序的文檔
的有關(guān)描述,從而得知,在調(diào)試時應(yīng)該設(shè)置哪些選項,如何設(shè)置這些選項以及主機能否建
立類.
如果建立一個訪問其它對象的對象,則應(yīng)該著手處理從那些對象返回的未處理錯誤.
如果無法處理這種錯誤,請將 Err.Number 中的錯誤代碼當作自己的一個錯誤,然后將錯
誤回傳給對象的調(diào)用者.應(yīng)該將錯誤代碼添加到 vbObjectError 常數(shù)上來指定這個錯誤.
舉例來說,如果錯誤代碼為 1052,則使用如下方法指定錯誤:
Err.Number = vbObjectError + 1052
注意 調(diào)用動態(tài)鏈接庫 (DLL) 或 Macintosh 代碼源 期間產(chǎn)生的系統(tǒng)錯誤不會產(chǎn)生
例外情況,也不會被 Visual Basic 的錯誤捕獲操作所捕獲.當調(diào)用 DLL 函數(shù)時,應(yīng)該
(根據(jù) API 的詳細說明)檢查每一個返回值以確定是成功還是失敗,如果失敗,則檢查
Err 對象的 LastDLLError 屬性中的值 在Macintosh 中,LastDLLError總是返回0.
On Error 語句示例
本示例先使用 On Error GoTo 語句在一個過程中指定錯誤處理的代碼所在.本示例
中,試圖刪除一已經(jīng)打開的文件從而生成的錯誤碼為 55.這個錯誤將由示例中的錯誤處
理程序碼來處理,處理完后,控制會回到發(fā)生錯誤的語句處.On Error GoTo 0 語句關(guān)閉
錯誤陷阱.然后 On Error Resume Next 語句用來改變錯誤陷阱,以便發(fā)覺下一個語句產(chǎn)
生的錯誤的范圍.請注意示例中使用 Err.Clear 在錯誤處理完后,清除 Err 對象的屬性.
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler' 打開錯誤處理程序.
Open "TESTFILE" For Output As #1' 打開輸出文件.
Kill "TESTFILE"' 試圖刪除已打開的文件.
On Error Goto 0' 關(guān)閉錯誤陷阱.
On Error Resume Next' 改變錯誤陷阱.
ObjectRef = GetObject("MyWord.Basic")' 試圖啟動不存在
' 的對象
'檢查可能發(fā)生的 Automation 錯誤.
If Err.Number = 440 Or Err.Number = 432 Then
' 告訴用戶出了什么事.然后清除 Err 對象.
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear' 清除 Err 對象字段.
End If
Exit Sub' 退出程序,以避免進入錯誤處理程序.
ErrorHandler:' 錯誤處理程序.
52
Select Case Err.Number' 檢查錯誤代號.
Case 55' 發(fā)生"文件已打開"的錯誤.
Close #1' 關(guān)閉已打開的文件.
Case Else
' 處理其他錯誤狀態(tài) . . .
End Select
Resume' 將控制返回到產(chǎn)生錯誤的語句.
End Sub
17,在工作表上使用 ActiveX 控件
本幫助主題包括了有關(guān)在工作表或圖表上使用 ActiveX 控件的特定信息.有關(guān)添加
和處理控件的一般信息,請參閱在文檔中使用 ActiveX 控件和創(chuàng)建自定義對話框.
在工作表上處理控件時,必須記住以下幾點.
除 ActiveX 控件的標準屬性之外,在 Microsoft Excel 中還可使用
ActiveX 控件的下列屬性:BottomRightCell,LinkedCell,ListFillRange,
Placement,PrintObject,TopLeftCell 和 ZOrder.
這些屬性可用 ActiveX 控件的名稱來返回或設(shè)置.下例滾動工作簿窗口,
使 CommandButton1 位于窗口的左上角.
Set t = Sheet1.CommandButton1.TopLeftCell
With ActiveWindow
.ScrollRow = t.Row
.ScrollColumn = t.Column
End With
當 ActiveX 控件處于激活狀態(tài)時,將禁用某些 Microsoft Excel
Visual Basic 方法和屬性.例如,當某一控件激活時,就不能使用 Sort 方法,
故下述按鈕單擊事件處理過程中的代碼將失敗(因為用戶單擊按鈕后,該按鈕就
處于激活狀態(tài)).
Private Sub CommandButton1.Click
Range("a1:a10").Sort Key1:=Range("a1")
End Sub
可通過先激活工作表上的其他元素的方法來繞過這種問題.例如,下列代碼可對單
元格區(qū)域排序:
Private Sub CommandButton1.Click
Range("a1").Activate
Range("a1:a10").Sort Key1:=Range("a1")
CommandButton1.Activate
End Sub
當用戶通過雙擊鼠標來編輯內(nèi)嵌在其他應(yīng)用程序的文檔中的
Microsoft Excel 工作簿時,該工作簿上的控件將不會正常工作.如果用戶是通
過用右鍵單擊工作簿,然后選中快捷菜單上的"打開"命令來編輯工作簿的話,
工作簿上的控件就能正常工作了.
用 Microsoft Excel 5.0/95 工作簿文件格式保存 Microsoft Excel 工
53
作簿時,將丟失 ActiveX 控件信息.
在工作表上 ActiveX 控件的事件處理過程中,Me 關(guān)鍵字所指向的是工
作表,而非控件.
1) 用 Visual Basic 添加控件
在 Microsoft Excel 中,用 OLEObjects 集合中的 OLEObject 對象代表 ActiveX
控件(所有的 OLEObject 對象也包含在 Shapes 集合中).如果要用編程的方式向工作
表添加 ActiveX 控件,可用 OLEObjects 集合的 Add 方法.下例向第一張工作表添加命
令按鈕.
Worksheets(1).OLEObjects.Add "Forms.CommandButton.1", _
Left:=10, Top:=10, Height:=20, Width:=100
2) 通過 Visual Basic 使用控件屬性
絕大多數(shù)情況下,可在 Visual Basic 代碼中用名稱引用 ActiveX 控件.下例修改
了控件"CommandButton1"的標題.
Sheet1.CommandButton1.Caption = "Run"
請注意,當在控件所在的工作表的類模塊之外使用控件的名稱時,必須用工作表的
名稱限定該控件的名稱.
如果要修改在 Visual Basic 代碼中所用的控件的名稱,可先選定該控件,然后在
"屬性"窗口中設(shè)置控件的"(名稱)"屬性.
因為 ActiveX 控件也可用 OLEObjects 集合中的 OLEObject 對象代表,所以也可
用該集合中的對象來設(shè)置控件的屬性.下例設(shè)置了控件"CommandButton1"的左邊位置.
Worksheets(1).OLEObjects("CommandButton1").Left = 10
那些不屬于 OLEObject 對象的屬性的控件屬性,可通過由 Object 屬性返回的實際
控件對象來設(shè)置.下例設(shè)置了控件"CommandButton1"的標題.
Worksheets(1).OLEObjects("CommandButton1"). _
Object.Caption = "run me"
因為所有的 OLE 對象也是 Shapes 集合的成員,所以也可用該集合設(shè)置若干控件的
屬性.下例對齊第一張工作表上的所有控件的左邊框.
For Each s In Worksheets(1).Shapes
If s.Type = msoOLEControlObject Then s.Left = 10
Next
3) 使用 Shapes 和 OLEObjects 集合的控件名稱
工作表上的 ActiveX 控件具有兩個名稱:其一是包含該控件的形狀的名稱,當查看
工作表時,可在"Name"框中看到此名稱;其二是控件的代碼名稱,在"屬性"窗口的
"(名稱)"框右邊的單元格中可看到此名稱.第一次向工作表中添加控件時,形狀名稱
和代碼名稱是相同的.但是,如果更改其中之一(形狀名稱或代碼名稱),另一個名稱并
不會自動隨之更改.
對于控件的事件過程,其名稱中所使用的是控件的代碼名稱.但是,當從工作表的
Shapes 或 OLEObjects 集合中返回控件時,必須使用形狀名稱(而不是代碼名稱),以
便按名稱引用控件.例如,假設(shè)向工作表中添加了一個復(fù)選框,其默認形狀名稱和默認代
碼名稱都是"CheckBox1".如果此后在"屬性"窗口的"(名稱)"旁鍵入了
"chkFinished",從而將控件的代碼名稱更改為"chkFinished",則在事件過程名稱中
54
必須使用 chkFinished,而仍然應(yīng)使用 CheckBox1 從 Shapes 或 OLEObject 集合中返回
控件,如下例所示.
Private Sub chkFinished_Click()
ActiveSheet.OLEObjects("CheckBox1").Object.Value = 1
End Sub
18,Add 方法(Scenarios 集合)
新建方案并將其添加到當前工作表可用的方案列表中.返回 Scenario 對象.
語法
expression.Add(Name, ChangingCells, Values, Comment, Locked, Hidden)
expression必選.該表達式返回 Scenarios 對象.
NameString 類型,必選.方案名.
ChangingCellsVariant 類型,必選.指向方案的可變單元格的 Range 對象.
ValuesVariant 類型,可選.包含 ChangingCells 中指定的單元格的方案值的數(shù)組.
如果省略本參數(shù),就假定方案值是 ChangingCells 單元格中的當前值.
CommentVariant 類型,可選.指定方案的注釋文字的字符串.添加新方案時,作者
的名字和日期自動添加在注釋文字的開始部分.
LockedVariant 類型,可選.若指定為 True,則鎖定方案以防修改.默認值為 True.
HiddenVariant 類型,可選.若指定為 True,則隱藏方案.默認值為 False.
說明
方案名稱必須是唯一的;如果試圖用已經(jīng)在使用的名稱創(chuàng)建方案,Microsoft Excel
會產(chǎn)生錯誤.
Add 方法(Scenarios 集合)示例
本示例向工作表 Sheet1 添加新方案.
Worksheets("Sheet1").Scenarios.Add Name:="Best Case", _
ChangingCells:=Worksheets("Sheet1").Range("A1:A4"), _
Values:=Array(23, 5, 6, 21), _
Comment:="Most favorable outcome."
19,Scenarios 集合對象
Worksheets(Worksheet)
Scenarios(Scenario)
指定工作表中所有 Scenario 對象的集合.方案是一組被命名和保存的輸入值(稱
為可變單元格).
Scenarios 集合對象用法
可用 Scenarios 方法返回 Scenarios 集合.下例為工作表"Options"中的方案創(chuàng)
建摘要,并用單元格區(qū)域"J10:J20"作為結(jié)果單元格.
Worksheets("options").Scenarios.CreateSummary _
resultCells:=Worksheets("options").Range("j10,j20")
可用 Add 方法創(chuàng)建新方案并將其添加到集合中.下例向工作表"Options"添加新
方案"Typical".該方案有兩個可變單元格"A2"和"A12",值分別為 55 和 60.
Worksheets("options").Scenarios.Add name:="Typical", _
changingCells:=Worksheets("options").Range("A2,A12"), _
55
values:=Array("55", "60")
可用 Scenarios(index)(其中 index 為方案名稱或編號)返回單個 Scenario 對
象.下例顯示工作表"Options"中的方案"Typical".
Worksheets("options").Scenarios("typical").Show
20,Add 方法 (Validation 對象)
在指定區(qū)域內(nèi)添加數(shù)據(jù)有效性檢驗.
語法
expression.Add(Type, AlertStyle, Operator, Formula1, Formula2)
expression 必選.該表達式返回 Validation 對象.
Type Long 類型,必選.有效性檢驗類型.可為下列 XlDVType 常量之一:
xlValidateCustom,xlValidateDate,xlValidateDecimal,xlValidateInputOnly,
xlValidateList,xlValidateTextLength,xlValidateTime 或 xlValidateWholeNumber.
AlertStyle Variant 類型,可選.有效性檢驗警告樣式.可為下列 XlDVAlertStyle
常量之一:xlValidAlertInformation,xlValidAlertStop 或 xlValidAlertWarning.
OperatorVariant 類型,可選.有效數(shù)據(jù)操作符.可為下列
XlFormatConditionOperator 常量之一:xlBetween,xlEqual,xlGreater,
xlGreaterEqual,xlLess,xlLessEqual,xlNotBetween 或者 xlNotEqual.
Formula1 Variant 類型,可選.有效數(shù)據(jù)方程式的第一部分.
Formula2 Variant 類型,可選.當 Operator 參數(shù)是 xlBetween 或 xlNotBetween
時,有效數(shù)據(jù)方程式的第二部分(否則本參數(shù)將忽略).
說明
Add 方法所要求的參數(shù)依有效性檢驗的類型而定,如下表所示.
有效性檢驗類型 參數(shù)
xlValidateCustom Formula1 必選,忽略 Formula2.Formula1 必須為一表達
式,數(shù)據(jù)項有效時該表達式取值為 True,而數(shù)據(jù)項無效時取值為
False.
xlInputOnly 能使用 AlertStyle,Formula1 或 Formula2 參數(shù).
xlValidateList Formula1 必選,忽略 Formula2.Formula1 必須為一以逗
號分隔的取值列表,或指向此列表的工作表.
xlValidateWholeNumber
,xlValidateDate,
xlValidateDecimal,
xlValidateTextLength 或
xlValidateTime
必須指定 Formula1 或 Formula2 之一,或兩者均指定.
Add 方法(Validation 對象)示例
本示例向單元格"E5"添加數(shù)據(jù)有效性檢驗.
With Range("e5").Validation
.Add Type:=xlValidateWholeNumber, _
AlertStyle:= xlValidAlertStop, _
Operator:=xlBetween, Formula1:="5", Formula2:="10"
56
.InputTitle = "Integers"
.ErrorTitle = "Integers"
.InputMessage = "Enter an integer from five to ten"
.ErrorMessage = "You must enter a number from five to ten"
End With
21,Validation 對象
Renge
Validation
代表工作表區(qū)域的數(shù)據(jù)有效性規(guī)則.
使用 Validation 對象
使用 Validation 屬性可返回 Validation 對象.下例改變單元格 E5 的數(shù)據(jù)有效
性規(guī)則.
Range("e5").Validation _
.Modify xlValidateList, xlValidAlertStop, "=$A$1
A$10"
使用 Add 方法可向區(qū)域中添加數(shù)據(jù)有效性規(guī)則并創(chuàng)建一個新的 Validation 對象.
下例給單元格 E5 添加數(shù)據(jù)有效性規(guī)則.
With Range("e5").Validation
.Add Type:=xlValidateWholeNumber, _
AlertStyle:=xlValidAlertInformation, _
Minimum:="5", Maximum:="10"
.InputTitle = "Integers"
.ErrorTitle = "Integers"
.InputMessage = "Enter an integer from five to ten"
.ErrorMessage = "You must enter a number from five to ten"
End With
22,Validation 屬性
返回 Validation 對象,該對象代表指定區(qū)域內(nèi)的數(shù)據(jù)有效性檢驗.只讀.
Validation 屬性示例
本示例設(shè)置單元格"E5"允許空值.
Range("e5").Validation.IgnoreBlank = True
23,Open 事件
打開工作簿時,將產(chǎn)生本事件.
語法
Private Sub Workbook_Open()
Open 事件示例
本示例使每次打開工作簿時,都最大化 Microsoft Excel 窗口.
Private Sub Workbook_Open()
Application.WindowState = xlMaximized
End Sub
24,Open 方法
57
打開一個工作簿.
語法
expression.Open(FileName, UpdateLinks, ReadOnly, Format, Password,
WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable,
Notify, Converter, AddToMRU)
expression必選.該表達式返回一個 Workbooks 對象或 RecentFile 對象.
FileNameString 類型,必選.要打開的工作簿文件名.
UpdateLinksVariant 類型,可選.指定文件中的鏈接的更新方式.如果省略本參數(shù),
則提示用戶選擇鏈接的更新方式.否則,該參數(shù)的取值應(yīng)為下表的某個值.
取值 意義
0 不更新任何引用.
1 更新外部引用,但不更新遠程引用.
2 更新外部引用,但不更新外部引用.
3 更新所有遠程引用和外部引用.
如果 Microsoft Excel 正在打開以 WKS,WK1 或 WK3 格式存儲的文件并且
UpdateLinks 參數(shù)設(shè)為 2,則 Microsoft Excel 根據(jù)與該文件關(guān)聯(lián)的圖形創(chuàng)建圖表.如
果該參數(shù)設(shè)為 0,則不創(chuàng)建任何圖表.
ReadOnlyVariant 類型,可選.如果為 True 則以只讀模式打開工作簿.
FormatVariant 類型,可選.如果 Microsoft Excel 正在打開一個文本文件,則該
參數(shù)用于指定分隔字符,如下表所示.如果省略本參數(shù),則使用當前的分隔字符.
取值 分隔字符
1 制表符
2 逗號
3 空格
4 分號
5 沒有分隔符
6 自定義字符(參閱 Delimiter 參數(shù))
PasswordVariant 類型,可選.該字符串為用于打開一個受保護工作簿的密碼.如
果省略該參數(shù)并且指定工作簿已設(shè)置密碼,則提示用戶輸入密碼.
WriteResPasswordVariant 類型,可選.該字符串為一個寫保護工作簿的寫入權(quán)密
碼.如果省略該參數(shù)并且指定工作簿已設(shè)置密碼,則提示用戶輸入密碼.
IgnoreReadOnlyRecommendedVariant 類型,可選.如果為 True 則設(shè)置 Microsoft
Excel 不顯示建議只讀消息(如果該工作簿以"建議只讀"選項保存).
OriginVariant 類型,可選.如果該文件為文本文件,則該參數(shù)用于指示該文件的
來源于何種操作系統(tǒng)(以便對代碼頁和回車/換行(CR/LF)進行正確映射).可為下列
XlPlatform 常量之一: xlMacintosh,xlWindows 或 xlMSDOS.如果省略本參數(shù),則使
用當前操作系統(tǒng).
58
DelimiterVariant 類型,可選.如果該文件為文本文件并且 Format 參數(shù)設(shè)為 6,
則此參數(shù)用于指定用作分隔符的字符.例如,可使用 Chr(9) 代表制表符,使用","代
表逗號,使用";"代表分號或者使用自定義字符.如果該參數(shù)為字符串,則只使用該字
符串的第一個字符.
EditableVariant 類型,可選.如果該文件為 Microsoft Excel 4.0 加載宏,則該
參數(shù)為 True 時可在可見窗口中打開該加載宏.如果該參數(shù)設(shè)為 False 或者省略該參數(shù),
則該加載宏以隱藏方式打開,并且不能設(shè)為可見.本選項不能應(yīng)用于由 Microsoft Excel
5.0 或更高版本的 Microsoft Excel 創(chuàng)建的加載宏.如果該文件是 Excel 模板,則參數(shù)
為 True 時,會打開指定模板進行編輯.參數(shù)為 False 時,可根據(jù)指定模板打開新的工
作簿.默認值為 False.
NotifyVariant 類型,可選.如果該文件不能以可讀寫模式打開,則若該參數(shù)設(shè)為
True 可將該文件添加到文件通知列表.Microsoft Excel 將以只讀模式打開該文件并輪
詢文件通知列表,當文件通知列表中的該文件可用時則通知用戶.如果該參數(shù)設(shè)為 False,
或者省略該參數(shù),則不請求任何通知,并且不能打開任何不可用的文件.
ConverterVariant 類型,可選.打開文件時試用的第一個文件轉(zhuǎn)換器的索引號.首
先使用的是指定的文件轉(zhuǎn)換器;如果該轉(zhuǎn)換器不能識別此文件,則試用所有的轉(zhuǎn)換器.轉(zhuǎn)
換器索引號由 FileConverters 方法所返回的轉(zhuǎn)換器行號組成.
AddToMruVariant 類型,可選.如果為 True 則將該工作簿添加到最近使用文件列
表中.默認值為 False.
說明
如果正在打開的工作簿包含 Auto_Open 宏,則若在 Visual Basic 中打開該工作簿
這些宏將不執(zhí)行.如果要執(zhí)行 Auto_Open 宏,必須使用 RunAutoMacros 方法.
Open 方法示例
本示例打開 Analysis.xls 工作簿,然后執(zhí)行 Auto_Open 宏.
Workbooks.Open "ANALYSIS.XLS"
ActiveWorkbook.RunAutoMacros xlAutoOpen
25, Click 事件
在下面兩種情況下,發(fā)生該事件:
用鼠標單擊控件.
用戶最終在幾種可能的值中為控件選擇一個值.
語法
對于多頁和 TabStrip
Private Sub object_Click( index As Long)
對于所有的其他控件
Private Sub object_Click( )
Click 事件的語法包含以下成分:
成分 描述
object 必需.一個有效的對象.
index 必需.與該事件相關(guān)聯(lián)的多頁或 TabStrip 中的頁或標簽的索引.
說明
59
在導(dǎo)致 Click 事件發(fā)生的兩種情況中,第一種情況應(yīng)用于命令按鈕,框架,圖像,
標簽,滾動條和數(shù)值調(diào)節(jié)鈕控件,而第二種情況用于復(fù)選框,組合框,列表框,多頁,
TabStrip 和切換按鈕控件.當選項按鈕控件的值變?yōu)?True 時,也會導(dǎo)致 Click 事件發(fā)
生.
以下是初始化 Click 事件的操作的幾個示例:
單擊窗體的空白區(qū)或窗體上的無效控件(除了列表框).
單擊命令按鈕控件.如果命令按鈕尚不具有焦點,則 Enter 事件發(fā)生
在 Click 事件之前.
當命令按鈕控件具有焦點時按 Spacebar 鍵.
單擊一控件.
在窗體上按 Enter 鍵,該窗體上的一個命令按鈕的 Default 屬性設(shè)為
True,同時焦點沒有位于其他的命令按鈕上.
在一個窗體上按 Esc 鍵,該窗體上有一個命令按鈕的 Cancel 屬性設(shè)
為 True,同時焦點沒有位于其他的命令按鈕上.
按一個控件的加速鍵.
當單擊控件而引發(fā) Click 事件時,所發(fā)生的一系列事件有:
1. MouseDown
2. MouseUp
3. Click
對于某些控件,當 Value 屬性改變時發(fā)生 Click 事件.但是,最好使用 Change 事
件來檢測一個屬性的新值.下面是由于給控件賦新值而初始化 Click 的操作的示例:
單擊多頁或 TabStrip 中的一個不同頁面或標簽.這些控件的 Value
屬性反映了當前的頁或標簽.單擊當前頁或標簽不改變控件的值,因而也就不初
始化 Click 事件.
單擊復(fù)選框或切換按鈕控件,當這些控件之一具有焦點時按 Spacebar
鍵,按這些控件中的一個的加速鍵,或者用代碼改變該控件的值.
將選項按鈕值改為 True.將某組中的一個選項按鈕值設(shè)為 True,則該
群組內(nèi)的其余按鈕的值會自動設(shè)置為 False.只針對值變?yōu)?True 的那個按鈕發(fā)
生 Click 事件.
選擇一個組合框控件或者列表框控件的值,使其完全與該控件下拉列表
中的某項匹配.例如,若列表未經(jīng)排序,則在編輯區(qū)所鍵入字符的第一個匹配對
象可能不是列表中唯一的匹配,所以選擇這樣的值并不初始化 Click 事件.在一
個經(jīng)排序的列表中,可用完全匹配方式來確保所選擇的值是用戶鍵入的文本的唯
一匹配值.
若 Value 設(shè)置為 Null,則不會初始化 Click 事件.
注意單擊可改變控件的值,因而它能初始化 Click 事件.但用右鍵單擊不會改變控
件的值,所以它不會初始化 Click 事件.
Click 事件,命令按鈕控件,Accelerator 和 Caption 屬性示例
每當用戶用鼠標或加速鍵來單擊按鈕時,該示例都將改變一次命令按鈕的
Accelerator 和 Caption 屬性.Click 事件包含改變 Accelerator 和 Caption 屬性的
代碼.
60
若要使用該示例,請將代碼粘貼到包含名為 CommandButton1 的命令按鈕的窗體的
聲明變量部分.
Private Sub UserForm_Initialize()
CommandButton1.Accelerator= "C"
'將加速鍵設(shè)置為 COMMAND + C
End Sub
Private Sub CommandButton1_Click ()
If CommandButton1.Caption = "OK" Then
'檢查題注,然后更改它.
CommandButton1.Caption = "Clicked"
CommandButton1.Accelerator= "C"
'將加速鍵設(shè)置為 COMMAND + C
Else
CommandButton1.Caption = "OK"
CommandButton1.Accelerator= "O"
'將加速鍵設(shè)置為 COMMAND + O
End If
End Sub
26,Close 方法
關(guān)閉指定對象.對于 Workbooks 集合使用語法 1;對于 Window 對象和 Workbook
對象則使用語法 2.
語法 1
expression.Close
語法 2
expression.Close(SaveChanges, FileName, RouteWorkbook)
expression 必選,該表達式返回"應(yīng)用于"列表中的某個對象.
SaveChangesVariant 類型,可選.如果工作簿沒有改變則忽略此參數(shù);如果工作簿
發(fā)生了改變并且在另外的窗口中也打開了該工作簿,則仍然忽略此參數(shù);如果工作簿發(fā)生
了改變并且沒有在另外的窗口中打開,則此參數(shù)將指定是否在工作簿中保存所發(fā)生的更
改.取值與操作如下表所示:
取值 操作
True 將改變保存到工作簿.如果該工作簿尚未命名,則使用 FileName
所指定的名稱.如果省略 FileName 參數(shù),則要求用戶輸入文件名.
False 不將改變保存到此文件.
省略 顯示一個對話框,要求用戶決定是否保存所作的更改.
FileName Variant 類型,可選.以此文件名保存所作的更改.
RouteWorkbook Variant 類型,可選.如果指定工作簿不需要傳送給下一個收件人
(沒有傳送名單或已經(jīng)傳送),則忽略該參數(shù).否則, Microsoft Excel 將按照下表所
示處理傳送.
取值 意義
61
True 將工作簿傳送給下一個收信人.
False 將工作簿傳送給下一個收信人.
省略 顯示一個對話框,要求用戶決定是否傳送此工作簿.
說明
從 Visual Basic 關(guān)閉工作簿并不運行該工作簿中的任何自動關(guān)閉宏.而使用
RunAutoMacros 方法可運行自動關(guān)閉宏.
Close 方法示例
本示例關(guān)閉 Book1.xls,并放棄所有對此工作簿的更改.
Workbooks("BOOK1.XLS").Close SaveChanges:=False
本示例關(guān)閉所有打開的工作簿.如果某個打開的工作簿有改變,Microsoft Excel 將
顯示詢問是否保存更改的對話框和相應(yīng)提示.
Workbooks.Close
27,Change 事件
當 Value 屬性改變時該事件發(fā)生.
語法
Private Sub object_Change( )
Change 事件的語法包含以下成分:
成分 描述
object 必需.一個有效的對象.
設(shè)置
當 Value 屬性的設(shè)置改變時 Change 事件發(fā)生,無論屬性改變是執(zhí)行代碼還是用戶
在界面上操作的結(jié)果,此事件都發(fā)生.
以下是改變 Value 屬性的操作的幾個例子:
單擊復(fù)選框,選項按鈕或切換按鈕.
輸入或選擇組合框,列表框或文本框的新文本值.
在 TabStrip 上選擇一個不同的標簽.
移動滾動條中的滾動塊.
單擊數(shù)值調(diào)節(jié)鈕的向上箭頭或向下箭頭.
在多頁中選擇不同的頁.
說明
Change 事件過程可以使顯示在諸多控件上的數(shù)據(jù)同步或一致.例如,可用滾動條的
Change 事件過程的來更新顯示滾動條對應(yīng)值的文本框的內(nèi)容.也可用 Change 事件過程
來實現(xiàn)在一個工作區(qū)內(nèi)顯示數(shù)據(jù)和公式,而在另一個工作區(qū)內(nèi)顯示其結(jié)果.
注意 在有些情況下,當 Value 屬性改變時,Click 事件也可能發(fā)生.然而對于檢
測一個屬性的新值而言,使用 Change 事件是首選的技術(shù).
MatchFound 和 MatchRequired 屬性以及 Change 事件,復(fù)選框控件示例
下例用 MatchFound 和 MatchRequired 屬性來演示組合框的附加的字符匹配.匹配
校驗發(fā)生于 Change 事件中.
62
在這個例子中,用戶指定組合框的文本部分是否必須與組合框中的列表項之一匹配.
用戶可以利用復(fù)選框來指定是否要求匹配,然后在組合框中鍵入條件,指定列表中的一項.
若要使用該示例,請將示例代碼復(fù)制到某窗體的聲明變量部分.請確保該窗體包含:
名為 ComboBox1 的組合框.
名為 CheckBox1 的復(fù)選框.
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
ComboBox1.MatchRequired = True
MsgBox "To move the focus from the " _
& "ComboBox, you must match an entry in " _
& "the list or press ESC."
Else
ComboBox1.MatchRequired = False
MsgBox " To move the focus from the " _
& "ComboBox, just tab to or click " _
& "another control. Matching is optional."
End If
End Sub
Private Sub ComboBox1_Change()
If ComboBox1.MatchRequired = True Then
'MSForms 自動處理這種情況
Else
If ComboBox1.MatchFound = True Then
MsgBox "Match Found; matching optional."
Else
MsgBox "Match not Found; matching " _
& "optional."
End If
End If
End Sub
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 9
ComboBox1.AddItem "Choice " & i
Next i
ComboBox1.AddItem "Chocoholic"
CheckBox1.Caption = "MatchRequired"
CheckBox1.Value = True
End Sub
28,Value 屬性
63
Value 屬性的意義取決于其應(yīng)用的對象,如下表所示.
對象 取值
應(yīng)用程序 總是返回"Microsoft Excel".只讀.
邊界 Borders.LineStyle 的同義詞.
名稱 一個包含公式的字符串,該名稱為此公式的引用.在宏語言
中使用 A1 樣式引用的字符串,并以等號開頭.只讀.
參數(shù) 參數(shù)值.詳細信息,請參閱 Parameter 對象.
PivotField 數(shù)據(jù)透視表報表中指定字段的名稱.
PivotItem 數(shù)據(jù)透視表字段中指定數(shù)據(jù)項的名稱.
PivotTable 數(shù)據(jù)透視表報表的名稱.
Range 指定單元格的值.如果單元格為空,則 Value 返回 Empty
值(使用 IsEmpty 函數(shù)可測試這種情況).如果 Range 對象包含
不止一個單元格,就會返回一個值的數(shù)組(使用 IsArray 函數(shù)可
測試這種情況).
Style 指定樣式的名稱
Validation 如果符合所有的有效性規(guī)則則為 True(也就是說,該區(qū)域
包含合法數(shù)據(jù)).
下表顯示了 Value 屬性及其相關(guān)屬性的示例值,假設(shè)存在唯一名稱為
"[Europe].[France].[Paris]"的 OLAP 數(shù)據(jù)源,以及具有數(shù)據(jù)項"
aris"的非 OLAP
數(shù)據(jù)源.
屬性 值(OLAP 數(shù)據(jù)源) 值(非 OLAP 數(shù)據(jù)
源)
Caption Paris Paris
Name [Europe].[France].[Paris] ( 只
讀)
Paris
SourceName [Europe].[France].[Paris] ( 只
讀)
(與 SQL 屬性值
相同,只讀)
Value [Europe].[France].[Paris] ( 只
讀)
Paris
當在 PivotItems 集合中指定一個索引時,可使用下表所示的語法.
語法(OLAP 數(shù)據(jù)源) 語法(非 OLAP 數(shù)據(jù)源)
expression.PivotItems("[Europe].[France]
.[Paris]")
expression.PivotItems("
aris")
在使用 Item 屬性引用集合中的特定成員時,可使用下面的文本索引名稱.
名稱(OLAP 數(shù)據(jù)源) 名稱(非 OLAP 數(shù)據(jù)源)
[Europe].[France].[Paris] Paris
64
Value 屬性示例
本示例將"Sheet1"中 A1 單元格的值設(shè)為 3.14159.
Worksheets("Sheet1").Range("A1").Value = 3.14159
本示例對"Sheet1"中 A1
10 單元格進行循環(huán).如果這些單元格中的某個值小于
0.001,則將其值替換為 0(零).
For Each c in Worksheets("Sheet1").Range("A1
10")
If c.Value < .001 Then
c.Value = 0
End If
Next c
29,DblClick 事件
當用戶指向一個對象并雙擊鼠標時,發(fā)生 DblClick 事件.
語法
對于多頁和 TabStrip
Private Sub object_DblClick( index As Long, ByVal Cancel As
MSForms.ReturnBoolean)
對于其他事件
Private Sub object_DblClick( ByVal Cancel As MSForms.ReturnBoolean)
DblClick 事件的語法有以下幾個成分:
成分 描述
object 必需.一個有效的對象.
index 必需.在 Pages 或 Tabs 集合里的 Page 或 Tab 對象的位置.
Cancel 必需.事件狀態(tài).False 表示由控件處理該事件(這是默認方式).
True 表示由應(yīng)用程序處理該事件.
說明
要使該事件發(fā)生,這兩次擊鍵必須發(fā)生在由系統(tǒng)的雙擊速度的設(shè)置所限定的時間范
圍之內(nèi).
對于支持 Click 的控件,DblClick 事件前發(fā)生的一系列事件有:
1. MouseDown
2. MouseUp
3. Click
4. DblClick
如果一個控件(例如文本框)不支持 Click 事件,則忽略上述事件序列中的 Click
事件.
如果雙擊時 Cancel 的返回值為 True,則控件將忽略第二次單擊.如果第二次單擊
與第一次單擊的作用相反,這是非常有用的,比如雙擊一個切換按鈕.Cancel 參數(shù)允許
窗體忽略第二次單擊,因此無論是單擊還是雙擊按鈕都有同樣的作用.
DblClick 事件,CanPaste 屬性,Paset 和 Copy 方法示例
下例使用 CanPaste 屬性和 Past 方法,將組合框從剪貼板粘貼到多頁控件的一頁
中.該示例還使用 SetFocus 和 Copy 方法把控件從窗體復(fù)制到剪貼板.
65
用戶單擊 CommandButton1 可把組合框復(fù)制到剪貼板.用戶雙擊(使用 DblClick 事
件)CommandButton1 可把組合框粘貼到多頁控件上.
若要使用該示例,請將示例代碼復(fù)制到某窗體的聲明變量部分.確保該窗體包含:
名為 TextBox1 的文本框.
名為 ComboBox1 的組合框.
名為 MultiPage1 的多頁控件.
名為 CommandButton1 的命令按鈕.
注意 該示例還包括一個子程序,用以說明把文本粘貼到控件.
Private Sub UserForm_Initialize()
ComboBox1.AddItem "It's a beautiful day!"
CommandButton1.Caption = "Copy ComboBox to " _
& "Clipboard"
CommandButton1.AutoSize = True
End Sub
Private Sub MultiPage1_DblClick(ByVal Index As Long, _
ByVal Cancel As MSForms.ReturnBoolean)
If MultiPage1.Pages(MultiPage1.Value).CanPaste = _
True
Then
MultiPage1.Pages(MultiPage1.Value).Paste
Else
TextBox1.Text = "Can't Paste"
End If
End Sub
Private Sub CommandButton1_Click()
UserForm1.ComboBox1.SetFocus
UserForm1.Copy
End Sub
'將文本粘貼到控件的代碼
'
rivate Sub ComboBox1_DblClick(ByVal Cancel As _
MSForms.ReturnBoolean)
' If ComboBox1.CanPaste = True Then
'ComboBox1.Paste
'Else
'TextBox1.Text = "Can't Paste"
'End If
'End Sub
30,SheetBeforeRightClick 事件
當右擊任一工作表時產(chǎn)生此事件,此事件先于默認的右擊操作.
語法
66
Private Sub object_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target
As Range, ByVal Cancel As Boolean)
object Application 對象或 Workbook 對象.有關(guān)對 Application 對象使用事件
的詳細內(nèi)容,請參閱 Application 對象事件的用法.
Sh 代表該工作表的 Worksheet 對象.
Target 當右擊事件發(fā)生時最靠近鼠標指針的單元格.
Cancel 當事件產(chǎn)生時為 False.如果該事件過程將本參數(shù)設(shè)為 True,則該過程執(zhí)
行結(jié)束之后將不執(zhí)行默認的右擊操作.
說明
右擊圖表不產(chǎn)生本事件.
SheetBeforeRightClick 事件示例
本示例對 SheetBeforeRightClick 事件響應(yīng)進行設(shè)置,關(guān)閉默認的右擊操作.其他
示例可參閱 BeforeRightClick 事件示例.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Range, ByVal Cancel As Boolean)
Cancel = True
End Sub
31,Select 方法
選定對象.
語法
expression.Select(Replace)
expression 必選.該表達式返回一個"應(yīng)用于"列表中的某個對象.
Replace Variant 類型,可選(僅用于工作表).如果為 True 則用指定對象替代
當前選定區(qū)域.如果為 False 則對當前選定區(qū)域進行延伸,以包括任何以前選定的對象
和指定對象.
說明
要選定一個單元格或一個單元格區(qū)域,可使用 Select 方法.要將單個單元格激活
為活動單元格,可使用 Activate 方法.
Select 方法示例
本示例選定"Sheet1"中的 A1:B3 單元格.
Worksheets("Sheet1").Activate
Range("A1:B3").Select
32,Select 事件
選定圖表元素時,將產(chǎn)生本事件.
語法
Private Sub object_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal
Arg2 As Long)
object Chart 對象,或在類模塊中與事件一起定義的 Chart 類型的對象.有關(guān)的
詳細內(nèi)容,請參閱嵌入式圖表事件的用法.
ElementID,Arg1,Arg2 所選定的圖表元素.有關(guān)這些參數(shù)的詳細內(nèi)容,請參閱
BeforeDoubleClick 事件.
67
Select 事件示例
如果用戶選定了圖表標題,本示例將顯示消息框.
Private Sub Chart_Select(ByVal ElementID As Long, _
ByVal Arg1 As Long, ByVal Arg2 As Long)
If ElementId = xlChartTitle Then
MsgBox "please don't change the chart title"
End If
End Sub
33,Goto 方法
選定任意工作簿中的任意區(qū)域或任意 Visual Basic 過程,并且如果該工作簿未處
于活動狀態(tài),就激活該工作簿.
語法
expression.Goto(Reference, Scroll)
expression必選.該表達式返回 Application 對象.
ReferenceVariant 類型,可選.指定目標.可為 Range 對象,包含 R1C1-樣式記
號的單元格引用的字符串或包含 Visual Basic 過程名的字符串.如果省略本參數(shù),目標
將是最近一次用 Goto 方法選定的區(qū)域.
ScrollVariant 類型,可選.若指定為 True,則滾動窗口直至目標區(qū)域的左上角單
元格出現(xiàn)在窗口的左上角.若指定為 False,則不滾動窗口.默認值為 False.
說明
該方法在下列方面不同于 Select 方法:
如果指定的區(qū)域不在位于最前面屏幕的工作表中,Microsoft Excel 將
在選定該區(qū)域之前切換至該工作表.(如果對不在屏幕的最前面的工作表中的區(qū)域
使用 Select 方法,則選定該區(qū)域時并不激活該工作表).
該方法具有讓用戶滾動目的窗口的 Scroll 屬性.
當使用 Goto 方法時,前一次選定區(qū)域(Goto 方法運行前)被增加到
以前選定區(qū)域的數(shù)組中(詳細內(nèi)容,請參閱 PreviousSelections 屬性).可使用
該功能快速跳過多至四個選定區(qū)域.
Select 方法具有 Replace 參數(shù);Goto 方法沒有.
Goto 方法示例
本示例選定工作表"Sheet1"中的單元格"A154",并滾動工作表以顯示該單元格.
Application.Goto Reference:=Worksheets("Sheet1").Range("A154"), _
scroll:=True
34,Worksheet 對象
Workbooks(workbook)
Worksheets(worksheet)
多個對象
代表一個工作表.Worksheet 對象是 Worksheets 集合的成員. Worksheets 集合
包含工作簿中所有的 Worksheet 對象.
使用 Worksheet 對象
68
本部分將說明下列返回 Worksheet 對象的屬性和方法:
Worksheets 屬性
ActiveSheet 屬性
Worksheets 屬性
可用 Worksheets(index) (其中 index 為工作表索引號或名稱)返回單個
Worksheet 對象.下例隱藏活動工作簿中的第一張工作表.
Worksheets(1).Visible = False
工作表索引號表明該工作表在工作簿的選項卡欄中的位置.Worksheets(1) 為工作
簿中第一個(最左邊的)工作表,而 Worksheets(Worksheets.Count) 為最后一個.所有
工作表均包括在索引號序列中,即便是隱藏工作表也是如此.
工作表的名稱顯示在工作表的選項卡上.使用 Name 屬性可設(shè)置或返回工作表的名
稱.下例保護"Sheet1"上的"scenarios".
Worksheets("sheet1").Protect password:="drowssap", scenarios:=True
Worksheet 對象也是 Sheets 集合的成員.Sheets 集合包含工作簿中所有的表(包
括圖表和工作表).
ActiveSheet 屬性
當工作表處于活動狀態(tài)時,可用 ActiveSheet 屬性引用之.下例使用 Activate 方
法激活工作表"Sheet1",將頁打印方向設(shè)置為橫向,然后打印該工作表.
Worksheets("sheet1").Activate
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PrintOut
35,SheetChange 事件
當用戶更改工作表中的單元格或者外部鏈接引起單元格的更改時產(chǎn)生此事件.
語法
Private Sub object_SheetChange(ByVal Sh As Object, ByVal Source As Range)
object Application 對象或 Workbook 對象.有關(guān)對 Application 對象使用事件
的詳細內(nèi)容,請參閱 Application 對象事件的用法.
Sh 代表工作表的 Worksheet 對象.
Source 發(fā)生更改的區(qū)域.
說明
圖表發(fā)生的更改不觸發(fā)本事件.
SheetChange 事件示例
本示例當任一工作表發(fā)生更改時運行本示例.
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Source As Range)
' runs when a sheet is changed
End Sub
36,SheetActivate 事件
當激活任何一張表時產(chǎn)生此事件.
語法
69
Private Sub object_SheetActivate(ByVal Sh As Object)
object Application 或 Workbook.
Sh 激活的表.可為一個 Chart 對象或 Worksheet 對象.
SheetActivate 事件示例
本示例顯示每一激活表的名稱.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
End Sub
37,OpenLinks 方法
打開鏈接的支持文檔.
語法
expression.OpenLinks(Name, ReadOnly, Type)
expression 必選.該表達式返回 Workbook 對象.
Name String 類型,必選.Microsoft Excel 鏈接或 DDE/OLE 鏈接的名稱,就像
LinkSources 方法返回的一樣.
ReadOnly Variant 類型,可選.如果指定 True,就以只讀方式打開文檔.默認值
為 False.
Type 可選.鏈接類型.可為下列 XlLink 常量:xlExcelLinks,xlOLELinks(也處
理 DDE 鏈接),xlPublishers 或 xlSubscribers.
OpenLinks 方法示例
本示例打開活動工作簿中的第一個 OLE 鏈接.
linkArray = ActiveWorkbook.LinkSources(xlOLELinks)
ActiveWorkbook.OpenLinks linkArray(1)
本示例打開活動工作簿的所有 Microsoft Excel 支持文檔.
ActiveWorkbook.OpenLinks _
name:=ActiveWorkbook.LinkSources(xlExcelLinks)
38,Enabled 屬性
指定一個控件能否接受焦點和響應(yīng)用戶產(chǎn)生的事件.
語法
object.Enabled [= Boolean]
Enabled 屬性的語法包含以下成分:
成分 描述
object 必需.有效對象.
Boolean 可選.判斷該對象能否響應(yīng)用戶產(chǎn)生的事件.
設(shè)置
Boolean 的設(shè)置值有:
值 描述
70
True 該控件可接受焦點并響應(yīng)用戶產(chǎn)生的事件,而且能通過代碼進行
訪問(默認值).
False 用戶不能使用鼠標,擊鍵,加速鍵或熱鍵處理該控件.通常仍可
通過編碼訪問該控件.
說明
用 Enabled 屬性可使控件有效或無效.無效的控件顯示為淺灰色,有效控件的外觀
則與此不同.而且,如果控件中顯示位圖,則當控件變灰時位圖也隨之變灰.如果圖像控
件的 Enabled 屬性為 False,那么即使該控件外觀沒有變灰,仍不能初始化事件.
Enabled 和 Locked 屬性結(jié)合起來能實現(xiàn)如下作用:
如果 Enabled 和 Locked 都為 True,那么該控件在窗體中可以接受焦
點并且能正常顯示(非淺灰色).用戶可以復(fù)制控件中的數(shù)據(jù),但不能編輯它.
如果 Enabled 為 True,而 Locked 為 False,那么該控件在窗體中可
以接受焦點并且能正常顯示.用戶可復(fù)制和編輯該控件中的數(shù)據(jù).
如果 Enabled 為 False 而 Locked 為 True,那么該控件在窗體中不
能接收焦點并且是淺灰色的.用戶既不能復(fù)制也不能編輯控件中的數(shù)據(jù).
如果 Enabled 和 Locked 都為 False,那么該控件在窗體中不能接收
焦點并且是淺灰色的.用戶既不能復(fù)制也不能編輯控件中的數(shù)據(jù).
可以把 Enabled 和 TabStop 屬性的設(shè)置值結(jié)合起來,以防止用戶用 Tab 鍵選中命
令按鈕,但仍允許用戶單擊該按鈕.將 TabStop 設(shè)置為 False,意味著該命令按鈕將不
在 Tab 鍵順序中出現(xiàn).但是,如果 Enabled 的屬性為 True,只要 TakeFocusOnClick 的
設(shè)置是 True,用戶仍可以單擊該命令按鈕.
當用戶跳格進入有效的多頁控件或 TabStrip 時,控件中的第一頁或第一個標簽將
接收這個焦點.如果多頁控件的第一頁或 TabStrip 的第一個標簽無效,則控件中第一個
有效的頁或標簽接收這個焦點.如果多頁控件的所有頁或 TabStrip 標簽都是無效的,那
么該控件也是無效的,將不能接收這個焦點.
如果框架是無效的,則它包含的全部控件都是無效的.
單擊一個無效的列表框不能初始化 Click 事件.
Enabled,EnterFieldBehavior,SelLength,SelStart,SelText 屬性示例
下例跟蹤與選擇相關(guān)的屬性(SelLength,SelStart 和 SelText 屬性).當用戶用
鍵盤移動插入點以及擴展選定時,這些屬性發(fā)生變化.該示例還使用了 Enabled 和
EnterFieldBehavior 屬性.
若要使用該示例,請將示例代碼復(fù)制到某窗體的聲明變量部分.請確保該窗體包含:
名為 TextBox1 的一個大的文本框.
名為 TextBox2 到 TextBox4 的在一列中的三個文本框控件.
Private Sub TextBox1_KeyUp(ByVal KeyCode As _
MSForms.ReturnInteger, ByVal Shift As Integer)
TextBox2.Text = TextBox1.SelStart
TextBox3.Text = TextBox1.SelLength
TextBox4.Text = TextBox1.SelText
71
End Sub
Private Sub UserForm_Initialize()
TextBox1.MultiLine = True
TextBox1.EnterFieldBehavior = _
fmEnterFieldBehaviorRecallSelection
TextBox1.Text = "Type your text here. Use " _
& "CTRL+ENTER to start a new line."
End Sub
三,VBA語法
(一)Visual Basic 的命名規(guī)則
當在 Visual Basic 的模塊中為過程,常數(shù),變量以及參數(shù)命名時,可以使用下列
的規(guī)則:
第一個字符必須使用英文字母.
不能在名稱中使用空格,句點(.),驚嘆號(!),或 @,&,$,# 等字
符.
名稱的長度不可以超過 255 個字符.
通常,使用的名稱不能與 Visual Basic 本身的 Function 過程,語句
以及方法的名稱相同.必須退出使用與程序語言的關(guān)鍵字相同的名稱.若所使用
的內(nèi)在語言函數(shù),語句或方法與所指定的名稱相沖突,則必須顯示地識別它.常
規(guī)會將內(nèi)建函數(shù),語句或方法的名稱之前加上關(guān)聯(lián)的類型庫的名稱.例如,如果
有一個名為 Left 的變量,則只能用 VBA.Left 來調(diào)用 Left 函數(shù).
不能在范圍的相同層次中使用重復(fù)的名稱.例如,不能在同一過程中聲
明兩個命名為 age 的變量.然而,可以在同一模塊中聲明一個私有的命名為 age
的變量和過程的級別的命名為 age 的變量.
注意 Visual Basic 不區(qū)分大小寫,但它會在名稱被聲明的語句處保留大寫.
了解 Visual Basic 語法
Visual Basic 幫助主題中有關(guān)方法,語句或是Function 過程的語法,展示了正確
使用語句,方法或是函數(shù)所需要的元素.在這個主題中的示例,解釋了如何去解釋最常見
的語法元素.
Activate 方法的語法
object.Activate
在 Activate 方法語法中,斜體字 object 是一個所提供信息的占位符,在此例中
的代碼會返回一個對象.在鍵入粗體字時必須完全象上面的例子一樣.例如,下面的過程
會在活動的文檔中激活第二個窗口.
Sub MakeActive()
Windows(2).Activate
End Sub
MsgBox 函數(shù)的語法
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
72
在 MsgBox 函數(shù)的語法中,粗體的斜體字是此函數(shù)的命名參數(shù).方括號所包含的參
數(shù)是選擇性的.(在 Visual Basic 碼中不用鍵入方括號).在 MsgBox 函數(shù)中,唯一必
須提供的參數(shù)(prompt)是做為提示的文本.
在代碼中可以利用位置或名稱來指定函數(shù)與方法的參數(shù).若利用位置來指定參數(shù),
則必須根據(jù)語法中的順序,利用逗號來分隔每一個參數(shù),例如:
MsgBox "Your answer is correct!",0,"Answer Box"
若以名稱來指定參數(shù),則須使用參數(shù)名稱或跟著冒號與等號(:=),最后再加上參
數(shù)值.可以任何的順序來指定命名參數(shù),例如:
MsgBox Title:="Answer Box", Prompt:="Your answer is correct!"
函數(shù)以及某些方法的語法會利用圓括號將參數(shù)封閉起來.這些函數(shù)和方法會返回值,
所以必須用圓括號將參數(shù)封閉起來,才可以賦值給變量.如果忽略返回值或是沒有傳遞所
有的參數(shù),則可以不用圓括號.方法若不返回值,則不用將參數(shù)用圓括號封閉起來.上述
準則不管是使用命名參數(shù)或位置參數(shù)都適用.
在下面的示例中,MsgBox 函數(shù)的返回值是一個號碼,它被存儲在變量 myVar 中,
以用來指示選擇的按鈕.因為需要用到返回值,所以調(diào)用時必須使用圓括號.而另一個消
息框則是用來顯示變量的值.
Sub Question()
myVar = MsgBox(Prompt:="I enjoy my job.", _
Title:="Answer Box", Buttons:="4")
MsgBox myVar
End Sub
選項語句的語法
Option Compare {Binary | Text | Database}
在 Option Compare 語句的語法中,大括號和垂直線指示三項中的強制性選擇.(在
Visual Basic 的語句中不用鍵入大括號).例如,下列的語句指出在模塊中,字符串的
比較是根據(jù)文本的排序順序而不區(qū)分大小寫.
Option Compare Text
Dim 語句的語法
Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As
type]] . . .
在 Dim 語句的語法中,Dim 是必備的關(guān)鍵字.而唯一必備的元素是 varname(變量
名).例如,下列的語句創(chuàng)建三個變量:myVar,nextVar 和 thirdVar.它們會自動被聲
明成 Variant 變量.
Dim myVar, nextVar, thirdVar
下面的示例聲明了一個為 String 的變量.它包含了數(shù)據(jù)類型,如此可以節(jié)省內(nèi)存
并且?guī)椭鷱拇a中找出錯誤.
Dim myAnswer As String
若在一個語句中聲明好幾個變量,則必須包含每一個變量的數(shù)據(jù)類型.變量在聲明
時若少了數(shù)據(jù)類型,則會自動的聲明成 Variant .
Dim x As Integer, y As Integer, z As Integer
73
在下列的語句中,x 與 y 都被指定成 Variant 數(shù)據(jù)類型,只有 z 被指定成 String
數(shù)據(jù)類型.
Dim x, y, z As Integer
如果聲明一個數(shù)組變量,則必須包含圓括號,但下標則是可選的.下列的語句中定
義了一個動態(tài)數(shù)組 myArray.
Dim myArray()
1,寫 Visual Basic 語句
Visual Basic 中的語句是一個完整的命令.它可以包含關(guān)鍵字,運算符,變量,常
數(shù),以及表達式.每一個語句都屬于下列三種分類之一:
聲明語句,它會為變量,常數(shù),或程序取名稱,并且指定一個數(shù)據(jù)類型.
賦值語句,它會指定一個值或表達式給變量或常數(shù).
可執(zhí)行語句,它會初始化動作.它可以執(zhí)行一個方法或是函數(shù),并且可
以循環(huán)或從代碼塊中分支執(zhí)行.可執(zhí)行的語句通常包含數(shù)學(xué)的或條件的運算符.
將語句連續(xù)地寫在數(shù)行上
通常是將一個語句寫在同一行中,但也可以利用一個續(xù)行符將語句連續(xù)到下一行中.
下面的示例中,可執(zhí)行語句 MsgBox 被接續(xù)的寫在三行中:
Sub DemoBox()'該過程聲明一個字符串變量,
'指定它值為 Claudia,然后顯示一個
'連接的消息.
Dim myVar As String
myVar = "John"
MsgBox Prompt:="Hello " & myVar, _
Title:="Greeting Box", _
Buttons:=vbExclamation
End Sub
添加注釋
注釋可以為讀代碼的人解釋過程或是特別的命令.Visual Basic 在運行過程時,會
忽略掉注釋.注釋行可由省略符號(')或 Rem 接著一個空格做為開始,并且可以加在過
程的任何地方.為了在語句的同一行中添加注釋,必須在語句后面插入一個省略符號,然
后加上注釋文本.按照缺省規(guī)定,注釋會以綠色文本顯示.
檢查語法錯誤
如果在鍵入一行代碼后按下 ENTER 鍵,此行代碼以紅色文本顯示(同時可能也顯示
一個錯誤信息),則必須找出語句中的錯誤并更正它.
2,寫聲明語句
可以使用聲明語句去命名和定義過程,變量,數(shù)組以及常數(shù).當聲明一個過程,變
量或常數(shù)時,也同時定義了它的范圍,而此范圍是取決于聲明位置以及用什么關(guān)鍵字來聲
明它.
下面的示例包含三個聲明:
Sub ApplyFormat()
Const limit As Integer = 33
Dim myCell As Range
74
'更多的語句
End Sub
Sub 語句(與 End Sub 語句相匹配)聲明一個過程命名為 ApplyFormat.當
ApplyFormat 過程被調(diào)用或運行時,所有包含于 Sub 與 End Sub 中的語句都被執(zhí)行.
寫 Sub 過程
Const 語句聲明常數(shù) limit,指定 Integer 數(shù)據(jù)類型,其值 33.
聲明常數(shù)
Dim 語句聲明變量 myCell.它是一個屬于 Microsoft Excel Range 對象的數(shù)據(jù)類
型.可以將變量聲明成任何的對象,而此對象顯露于正使用的應(yīng)用程序中.Dim 語句是屬
于用來聲明變量的語句類型之一.其它用來聲明的關(guān)鍵字有 ReDim,Static,Public,
Private 以及 Const.
聲明變量
3,Dim 語句的語法
Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As
type]] . . .
在 Dim 語句的語法中,Dim 是必備的關(guān)鍵字.而唯一必備的元素是 varname(變量
名).例如,下列的語句創(chuàng)建三個變量:myVar,nextVar 和 thirdVar.它們會自動被聲
明成 Variant 變量.
Dim myVar, nextVar, thirdVar
下面的示例聲明了一個為 String 的變量.它包含了數(shù)據(jù)類型,如此可以節(jié)省內(nèi)存
并且?guī)椭鷱拇a中找出錯誤.
Dim myAnswer As String
若在一個語句中聲明好幾個變量,則必須包含每一個變量的數(shù)據(jù)類型.變量在聲明
時若少了數(shù)據(jù)類型,則會自動的聲明成 Variant .
Dim x As Integer, y As Integer, z As Integer
在下列的語句中,x 與 y 都被指定成 Variant 數(shù)據(jù)類型,只有 z 被指定成 String
數(shù)據(jù)類型.
Dim x, y, z As Integer
如果聲明一個數(shù)組變量,則必須包含圓括號,但下標則是可選的.下列的語句中定
義了一個動態(tài)數(shù)組 myArray.
Dim myArray()
4,Activate 方法的語法
object.Activate
在 Activate 方法語法中,斜體字 object 是一個所提供信息的占位符,在此例中
的代碼會返回一個對象.在鍵入粗體字時必須完全象上面的例子一樣.例如,下面的過程
會在活動的文檔中激活第二個窗口.
Sub MakeActive()
Windows(2).Activate
End Sub
5,Set 語句
將對象引用賦給變量或?qū)傩?
75
語法
Set objectvar = {[New] objectexpression | Nothing}
Set 語句的語法包含下面部分:
部分 描述
objectvar 必需的.變量或?qū)傩缘拿Q,遵循標準變量命名約定.
New 可選的.通常在聲明時使用 New,以便可以隱式創(chuàng)建對象.
如果 New 與 Set 一起使用,則將創(chuàng)建該類的一個新實例.如
果 objectvar 包含了一個對象引用,則在賦新值時釋放該引
用.不能使用 New 關(guān)鍵字來創(chuàng)建任何內(nèi)部數(shù)據(jù)類型的新實例,
也不能創(chuàng)建從屬對象.
objectexpression必需的.由對象名,所聲明的相同對象類型的其它變量,
或者返回相同對象類型的函數(shù)或方法所組成的表達式.
Nothing 可選的.斷絕 objectvar 與任何指定對象的關(guān)聯(lián).若沒
有其它變量指向 objectvar 原來所引用的對象,將其賦為
Nothing 會釋放該對象所關(guān)聯(lián)的所有系統(tǒng)及內(nèi)存資源.
說明
為確保合法,objectvar 必須是與所賦對象相一致的對象類型.
Dim,Private,Public,ReDim以及 Static 語句都只聲明了引用對象的變量.在
用 Set 語句將變量賦為特定對象之前,該變量并沒有引用任何實際的對象.
下面的示例說明了如何使用 Dim 來聲明 Form1 類型的數(shù)組.Form1 實際上還沒有
實例.然后使用 Set 將新創(chuàng)建的 Form1 的實例的引用賦給 myChildForms 變量.在 MDI
應(yīng)用程序中可以使用這些代碼來創(chuàng)建子窗體.
Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1
通常,當使用 Set 將一個對象引用賦給變量時,并不是為該變量創(chuàng)建該對象的一份
副本,而是創(chuàng)建該對象的一個引用.可以有多個對象變量引用同一個對象.因為這些變量
只是該對象的引用,而不是對象的副本,因此對該對象的任何改動都會反應(yīng)到所有引用該
對象的變量.不過,如果在 Set 語句中使用 New 關(guān)鍵字,那么實際上就會新建一個該對
象的實例.
Set 語句示例1
本示例在當前工作簿中新建一張工作表,然后設(shè)置該工作表的名稱.
Set newSheet = Worksheets.Add
newSheet.Name = "1995 Budget"
本示例新建一張工作表,并在其中插入當前工作簿所有名稱的列表,同時包括名稱
各自所對應(yīng)單元格區(qū)域的 A1-樣式引用.
Set newSheet = ActiveWorkbook.Worksheets.Add
i = 1
76
For Each nm In ActiveWorkbook.Names
newSheet.Cells(i, 1).Value = nm.NameLocal
newSheet.Cells(i, 2).Value = "'" & nm.RefersToLocal
i = i + 1
Next
Set 語句示例2
該示例使用 Set 語句將對象引用賦給變量.假定 YourObject 指向一個具有 Text
屬性的合法對象.
Dim YourObject, MyObject, MyStr
Set MyObject = YourObject'對象引用賦值.
'MyObject 和 YourObject 引用同一個對象.
YourObject.Text = "Hello World"'初始化屬性.
MyStr = MyObject.Text'返回 "Hello World".
'脫離關(guān)聯(lián).MyObject 不再引用 YourObject.
Set MyObject = Nothing'釋放該對象.
6,MsgBox 函數(shù)的語法
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
在 MsgBox 函數(shù)的語法中,粗體的斜體字是此函數(shù)的命名參數(shù).方括號所包含的參
數(shù)是選擇性的.(在 Visual Basic 碼中不用鍵入方括號).在 MsgBox 函數(shù)中,唯一必
須提供的參數(shù)(prompt)是做為提示的文本.
在代碼中可以利用位置或名稱來指定函數(shù)與方法的參數(shù).若利用位置來指定參數(shù),
則必須根據(jù)語法中的順序,利用逗號來分隔每一個參數(shù),例如:
MsgBox "Your answer is correct!",0,"Answer Box"
若以名稱來指定參數(shù),則須使用參數(shù)名稱或跟著冒號與等號(:=),最后再加上參
數(shù)值.可以任何的順序來指定命名參數(shù),例如:
MsgBox Title:="Answer Box", Prompt:="Your answer is correct!"
函數(shù)以及某些方法的語法會利用圓括號將參數(shù)封閉起來.這些函數(shù)和方法會返回值,
所以必須用圓括號將參數(shù)封閉起來,才可以賦值給變量.如果忽略返回值或是沒有傳遞所
有的參數(shù),則可以不用圓括號.方法若不返回值,則不用將參數(shù)用圓括號封閉起來.上述
準則不管是使用命名參數(shù)或位置參數(shù)都適用.
在下面的示例中,MsgBox 函數(shù)的返回值是一個號碼,它被存儲在變量 myVar 中,
以用來指示選擇的按鈕.因為需要用到返回值,所以調(diào)用時必須使用圓括號.而另一個消
息框則是用來顯示變量的值.
Sub Question()
myVar = MsgBox(Prompt:="I enjoy my job.", _
Title:="Answer Box", Buttons:="4")
MsgBox myVar
End Sub
7,選項語句的語法
Option Compare {Binary | Text | Database}
77
在 Option Compare 語句的語法中,大括號和垂直線指示三項中的強制性選擇.(在
Visual Basic 的語句中不用鍵入大括號).例如,下列的語句指出在模塊中,字符串的
比較是根據(jù)文本的排序順序而不區(qū)分大小寫.
Option Compare Text
8,AddressOf 運算符
一個一元運算符,它將其后面的過程的地址傳遞給一個 API 過程,該 API 過程在
參數(shù)表對應(yīng)位置中需要一個函數(shù)指針.
語法
AddressOf procedurename
必需的 procedurename 指定要傳遞的地址是哪一個過程的地址.這個過程必須是發(fā)
出調(diào)用命令的工程中的一個標準模塊模塊里的一個過程.
說明
當一個過程的名稱出現(xiàn)在一個參數(shù)列表中時,通常該過程已經(jīng)被計算,并且該過程
返回值的地址也會被傳遞.AddressOf 允許該過程的地址被傳遞給動態(tài)鏈接庫 (DLL) 中
的一個 Windows API 函數(shù),而不是傳遞該過程的返回值.API 函數(shù)然后就可以使用這個
地址來調(diào)用相應(yīng)的 Basic 過程,這個過程就是我們所知道的回調(diào).AddressOf 運算符只
出現(xiàn)在對 API 過程的調(diào)用中.
盡管可以使用 AddressOf 運算符在 Basic 過程之間傳遞過程指針,卻不能通過這
樣的一個指針從 Basic 內(nèi)部調(diào)用一個函數(shù).這就是說,例如,一個使用 Basic 編寫的類
不能使用這樣的一個指針來回調(diào)自己的控制器.當使用 AddressOf 運算符在 Basic 內(nèi)的
過程之間傳遞一個過程的指針時,被調(diào)用過程的參數(shù)類型必須定義為 As Long.
警告 如果不能完全理解函數(shù)回調(diào)的概念,則使用 AddressOf 運算符可能會導(dǎo)致意
想不到的結(jié)果.必須理解回調(diào)的 Basic 部份是如何工作的,以及接受所傳遞的函數(shù)地址
的 DLL 的代碼是如何工作的.調(diào)試這樣的交互操作是非常困難的,因為該程序和開發(fā)環(huán)
境運行在相同的進程中.在某些情況下,系統(tǒng)的調(diào)試也許是不可能的.
注意 可以使用 Microsoft Visual C++ (或者類似的工具)編譯的 DLLs 來創(chuàng)建自
己的回調(diào)函數(shù)原型.要使用 AddressOf 運算符來工作,您的原型必需使用 __stdcall 調(diào)
用約定.缺省的調(diào)用約定 (__cdecl) 不能與 AddressOf 運算符一起工作.
因為一個回調(diào)的調(diào)用程序不在用戶自己的程序中,所以很重要的一點是要保證回調(diào)
過程中的錯誤不被回傳到調(diào)用者.可以通過把 On Error Resume Next 語句放置于回調(diào)過
程的起始處來達到這個要求.
AddressOf 運算符示例
下面的示例創(chuàng)建一個帶有一個列表框的窗體,該列表框包含您的系統(tǒng)中的字體的按
字母順序排序的列表.
要運行該示例,請創(chuàng)建一個帶有一個列表框的窗體.窗體部分的代碼如下:
Option Explicit
Private Sub Form_Load()
Module1.FillListWithFonts List1
End Sub
把下面的代碼放置到一個模塊中.EnumFontFamilies 函數(shù)定義中的第三個參數(shù)是一
個長整形,它代表一個過程.該參數(shù)必須包含這個過程的地址,而不是這個過程的返回值.
78
在對 EnumFontFamilies 的調(diào)用中,第三個參數(shù)需要 AddressOf 運算符來返回
EnumFontFamProc 過程的地址,該過程是當調(diào)用 Windows API 函數(shù),即 EnumFontFamilies
時提供的回調(diào)過程的名稱.當把 AddressOf EnumFontFamProc 傳遞給 EnumFontFamilies
時, Windows 就會為系統(tǒng)中的每一個字體庫調(diào)用一次 EnumFontFamProc.傳遞給
EnumFontFamilies 的最后一個參數(shù)指定用來顯示信息的列表框.
'字體枚舉類型
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64
Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type
Type NEWTEXTMETRIC
tmHeight As Long
tmAscent As Long
tmDescent As Long
tmInternalLeading As Long
tmExternalLeading As Long
tmAveCharWidth As Long
tmMaxCharWidth As Long
tmWeight As Long
tmOverhang As Long
tmDigitizedAspectX As Long
tmDigitizedAspectY As Long
tmFirstChar As Byte
tmLastChar As Byte
tmDefaultChar As Byte
tmBreakChar As Byte
tmItalic As Byte
79
tmUnderlined As Byte
tmStruckOut As Byte
tmPitchAndFamily As Byte
tmCharSet As Byte
ntmFlags As Long
ntmSizeEM As Long
ntmCellHeight As Long
ntmAveWidth As Long
End Type
' ntmFlags 段標志
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
Public Const NTM_ITALIC = &H1&
'tmPitchAndFamily 標志
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4
Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0
'EnumFonts 掩碼
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4
Declare Function EnumFontFamilies Lib "gdi32" Alias _
"EnumFontFamiliesA" _
(ByVal hDC As Long, ByVal lpszFamily As String, _
ByVal lpEnumFontFamProc As Long, LParam As Any) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
ByVal hDC As Long) As Long
Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, _
ByVal FontType As Long, LParam As ListBox) As Long
Dim FaceName As String
Dim FullName As String
FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
LParam.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
EnumFontFamProc = 1
End Function
Sub FillListWithFonts(LB As ListBox)
Dim hDC As Long
80
LB.Clear
hDC = GetDC(LB.hWnd)
EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
ReleaseDC LB.hWnd, hDC
End Sub
9,了解變體
當聲明常數(shù),變量或參數(shù)時,若無指定數(shù)據(jù)類型則會自動的指定成 Variant 數(shù)據(jù)類
型.聲明成 Variant 數(shù)據(jù)類型的變量包含有字符串,日期,時間,Boolean或數(shù)值,并且
它們自動包含的值會轉(zhuǎn)換.數(shù)值型 Variant 值需要 16 字節(jié)的內(nèi)存(此點只有在大型的
過程或復(fù)雜的模塊才較具意義),并且在訪問時會比任何顯示地定義的數(shù)據(jù)類型來得慢.
很少使用 Variant 數(shù)據(jù)類型來表示常數(shù)字符串 Variant 值需要 22 字節(jié)的內(nèi)存.
下面的語句創(chuàng)建一個 Variant 變量:
Dim myVar
Dim yourVar As Variant
theVar = "This is some text."
最后的語句中并沒有顯示地聲明變量 theVar,但是會聲明隱含性的或自動性的變
量.所謂隱含性的聲明變量就是指定成 Variant 數(shù)據(jù)類型.
提示 如果指定了變量或參數(shù)的數(shù)據(jù)類型,但卻使用了錯誤的數(shù)據(jù)類型,如此則會發(fā)
生數(shù)據(jù)類型錯誤.不管使用隱含性的變量(Variant 數(shù)據(jù)類型)或是顯示地聲明所有的變
量并指定數(shù)據(jù)類型,都要避免數(shù)據(jù)類型錯誤.一般較喜歡用后者.
10,寫賦值語句
賦值語句指定一個值或表達式給變量或常數(shù).賦值語句通常會包含一個等號(=).
下面示例,指定 InputBox 函數(shù)的返回值給變量 yourName.
Sub Question()
Dim yourName As String
yourName = InputBox("What is your name ")
MsgBox "Your name is " & yourName
End Sub
Let 語句是可選的,而通常為省略.例如,上述的賦值語句可以寫成:
Let yourName = InputBox("What is your name ")
Set 語句可被用來指定一個對象給已聲明成對象的變量.而 Set 關(guān)鍵字是必備的.
下面示例中,Set 語句指定 Sheet1 上的一個范圍給對象變量 myCell:
Sub ApplyFormat()
Dim myCell As Range
Set myCell = Worksheets("Sheet1").Range("A1")
With myCell.Font
.Bold = True
.Italic = True
End With
End Sub
81
設(shè)置屬性值的語句也是一個賦值語句.下面的示例,將設(shè)置對于活動單元格 Font 對
象的 Bold 屬性:
ActiveCell.Font.Bold = True
11,寫可執(zhí)行的語句
一個可執(zhí)行的語句初始化動作.它可以執(zhí)行一個方法或者函數(shù),并且可以循環(huán)或從
代碼塊中分支執(zhí)行.可執(zhí)行的的語句通常包含數(shù)學(xué)的或條件運算符.
下面的示例使用 For Each...Next 語句來重復(fù)名稱為 MyRange 范圍內(nèi)的每個單元