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