excel vba 數據分析


(Visual Basic Application)

VBA(Visual Basic for Application)是Microsoft Office系列軟件的內置編程語言,其語法結構與Visual Basic編程語言互相兼容,采用的是面向對象的編程機制和可視化的編程環境。

第一節 標識符

一.定義

標識符是一種標識變量、常量、過程、函數、類等語言構成單位的符號,利用它可以完成對變量、常量、過程、函數、類等的引用。

二.命名規則

1)  字母打頭,由字母、數字和下划線組成,如 A987b_23Abc

2)  字符長度小於40

3)  不能與VB保留字重名,如public, private, dim, goto, next, with, integer, single等

第二節 運算符

定義:運算符是代表VB某種運算功能的符號。

1)賦值運算符 =

2)數學運算符 &、+ (字符連接符)、+(加)、-(減)、Mod(取余)、\(整除)、*(乘)、/(除)、-(負號)、^(指數)

3)邏輯運算符Not(非)、And(與)、Or(或)、Xor(異或)、Eqv(相等)、Imp(隱含)

4)關系運算符 = (相同)、<>(不等)、>(大於)、<(小於)、>=(不小於)、<=(不大於)、Like、Is

5)位運算符(暫時可不看位運算) Not(邏輯非)、And(邏輯與)、Or(邏輯或)、Xor(邏輯異或)、Eqv(邏輯等)、Imp(隱含)

第三節 數據類型

VBA共有12種數據類型,具體見下表,此外用戶還可以根據以下類型用Type自定義數據類型。

數據類型

類型標識符

字節

字符串型 String

$

字符長度(0-65400)

字節型 Byte

1

布爾型 Boolean

2

整數型 Integer

%

2

長整數型 Long

&

4

單精度型 Single

!

4

雙精度型 Double

#

8

日期型 Date

8  公元100/1/1-9999/12/31

貨幣型 Currency

@

8

小數點型 Decimal

14

變體型 Variant

以上任意類型,可變

對象型 Object

4

 

第四節 變量與常量

1)VBA允許使用未定義的變量,默認是變體變量。

2)在模塊通用說明部份,加入 Option Explicit 語句可以強迫用戶進行變量定義。

3)變量定義語句及變量作用域

Dim        變量 as 類型   '定義為局部變量,如 Dim          xyz as integer

Private    變量 as 類型   '定義為私有變量,如 Private       xyz as byte

Public     變量 as 類型   '定義為公有變量,如 Public        xyz as single

Global    變量 as 類型   '定義為全局變量,如 Globlal       xyz as date

Static        變量 as 類型   '定義為靜態變量,如 Static         xyz as double

一般變量作用域的原則是,那部份定義就在那部份起作用,模塊中定義則在該模塊那作用。

4)常量為變量的一種特例,用Const定義,且定義時賦值,程序中不能改變值,作用域也如同變量作用域。如下定義:Const Pi=3.1415926 as single

第五節 數組

數組是包含相同數據類型的一組變量的集合,對數組中的單個變量引用通過數組索引下標進行。在內存中表現為一個連續的內存塊,必須用Global或Dim語句來定義。定義規則如下:

Dim 數組名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值為0。二維數組是按行列排列,

如Dim X(9) as String 聲明了一個10個元素的數組,X(0)~X(9),如果沒有指定lower,則默認lower=0。

再例如Dim MyArray(10, 10) As Integer,是個11*11整數數組

除了以上固定數組外,VBA還有一種功能強大的動態數組,定義時無大小維數聲明;在程序中再利用Redim語句來重新改變數組大小,原來數組內容可以通過加preserve關鍵字來保留。如下例:

Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)

第六節 注釋和賦值語句

1)注釋語句是用來說明程序中某些語句的功能和作用,注釋語句不會被執行;VBA中有兩種方法標識為注釋語句。

ü  單引號 ’ ;如:’定義全局變量;可以位於別的語句之尾,也可單獨一行

ü  Rem ;如:Rem定義全局變量;只能單獨一行

2)賦值語句是進行對變量或對象屬性賦值的語句,采用賦值號 =,如X=123:Form1.caption=”我的窗口”

對對象的賦值采用:set myobject=object 或  myobject:=object

第七節 書寫規范

1)VBA不區分標識符的字母大小寫,一律認為是小寫字母;

2)最好以行只寫一條語句。一行可以書寫多條語句,各語句之間以冒號 : 分開;

3)一條語句可以多行書寫,以空格加下划線 _ 來標識下行為續行;

4)標識符最好能簡潔明了,不造成歧義。

第八節 判斷語句

1)If…Then…Else語句

If condition Then [statements][Else elsestatements]

condition 是個判斷條件,當condition為真True,就執行Then后面的statements那些語句,如果為假False,執行elsestatements語句

如1:If A>B And C<D Then A=B+2 Else A=C+2

如2:If x>250 Then x=x-100

或者,可以使用塊形式的語法,即If…Then…Else語句 可以嵌套:

If condition Then

[statements]

[ElseIf condition-n Then

[elseifstatements] ...

[Else

[elsestatements]]

End If

如1:

If Number < 10 Then

    Digits = 1

ElseIf Number < 100 Then

    Digits = 2

Else

    Digits = 3

End If

2)Select Case…Case…End Case語句

如1:Pid的取值來決定執行不同的語句

Select Case Pid

Case “A101”

Price=200    ‘當Pid的實際值是“A101”,就執行Price=200.后面的以此類推

Case “A102”

Price=300

……

Case Else

Price=900

End Case

第九節 循環語句

1)For Next語句 以指定次數來重復執行一組語句

For counter = start To end [Step step]                      ' step 缺省值為1

[statements]

[Exit For]

[statements]

Next [counter]

如1:for語句也可以嵌套,如下,兩重for循環

For Words = 10 To 1 Step -1                                ' 建立 10 次循環

    For Chars = 0 To 9                                 ' 建立 10 次循環

        MyString = MyString & Chars         ' 將數字添加到字符串中

    Next Chars                                            ' Increment counter

    MyString = MyString & " "                     ' 添加一個空格

Next Words

2)For Each…Next語句  主要功能是對一個數組或集合對象進行,讓所有元素重復執行一次語句

其作用就是遍歷一遍數組或集合對象中的所有元素

For Each element In group   ‘group 必要參數。對象集合或數組的名稱(用戶定義類型的數組除外)。

Statements

[Exit for]

Statements

Next [element]

如1:

For Each rang2 In range1

With range2.interior

.colorindex=6

.pattern=xlSolid

End with

Next

這上面一例中用到了 With…End With 語句,目的是省去對象多次調用,加快速度;語法為:

With object

[statements]

End With

3)Do…loop語句 在條件為true時,重復執行區塊命令

Do {while |until} condition                    ' while 為當型循環,until為直到型循環,顧名思義,不多說啦

Statements

Exit do

Statements

Loop

或者使用下面語法

Do                                                    ' 先do 再判斷,即不論如何先干一次再說

Statements

Exit do

Statements

Loop {while |until} condition

4)while…wend語句,只要條件為TRUE,循環就執行 如下例:

while condition                                               ‘while I<50

[statements]                                                    ‘I=I+1

wend     

第十節 其他類語句和錯誤語句處理

這節可以省略,感興趣的話可以看看

一.其他循環語句

結構化程序使用以上判斷和循環語句已經足夠,建議不要輕易使用下面的語句,雖然VBA還支持。

1)      Goto line 該語句為跳轉到line語句行

2)      On expression gosub destinatioinlist 或者 on expression goto destinationlist 語句為根據 exprssion表達式值來跳轉到所要的行號或行標記

3)      Gosub line…line…Return語句, Return 返回到 Gosub line行,如下例:

Sub gosubtry()

Dim num

Num=inputbox(“輸入一個數字,此值將會被判斷循環”)

If num>0 then Gosub Routine1 :Debug.print num:Exit sub

Routine1:

Num=num/5

Return

End sub

                                                 ‘Wend

二.錯誤語句處理

執行階段有時會有錯誤的情況發生,利用On Error語句來處理錯誤,啟動一個錯誤的處理程序。語法如下:

On Error Goto Line            ‘當錯誤發生時,會立刻轉移到line行去

On Error Resume Next                         ‘當錯誤發生時,會立刻轉移到發生錯誤的下一行去

On Erro Goto 0                                                ‘當錯誤發生時,會立刻停止過程中任何錯誤處理過程

第十一節 過程和函數

過程是構成程序的一個模塊,往往用來完成一個相對獨立的功能。過程可以使程序更清晰、更具結構性。VBA具有四種過程:Sub 過程、Function函數、Property屬性過程和Event事件過程。

一.Sub過程

Sub 過程的參數有兩種傳遞方式:按值傳遞(ByVal)和按地址傳遞(ByRef)。如下例:

Sub password (ByVal x as integer, ByRef y as integer)

If y=100 then y=x+y else y=x-y

x=x+100

End sub

Sub call_password ()

Dim x1 as integer

Dim y1 as integer

x1=12

y1=100

Call password (x1,y1)          ‘調用過程方式:1. Call 過程名(參數1, 參數2…) ; 2. 過程名 參數1, 參數2…

debug.print x1,y1                  ‘結果是12、112,y1按地址傳遞改變了值,而x1按值傳遞,未改變原值

End sub

二.Function函數

函數實際是實現一種映射,它通過一定的映射規則,完成運算並返回結果。參數傳遞也兩種:按值傳遞(ByVal)和按地址傳遞(ByRef)。如下例:

Function password(ByVal x as integer, byref y as integer) as boolean

If y=100 then y=x+y else y=x-y

x=x+100

if y=150 then password=true else password=false

End Function

Sub call_password ()

Dim x1 as integer Dim y1 as integer

x1=12

y1=100

if password then           ‘調用函數:1. 作為一個表達式放在=右端 ; 2. 作為參數使用

debug.print x1              

    end if

End sub

三.Property屬性過程和Event事件過程

這是VB在對象功能上添加的兩個過程,與對象特征密切相關,也是VBA比較重要組成,技術比較復雜,可以參考相關書籍。我們的試驗不涉及這兩部分

第十二節內部函數

在VBA程序語言中有許多內置函數,可以幫助程序代碼設計和減少代碼的編寫工作。

這部分重要是供我們查閱,直接使用的。一般要注意某個函數的需要輸入的參數是什么類型的,函數的返回值又是什么類型的

一.測試函數

IsNumeric(x)                           ‘是否為數字, 返回Boolean結果,True or False

IsDate(x)                               ‘是否是日期, 返回Boolean結果,True or False

IsEmpty(x)                          ‘是否為Empty, 返回Boolean結果,True or False

IsArray(x)                                 ‘指出變量是否為一個數組。

IsError(expression)                      ‘指出表達式是否為一個錯誤值

IsNull(expression)                       ‘指出表達式是否不包含任何有效數據 (Null)。

IsObject(identifier)                      ‘指出標識符是否表示對象變量

二.數學函數

Sin(X)、Cos(X)、Tan(X)、Atan(x)  三角函數,單位為弧度

Log(x) 返回x的自然對數

Exp(x)返回 ex

Abs(x) 返回絕對值

Int(number)、Fix(number) 都返回參數的整數部分,區別:Int 將 -8.4 轉換成 -9,而 Fix 將-8.4 轉換成 -8

Sgn(number) 返回一個 Variant (Integer),指出參數的正負號

Sqr(number) 返回一個 Double,指定參數的平方根

VarType(varname) 返回一個 Integer,指出變量的子類型

Rnd(x)返回0-1之間的單精度數據,x為隨機種子

三.字符串函數

Trim(string)                        去掉string左右兩端空白

Ltrim(string)                       去掉string左端空白

Rtrim(string)                       去掉string右端空白

Len(string)                          計算string長度

Left(string, x)                     取string左段x個字符組成的字符串

Right(string, x)                   取string右段x個字符組成的字符串

Mid(string, start,x)              取string從start位開始的x個字符組成的字符串

Ucase(string)                       轉換為大寫

Lcase(string)                       轉換為小寫

Space(x)                             返回x個空白的字符串

Asc(string)                          返回一個 integer,代表字符串中首字母的字符代碼

Chr(charcode)                      返回 string,其中包含有與指定的字符代碼相關的字符

四.轉換函數

CBool(expression)                轉換為Boolean型

CByte(expression)                      轉換為Byte型

CCur(expression)                 轉換為Currency型

CDate(expression)                      轉換為Date型

CDbl(expression)                 轉換為Double型

CDec(expression)                轉換為Decemal型

CInt(expression)                  轉換為Integer型

CLng(expression)                轉換為Long型

CSng(expression)                轉換為Single型

CStr(expression)                  轉換為String型

CVar(expression)                 轉換為Variant型

Val(string)                         轉換為數據型

Str(number)                         轉換為String

五.時間函數

Now                  返回一個 Variant (Date),根據計算機系統設置的日期和時間來指定日期和時間。

Date             返回包含系統日期的 Variant (Date)。

Time           返回一個指明當前系統時間的 Variant (Date)。

Timer                 返回一個 Single,代表從午夜開始到現在經過的秒數。

TimeSerial(hour, minute, second) 返回一個 Variant (Date),包含具有具體時、分、秒的時間。

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant (Long) 的值,表示兩個指定日期間的時間間隔數目

Second(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數,表示一分鍾之中的某個秒

Minute(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數,表示一小時中的某分鍾

Hour(time)    返回一個 Variant (Integer),其值為 0 到 23 之間的整數,表示一天之中的某一鍾點

Day(date)      返回一個 Variant (Integer),其值為 1 到 31 之間的整數,表示一個月中的某一日

Month(date)   返回一個 Variant (Integer),其值為 1 到 12 之間的整數,表示一年中的某月

Year(date)      返回 Variant (Integer),包含表示年份的整數。

Weekday(date, [firstdayofweek]) 返回一個 Variant (Integer),包含一個整數,代表某個日期是星期幾

第二章 擴展運用

第一節 全面控制 Excel

一、首先創建 Excel 對象,使用ComObj: 
Dim ExcelID as Excel.Application 
Set ExcelID as new Excel.Application 
1) 顯示當前窗口: 
ExcelID.Visible := True; 
2) 更改 Excel 標題欄: 
ExcelID.Caption := \'應用程序調用 Microsoft Excel\'; 
3) 添加新工作簿: 
ExcelID.WorkBooks.Add; 
4) 打開已存在的工作簿: 
ExcelID.WorkBooks.Open( \'C:\\Excel\\Demo.xls\' ); 
5) 設置第2個工作表為活動工作表: 
ExcelID.WorkSheets[2].Activate; 
或 ExcelID.WorkSheets[ \'Sheet2\' ].Activate; 
6) 給單元格賦值: 
ExcelID.Cells[1,4].Value := \'第一行第四列\'; 
7) 設置指定列的寬度(單位:字符個數),以第一列為例: 
ExcelID.ActiveSheet.Columns[1].ColumnsWidth := 5; 
8) 設置指定行的高度(單位:磅)(1磅=0.035厘米),以第二行為例: 
ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米 
9) 在第8行之前插入分頁符: 
ExcelID.WorkSheets[1].Rows[8].PageBreak := 1; 
參考代碼:ActiveSheet.HPageBreaks(1).Location = Range("A22") 
10) 在第8列之前刪除分頁符: 
ExcelID.ActiveSheet.Columns[4].PageBreak := 0; 
11) 指定邊框線寬度: 
ExcelID.ActiveSheet.Range[ \'B3:D4\' ].Borders[2].Weight := 3; 
1-左 2-右 3-頂 4-底 5-斜( \\ ) 6-斜( / ) 
12) 清除第一行第四列單元格公式:
ExcelID.ActiveSheet.Cells[1,4].ClearContents; 
13) 設置第一行字體屬性: 
ExcelID.ActiveSheet.Rows[1].Font.Name := \'隸書\'; 
ExcelID.ActiveSheet.Rows[1].Font.Color := clBlue; 
ExcelID.ActiveSheet.Rows[1].Font.Bold := True; 
ExcelID.ActiveSheet.Rows[1].Font.UnderLine := True; 
14) 進行頁面設置: 
a.頁眉: 
ExcelID.ActiveSheet.PageSetup.CenterHeader := \'報表演示\'; 
b.頁腳: 
ExcelID.ActiveSheet.PageSetup.CenterFooter := \'第&P頁\'; 
c.頁眉到頂端邊距2cm: 
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 2/0.035; 
d.頁腳到底端邊距3cm: 
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 3/0.035; 
e.頂邊距2cm: 
ExcelID.ActiveSheet.PageSetup.TopMargin := 2/0.035; 
f.底邊距2cm: 
ExcelID.ActiveSheet.PageSetup.BottomMargin := 2/0.035; 
g.左邊距2cm: 
ExcelID.ActiveSheet.PageSetup.LeftMargin := 2/0.035; 
h.右邊距2cm: 
ExcelID.ActiveSheet.PageSetup.RightMargin := 2/0.035; 
i.頁面水平居中: 
ExcelID.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035; 
j.頁面垂直居中: 
ExcelID.ActiveSheet.PageSetup.CenterVertically := 2/0.035; 
k.打印單元格網線: 
ExcelID.ActiveSheet.PageSetup.PrintGridLines := True; 
15) 拷貝操作: 
a.拷貝整個工作表: 
ExcelID.ActiveSheet.Used.Range.Copy; 
b.拷貝指定區域: 
ExcelID.ActiveSheet.Range[ \'A1:E2\' ].Copy; 
c.從A1位置開始粘貼: 
ExcelID.ActiveSheet.Range.[ \'A1\' ].PasteSpecial; 
d.從文件尾部開始粘貼: 
ExcelID.ActiveSheet.Range.PasteSpecial; 
16) 插入一行或一列: 
a. ExcelID.ActiveSheet.Rows[2].Insert; 
b. ExcelID.ActiveSheet.Columns[1].Insert; 
17) 刪除一行或一列: 
a. ExcelID.ActiveSheet.Rows[2].Delete; 
b. ExcelID.ActiveSheet.Columns[1].Delete; 
18) 打印預覽工作表: 
ExcelID.ActiveSheet.PrintPreview; 
19) 打印輸出工作表: 
ExcelID.ActiveSheet.PrintOut; 
20) 工作表保存: 
If not ExcelID.ActiveWorkBook.Saved then 
ExcelID.ActiveSheet.PrintPreview 
End if 
21) 工作表另存為: 
ExcelID.SaveAs( \'C:\\Excel\\Demo1.xls\' ); 
22) 放棄存盤: 
ExcelID.ActiveWorkBook.Saved := True; 
23) 關閉工作簿: 
ExcelID.WorkBooks.Close; 
24) 退出 Excel: 
ExcelID.Quit; 
25) 設置工作表密碼: 
ExcelID.ActiveSheet.Protect "123", DrawingObjects:=True, Contents:=True, Scenarios:=True 
26) EXCEL的顯示方式為最大化 
ExcelID.Application.WindowState = xlMaximized 
27) 工作薄顯示方式為最大化 
ExcelID.ActiveWindow.WindowState = xlMaximized 
28) 設置打開默認工作薄數量 
ExcelID.SheetsInNewWorkbook = 3 
29) \'關閉時是否提示保存(true 保存;false 不保存) 
ExcelID.DisplayAlerts = False 
30) 設置拆分窗口,及固定行位置 
ExcelID.ActiveWindow.SplitRow = 1 
ExcelID.ActiveWindow.FreezePanes = True 
31) 設置打印時固定打印內容 
ExcelID.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1" 
32) 設置打印標題 
ExcelID.ActiveSheet.PageSetup.PrintTitleColumns = "" 
33) 設置顯示方式(分頁方式顯示) 
ExcelID.ActiveWindow.View = xlPageBreakPreview 
34) 設置顯示比例 
ExcelID.ActiveWindow.Zoom = 100 
35) 讓Excel 響應 DDE 請求 
Ex.Application.IgnoreRemoteRequests = False 
用VB操作EXCEL 
Private Sub Command3_Click() 
On Error GoTo err1 
Dim i As Long 
Dim j As Long 
Dim objExl As Excel.Application \'聲明對象變量 
Me.MousePointer = 11 \'改變鼠標樣式 
Set objExl = New Excel.Application \'初始化對象變量 
objExl.SheetsInNewWorkbook = 1 \'將新建的工作薄數量設為1 
objExl.Workbooks.Add \'增加一個工作薄 
objExl.Sheets(objExl.Sheets.Count).Name = "book1" \'修改工作薄名稱 
objExl.Sheets.Add , objExl.Sheets("book1") ‘增加第二個工作薄在第一個之后 
objExl.Sheets(objExl.Sheets.Count).Name = "book2" 
objExl.Sheets.Add , objExl.Sheets("book2") ‘增加第三個工作薄在第二個之后 
objExl.Sheets(objExl.Sheets.Count).Name = "book3" 
objExl.Sheets("book1").Select \'選中工作薄<book1> 
For i = 1 To 50 \'循環寫入數據 
For j = 1 To 5 
If i = 1 Then 
objExl.Selection.NumberFormatLocal = "@" \'設置格式為文本 
objExl.Cells(i, j) = " E " & i & j 
Else 
objExl.Cells(i, j) = i & j 
End If 
Next 
Next 
objExl.Rows("1:1").Select \'選中第一行 
objExl.Selection.Font.Bold = True \'設為粗體 
objExl.Selection.Font.Size = 24 \'設置字體大小 
objExl.Cells.EntireColumn.AutoFit \'自動調整列寬 
objExl.ActiveWindow.SplitRow = 1 \'拆分第一行 
objExl.ActiveWindow. SplitColumn = 0 \'拆分列 
objExl.ActiveWindow.FreezePanes = True \'固定拆分 objExl.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1" \'設置打印固定行 
objExl.ActiveSheet.PageSetup.PrintTitleColumns = "" \'打印標題 objExl.ActiveSheet.PageSetup.RightFooter = "打印時間: " & _ 
Format(Now, "yyyy年mm月dd日 hh:MM:ss") 
objExl.ActiveWindow.View = xlPageBreakPreview \'設置顯示方式 
objExl.ActiveWindow.Zoom = 100 \'設置顯示大小 
objExl.ActiveSheet.PageSetup.Orientation = xlLandscape ‘設置打印方向(橫向) 
\'給工作表加密碼 
objExl.ActiveSheet.Protect "123", DrawingObjects:=True, _ 
Contents:=True, Scenarios:=True 
objExl.Application.IgnoreRemoteRequests = False 
objExl.Visible = True \'使EXCEL可見 
objExl.Application.WindowState = xlMaximized \'EXCEL的顯示方式為最大化 
objExl.ActiveWindow.WindowState = xlMaximized \'工作薄顯示方式為最大化 
objExl.SheetsInNewWorkbook = 3 \'將默認新工作薄數量改回3個 
Set objExl = Nothing \'清除對象 
Me.MousePointer = 0 \'修改鼠標 
Exit Sub 
err1: 
objExl.SheetsInNewWorkbook = 3 
objExl.DisplayAlerts = False \'關閉時不提示保存 
objExl.Quit \'關閉EXCEL 
objExl.DisplayAlerts = True \'關閉時提示保存 
Set objExl = Nothing 
Me.MousePointer = 0 
End Sub

第二節 Inputbox函數的功能與作用

Inputbox函數是VBA中用於數據輸入的函數,它可以在一個對話框中顯示提示並等待用戶輸入信息或,在按下按鈕后返回用戶輸入的String類型字符串。 
Inputbox通常用於為用戶提供錄入窗口,然后將返窗口中的錄入字符串按代碼指定方式導入到相應的窗口或者根據輸入值來決定后續的操作。 
例如圖2.1中,用戶的錄入信息決定程序的后續執行方式。 
                        
圖2.1 以錄入值確定計算方式 
當然,Inputbox也有其它的很多作用,例如輸入一個數值來參與運算,如圖2.2所示。 

圖2.2 對錄入值進行運算 
(1)Inputbox函數的語法 
Inputbox的具體語法如下: 
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) 
其中第一參數是必選參數,其余參數為可選參數。各參數的詳細解釋如下:
表2.1
Inputbox的參數詳解

部分

描述

Prompt

作為對話框消息出現的字符串表達式。prompt 的最大長度大約是 1024 個字符,由所用字符的寬度決定。

Title

顯示對話框標題欄中的字符串表達式。如果省略 title,則把應用程序名放入標題欄中

Default

顯示文本框中的字符串表達式,在沒有其它輸入時作為缺省值

Xpos

數值表達式,成對出現,指定對話框的左邊與屏幕左邊的水平距離。如果省略 xpos,則對話框會在水平方向居中

Ypos

數值表達式,成對出現,指定對話框的上邊與屏幕上邊的距離。如果省略 ypos,則對話框被放置在屏幕垂直方向距下邊大約三分之一的位置

Helpfile

字符串表達式,識別幫助文件,用該文件為對話框提供上下文相關的幫助

Context

數值表達式,由幫助文件的作者指定給某個幫助主題的幫助上下文編號

其中最重要的參數是前面三個,包括提示信息、標題和默認值。在特殊情況下,第四、五參數也具有其實用價值——強制指定對話框的顯示位置,從而防止對話框擋住當前窗口。 
或許從以下案例中,可以加深對Inputbox函數的認識。 
(2).定制“另存為”對話框 
設計一個用於文件另存的對話框,固定保存在C盤下,用戶可以隨意定制文件名,默認名稱為當前日期。代碼如下: 
___________________________________________________________________ 

Sub 工作簿另存() 
Dim FileName As String'聲明變量 
'彈出一個錄入框,讓用戶指定文件名,默認值為當前日期 
FileName = InputBox("請輸入工作簿新名稱", "另存為", Date)'當前工作簿另存到C盤中,文件名為用戶指定字符 
ThisWorkbook.SaveAs "c:\" & FileName 
End Sub 
___________________________________________________________________ 

執行以上代碼時,將彈出一個“另存為”對話框供用戶錄入新名稱,其默認值為當前日期,見圖2.3所示: 


圖2.3 定制的“另存為”對話框 
(3)根據指定月份批量創建工作表 
用戶指定的月份,程序批量創建該月每日日期命名的工作表。代碼如下: 

___________________________________________________________________ 

Sub 新建工作表()'批量建立新表,個數等於本月天數,同時對日期命名,並建立目錄 
Dim i As Byte, months As Byte'聲明變量 
'彈出一個對話框,讓用戶指定月份,默認顯示當前月 
months = InputBox("請輸入月份,程序將建立該月每日日期命名的工作表", "確定月份", Month(Date)) 
'批量生成工作表,其個數等於指定月份的天數減去當前已有工作表個數,即確保工作表數量等於該月天數 
Sheets.Add After:=Sheets(Sheets.Count), Count:=Day(DateSerial(Year(Date), months + 1, 0)) - Sheets.Count'將所有工作表重命名,工作表名對應每日的日期 
For i = 1 To Sheets.Count 
Sheets(i).Name = months & "月" & i & "日"'對每個工作表命名 
Next i 
MsgBox "建立完畢!", 64 
End Sub 

___________________________________________________________________ 

在以上代碼中,Inputbox可以彈出一個對話框,讓用戶指定月份,默認值為當前月份。而當前月份的計算方式是利用Month函數從當前日期Date中獲取。 
其中計算用戶指定的月份有多少天時,鑒於VBA自動日期轉換的特點——將0日當做上月最后一天處理,所以程序利用DateSerial函數將下月0日轉換成本月最后一天的日期序列,最后再用Day函數提取其天數,表示當月有多少天。 
圖2.4是Inputbox函數設置的對話框,讓用戶指定月份;而圖31.5是批量創建的工作表。 


圖2.4 指定月份的錄入框 


圖2.5 批量創建工作表后的效果 
如果在Inputbox中需要是更多的提示信息,那么可以使用Chr(10)來分行。例如本例中Inputbox語句可以修改為: 
months = InputBox("請輸入月份,程序將建立該月每日日期命名的工作表" & Chr(10) & "例如輸入4月,則產生的工人表則為4月1日、4月2日.......", "確定月份", Month(Date)) 
(4).將A1日期按指定樣式轉換為星期 
A1存放日期,現需將其轉換星期,程序需要讓用戶決定轉換方式,即提供三個可選項。 
達成以上需求可以使用以下代碼: 

___________________________________________________________________ 

Sub 將A1日期轉換為星期() 
Dim Week As Byte'聲明變量 
'提供輸入框,讓用戶選擇轉換方式。在輸入框中可以預覽轉換后的結果 
Week = InputBox("請選擇轉換樣式:" & Chr(10) & "輸入1:" & Format([a1], "DDD") & Chr(10) _ 
& "輸入2:" & Format([a1], "DDDD") & Chr(10) & "輸入3:" & Format([a1], "AAA"))'根據用戶錄入的數字對A1的日期進行轉換 
[b1] = Format([a1].Value, Choose(Week, "DDD", "DDDD", "AAA")) 
End Sub 
___________________________________________________________________ 

該過程中利用Inputbox顯示一個輸入框,在輸入框中可以預覽轉換后的四種日期樣式,只用輸入1到3之間的任何數字,程序會對應地轉換日期為該格式。假設A1的是“5月9日”,那么執行程序后輸入框外觀見圖31.6所示。 


圖2.6 提示用戶選擇轉換樣式 
在該過程中,使用了Choose函數,它可以根據第一參數的值從后面的參數中選擇對應的值做為Format的參數。程序沒有使用防錯功能,如果輸入的值小於1或者大於3將產生錯誤。

(5)  Inputbox函數在工作中應用非常的廣泛,本節通過一個實例演示Inputbox函數搭配其它代碼實現生成指定月份的月歷。月歷中包括該月每一天及對應的星期。 
   本實例除Inputbox的知識外,還涉及如下知識點: 
   (1)數據類型轉換 
   (2)錯誤設置 
   (3)日期的轉化 
   (4)區域合並 
   (5)VBA錄入數組公式 
   (6)文本替換 
   (7)為單元格設置邊框 
   (8)將公式轉換成值 
   具體操作步驟如下: 
   1.打開ET 2009,使用快捷鍵〖Alt+F11〗進入VBE界面; 
   2.單擊菜單〖插入〗\〖模塊〗; 
   3.在模塊中錄入以下代碼: 
_______________________________________________________ 

Sub 生成月歷() 
On Error Resume Next'防錯:有錯誤時繼續下一步 
Dim Months As Byte 
'提供一個讓用戶指定月份的對話框,對話框顯示屏幕左上角,其上邊距和左邊距均為10 
'inputbox反回值是String型,利用CByte轉換成Byte型Star:
Months = CByte(InputBox("請指定月份,程序將生成該月的月歷", "月份", Month(Date), 10, 10)) 
If err <> 0 Then err.Clear: GoTo Star'如果有錯誤則返回重新輸入 
If Months < 1 Or Months > 12 Then MsgBox "只能在1-12之間,請重新輸入。", 64, "提示": GoTo Star 
Application.ScreenUpdating = False'關閉屏幕更新,加快速度 
With ActiveCell'在當前單元格顯示當前指定月份第一日的日期 
.Value = Format(DateSerial(Year(Date), Months, 1), "yyyy年m月d日")'對首行7列合並居中 
.Resize(1, 7).Merge 
.HorizontalAlignment = etHAlignCenter' 設置標題行數據並設置為居中顯示產,添加顏色 
With .Offset(1, 0).Resize(1, 7) 
.Value = Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")'標題 
.HorizontalAlignment = ksoCenter'居中顯示 
.Interior.ColorIndex = 15'標示背景色 
.Font.Bold = True'加粗顯示 
End With 
On Error GoTo err'當出錯時執行Err標簽處的語句 
With .Offset(2, 0).Resize(6, 7)'設置公式區域 
'建立數組公式 
.FormulaArray = "=text(IF(MONTH(" & ActiveCell.MergeArea(1).Address(0, 0) & ")<>MONTH(" & ActiveCell.MergeArea(1).Address(0, 0) & "-(WEEKDAY(" & ActiveCell.MergeArea(1).Address(0, 0) & ")-1)+{0;1;2;3;4;5}*7+{0,1,2,3,4,5,6}),""""," & ActiveCell.MergeArea(1).Address(0, 0) & "-(WEEKDAY(" & ActiveCell.MergeArea(1).Address(0, 0) & ")-1)+{0;1;2;3;4;5}*7+{0,1,2,3,4,5,6}),""d"")" 
.HorizontalAlignment = etHAlignCenter'居中對齊 
.VerticalAlignment = etVAlignCenter 
End With 
With .Resize(8, 7)'將公式轉換成值(ET中無對數組公式的轉換比Excel麻煩一點) 
.Copy 
.PasteSpecial Paste:=xlPasteValues'將公式選擇粘貼,從而轉換成值 
.Value = .Value'再去除綠色粘三角提示 
.EntireColumn.AutoFit'自動調整列寬 
'加邊框 
.Borders.Weight = etThin'中間用細線 
.Borders(xlEdgeLeft).Weight = etThick'四周用粗線 
.Borders(xlEdgeRight).Weight = etThick 
.Borders(xlEdgeTop).Weight = etThick 
.Borders(xlEdgeBottom).Weight = etThick 
End With 
End With 
Application.ScreenUpdating = True 
Exit Sub 
err: 
Application.ScreenUpdating = True 
MsgBox "您輸入的月份包括文本" & Chr(10) & "或者當前區域無法寫入", 65 
End Sub 
_______________________________________________________ 

   錄入代碼后返回工作表,通過以下步驟測試代碼的可行性: 
   (1)選擇單元格A1,然后按下快捷鍵【Alt+F8】打開“宏”對話框; 
   (2)如果工作簿中僅有一個宏,那么ET會自動選定“生成月歷”,否則手工選擇宏名“生成月歷”並單擊“執行”按鈕; 
   (3)此時程序將彈出圖2.7所示對話框,提示用戶輸入日期,其默認值當前月的月份; 
   (4)輸入字母“A”或者輸入數字13,那么程序會彈出圖2.8所示對話框。因為月份只能是1到12之間的數字; 
     
      圖2.7 提示錄入月份 
    
       圖2.8 錯誤提示 
   (5)如果直接單擊“確定“按鈕,那么當前工作表中B1開始的7列8行將產生圖2.9所示月歷: 
    
      圖2.9 月歷 
   在產生月歷前,需要確保當前單元格開始右下方7列8行無數據,如果該區域非空,則月歷會覆蓋該區域中的數據;同時還要確保該區域中不存在合並單元格,因月歷無法在合並單元格中錄入數組公式。 
   如果讀者認為以上限制太多,也可以變通地實現,突破這兩個限制。方法是在當前單元格右方插入新七個空白列。插入的代碼如下: 
   ActiveCell.Resize(1, 7).EntireColumn.Insert Shift:=xlToRight 
   其中EntireColumn代表整列,如果僅僅對7個單元格進行插入,那么也只能插入7個單元格;對7列進行插入,則會相應地插入7列。

第三節 Msgbox

(1) Msgbox的參數 
Msgbox的具體語法如下: 
MsgBox(prompt[, buttons] [, title] [, helpfile, context]) 
其中Prompt參數是必選參數,其作參數是可選數。各參數功能詳解如下表3-1所示: 
表3-1 Msgbox參數詳解

參數

描述

Prompt

字符串表達式,作為顯示在對話框中的消息。prompt 的最大長度大約為 1024 個字符,由所用字符的寬度決定

Buttons

指定顯示按鈕的數目及形式、使用的圖標樣式、缺省按鈕是什么以及消息框的強制回應等

Title

在對話框標題欄中顯示的字符串表達式。如果省略 title,則將應用程序名放在標題欄中

Helpfile

字符串表達式,識別用來向對話框提供上下文相關幫助的幫助文件

Context

數值表達式,由幫助文件的作者指定給適當的幫助主題的幫助上下文編號

其中最重要的是前兩個參數,第一個參數決定顯示的信息,不超1024個字符的文本;第二個參數決定圖標及按鈕。 
(2) Msgbox的按鈕與圖標 
Msgbox的第二參數可以有多種組合,實現不同的按鈕與圖標樣式。在表28-2羅列出了VBA中Msgbox提示的常數列表。 
表3-2 Msgbox圖標與按鈕常數詳解

常數

描述

vbOKOnly

0

只顯示 OK 按鈕

VbOKCancel

1

顯示 OK 及 Cancel 按鈕

VbAbortRetryIgnore  

2

顯示 Abort、Retry 及 Ignore 按鈕

VbYesNoCancel  

3

顯示 Yes、No 及 Cancel 按鈕

VbYesNo

4

顯示 Yes 及 No 按鈕

VbRetryCancel  

5

顯示 Retry 及 Cancel 按鈕

VbCritical

16

顯示 Critical Message 圖標

VbQuestion

32

顯示 Warning Query 圖標

VbExclamation  

48

顯示 Warning Message 圖標

VbInformation  

64

顯示 Information Message 圖標

vbDefaultButton1  

0

第一個按鈕是缺省值

vbDefaultButton2  

256

第二個按鈕是缺省值

vbDefaultButton3  

512

第三個按鈕是缺省值

vbDefaultButton4  

768

第四個按鈕是缺省值

vbApplicationModal  

0

應用程序強制返回;應用程序一直被掛起,直到用戶對消息框作出響應才繼續工作

vbSystemModal  

4096

系統強制返回;全部應用程序都被掛起,直到用戶對消息框作出響應才繼續工作

vbMsgBoxHelpButton  

16384

將Help按鈕添加到消息框

VbMsgBoxSetForeground  

65536

指定消息框窗口作為前景窗口

vbMsgBoxRight  

524288

文本為右對齊

vbMsgBoxRtlReading  

1048576

指定文本應為在希伯來和阿拉伯語系統中的從右到左顯示

以上表3-2中,實際包括四組信息,其中第一組值 (0–5) 描述了對話框中顯示的按鈕的類型與數目;第二組值(16, 32, 48, 64) 描述了圖標的樣式;第三組值 (0, 256, 512) 說明哪一個按鈕是默認值;而第四組值 (0, 4096) 則決定消息框的強制返回性。Msgbox的第二參數可以從四組中選擇值相加來任意設置信息框的顯示樣式。 
例如需要顯示一個兩行信息且帶一個OK按鈕的對話框,那么可以使用以下代碼: 
MsgBox "第一行" & Chr(10) & "第二行", vbOKOnly 
執行后效果如圖3.3所示。 
如果需要顯示一個確定按鈕與一個取消按鈕,且標題顯示為“提示”,那么可用以下代碼: 
MsgBox "現在開始執行?", vbOKCancel, "提示" 
執行后效果見圖3.4所示: 
    
圖3.3 兩行信息且帶一個OK按鈕 



圖3.4 一個確定按鈕與一個取消按鈕 
如果同樣是顯示圖3.4的效果,如果需要默認選中第二個,那么代碼可以修改如下: 
MsgBox "現在開始執行?", vbOKCancel + vbDefaultButton2, "提示" 
Msgbox的第二參數使用了“vbOKCancel + vbDefaultButton2”,即表示默認值為第二個按鈕,當用戶直接單擊回車鍵時是按下“取消”而非“確定”。效果圖3.5.3所示: 
如果在需要顯示“是”和“否”按鈕,再加入一個問號圖標,且使用數字來表示按鈕樣式,那么代碼如下: 
MsgBox "繼續執行下步?", 292, "繼續" 
代碼中292的計算方式是:4 + 32 + 256,其中4表示顯示“是”和“否”的按鈕,32代表顯示問號圖標,而256則表示默認默認按鈕為第二個。執行后效果見圖3.6所示: 

    

圖3.5 一個確定按鈕與一個取消按鈕默認第二個 

     圖3.6 兩個按鈕加問號圖標 
當然,根據表3-2所示的常數值還可以有很多種組合,讀者可以自行測試。 
(3) Msgbox的返回值 
Msgbox主要作用是顯示一些信息給終端用戶,然而對於程序開發者來說,更重要的一個功能是它具有返回值,且可以根據返回值決定下一步操作。 
Msgbox的返回值有7種,見表3-7所示: 
表3-7 Msgbox的返回值

常數

描述

vbOK

1

OK

vbCancel

2

Cancel

vbAbort

3

Abort

vbRetry

4

Retry

vbIgnore

5

Ignore

vbYes

6

Yes

vbNo

7

No

Msgbox的返回值對於開發者來說比較有用。例如用戶單擊“是”按鈕時,執行后續的操作,如果單擊“否”則直接退出程序。那么可以參考以下代碼: 
______________________________________________ 
Sub 工作表改名() 
'聲明變量,用代獲取Msgbox的返回值 
Dim msg As VbMsgBoxResult 
'獲取Msgbox返回值 
msg = MsgBox("將前表改名為今日期?", 292, "修改日期")'如果用戶單擊是 
IF msg = vbYes Then'執行改名 
ActiveSheet.Name = Date 
Else'否則退出程 
Exit Sub 
End IF 
'其它更多代碼............. 
End Sub 
_________________________________________ 

執行以上代碼時,將彈出圖3.8所示對信息框,如果用戶直接單擊回鍵,那么程序立即退出,不做任何回應;如果用戶單擊“是”按鈕,那么立即以當前日期命名工作表,見圖3.9所示。 


  
圖3.8 詢問執行方式 



        圖3.9選擇“是”按鈕則工作表改名 
在需用Msgbox函數返回值時,Msgbox的各參數必須使用括號,而不需要返回值時,這不是一個表達式,則不需要括號。以下兩種方式都是錯誤的Msgbox用法: 
MsgBox( "你好! ", 64, "提示") 
Result = MsgBox "你好! ", 64, "提示"

(4)Msgbox的限制 
總體來說,Msgbox具有三方面的限制。 
l字符數問題 
Msgbox有最大高度與寬度限制,而且只有在字符超過它的限制時才可以它體現出來。因為Msgbox具有自動縮放功能,當信息少時它會自動縮小信息框以適應字符的寬度,此時無法目視它的可用范圍。要測試Msgbox可顯示的最多字符數可以使用以下方式: 
(1)在[A1]單元格中存放超1000個英文字母,在[a2]單元格中存放超過1000個漢字; 
(2)在模塊中錄入以下語句: 
________________________________ 

Sub Msgbox測試() 
MsgBox [a1] 
MsgBox [a2] 
End Sub 
____________________________ 

執行以上代碼后,可以發現,英文字符可以顯示1024個左右,而純漢字只能顯示511個。如果英文與漢字共用,那么按一個漢字占用兩個英文寬度計算。 
如果需要顯示超過以上限制的字符信息,那么只能分屏顯示,當然這不是好辦法。通常采用窗體控件或者WScript技術來突破。 
l控制權問題 
Msgbox對話框總是擁有焦點,且擁有絕對的控制權。即只要Msgbox對話框不關閉,那么其它代碼都會停止運行,只有關閉對話框后才會交還控制權給程序,繼續執行其它語句。 
明白這一點很重要,如果程序在執行過程中需要顯示信息,例如當前執行進行,而且不能影響程序地繼續執行,那么Msgbox方式並非首選。建議使用狀態欄信息或者無模體的窗體。 
圖3.10即為利用狀態顯示進度來替換Msgbox的效果。 


圖3.10 狀態欄是示程序執行進度 
l時間性問題 
Msgbox的對話框顯示的對話框,如果用戶不手動關閉,它會永遠存在。如果用戶需要它在指定時間自動關閉,那么Msgbox也無法達成需求。 
通常采用三種方法來實現:用戶窗體、WScript技術和API,在后面將提進行演示。 
(5)突破Msgbox限制 
WScrip是一種腳本語言,它也可以實現輸出對話框信息,而且可以突破Msgbox的一些限制。 
利用腳本語言顯示信息可用WScript.Shell語言中的Popup方法。它的具體語法為: 
WshShell.Popup(strText, [natSecondsToWait], [strTitle], [natType]) = intButton 
其中第一參數是顯示的信息,第二參數是顯示的時間,表示信息框在多少秒鍾的自動關閉,第三參數是標題,第四參數是按鈕與圖標的狀態。 
WScript.Shell語言中的Popup方法相對於Msgbox有兩個優點: 
l可顯示的字符遠遠超過1024 
l可以自動關閉對話框(有某些軟件沖突) 
如果A1單元格的超過500個字符,那么可以使用以下語句顯示A1字符串的文本框: 
_________________________________________________ 

Sub 顯示A1信息() 
CreateObject("WScript.Shell").Popup [a1], , "提示", 64 
End Sub 
___________________________________________ 

以上代碼對字符1個到1000個、甚至3000、10000個都可以正常執行,不再有Msgbox的限制。 
如果需要信息顯示3秒鍾自動關閉,可以用以下代碼: 
__________________________________________________________ 
Sub 自動關閉() 
CreateObject("WScript.Shell").Popup "三秒鍾關閉", 3, "提示", 64 
End Sub 
___________________________________________________ 

但經過多次測試,以上語句的穩定性不是很好,有很多軟件的沖突,例如在Excel 2003中工作良好,在Excel 2007中卻無法自動關閉,在ET中也存在沖突。所以為了體現通用性和穩定性,可以改用API來完成這個難題,讓ET和Excel都可以順利實現3秒鍾關閉。 
API實現的方式如下: 
__________________________________________________________ 
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElaspe As Long, ByVal lpTimerFunc As Long) As Long 
Public Declare Function KillTimer Lib "user32" ( _ 
ByVal hWnd As Long, ByVal nIDEvent As Long) As Long 
Dim TID As Long 
Const Sec = 3'可以在這里修改時間 
Sub CloseTest(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long) 
Application.SendKeys "~", True '發送回符,即關閉窗口的命令 
KillTimer 0, TID 
End Sub 
Sub 三秒鍾自動關閉() 
TID = SetTimer(0, 0, Sec * 1000, AddressOf CloseTest) 
MsgBox Sec & "秒種自動關閉窗口", 65, "提示" 
End Sub 
___________________________________________________________ 

而利用窗體來實破Msgbox的所有限制則顯得簡單多了,在以后的章節會專門講述窗體與窗體控件的應用。 

第四節 Debug.Print

Debug.Print也可以實現信息輸出,不過通常開發人員使用。它只能在VBE中的立即窗口顯示信息,而終端用戶是不需要進入VBE界面查看任何信息的。 
Debug.Print表示在立即窗口中顯示文本,其具體語法為: 
Debug.Print [outputlist] 
它的功能是將信息輸出到立即窗口,通常是開發者調試代碼時使用。其中參數outputlist 可選的。要打印的表達式或表達式的列表。如果省略,則打印一空白行。 
outputlist 參數也具有它自己的語法: 
{Spc(n) | Tab(n)} expression charpos 
各參數含義見表30-1所示 
30-1 outputlist 參數詳解

參數

含義

Spc(n)

可選的。用來在輸出中插入空白字符,這里,n 為要插入的空白字符數。

Tab(n)

可選的。用來將插入點定位在絕對列號上,這里,n 為列號。使用無參數的 Tab(n) 將插入點定位在下一個打印區的起始位置。

expression

可選。要打印的數值表達式或字符串表達式。

charpos

可選。指定下個字符的插入點。使用分號 (;) 直接將插入點定位在上一個被顯示的字符之后。使用 Tab(n) 將插入點定位在絕對列號上。使用無參數的 Tab 將插入點定位在下一個打印區的起始位置。如果省略 charpos,則在下一行打印下一字符。

通過以下代碼可以更好地理解其它參數含義: 
___________________________________________ 

Sub test() 
Debug.Print "A" 
Debug.Print 
Debug.Print Spc(10) 
Debug.Print "B" 
End Sub 
____________________________________________ 

執行以上代碼后,將在立即窗口產生四行字符,其中第二行是空行,第三行為10個空格。見圖30.1所示: 


圖30.1 Debug.Print演示 
再如,程序中要求打開當前工作簿路徑下的“VBA教學.xls”文件,在打開文件前調試程序時,程序員需要查看一下路徑是否存在或者查看路徑所在磁盤名,那么可以通過“Debug.Print”方式將信息顯示在窗口。代碼如下: 
___________________________________________ 
Sub 打開當前工作簿同路徑下的文件() 
Dim Paths As String'聲明變量 
Paths = ActiveWorkbook.Path'獲取路徑 
Debug.Print Paths'查看路徑 
Workbooks.Open Filename:=Paths & "VBA教學.xls"'打開工作簿 
End Sub 
__________________________________________ 
執行以上代碼后,在立即窗口中將產生路徑,見圖30.2所示。 

圖30.2 在立窗口顯示信息

第五節  條件語句

條件語句主要包括以下五種: 
IIF 
IF…Then… 
IF…Then…End IF 
Select Case…End Select 
Choose 
本節以及以后的章節中將陸續講述以上五種條件語句的語法及應用。本節的重點是IIF函數的語法。 
IIF函數是VBA中類似於工作表IF的條件函數,它基於條件返回不同的值。下面展示它的參數及用法。 
(1)IIF的語法 
IIF函數可以根據表達式的值,來返回兩部分中的其中一個。它的基本語法為: 
IIF(expr, truepart, falsepart) 
IIF的三個參數均為必選參數,各參數的含義見表33-1所示: 
表33-1 IIF的參數詳解

部分

描述

expr

用來判斷真偽的表達式

truepart

如果 expr 為 True,則返回本參數的值或表達式

falsepart

如果 expr 為 False,則返回本參數的值或表達式

如果需要表達大於等於60分時返回“及格”否則返回“不及格”,那么可用以下語句: 
IIF([a1] >= 60, "及格", "不及格") 
如果第二、三條件的字符較長,且不同的字符較少,為了縮短代碼,也可以改用以下方式: 
"A1的成績" & IIF([a1] >= 60, "", "不") & "及格" 
即把相同部分置於IIF語句之外,用IIF的第二、三參數來決定不同的部分。 
再如A1大於B1時,則返回C1的值,否則返回C1值的50%,那么可用以下語句: 
IIF([a1] > [b1], [c1], [c1] / 2) 
也可以改用以下方式,將C1置於IIF語句之外,代碼如下: 
[C1] / IIF([a1] > [b1], 1, 2)

(2)根據錄入的月份判斷其季度 
利用錄入框讓用戶錄入月份,默認為當前月,並根據月份判斷其季度。代碼如下: 
____________________________________________________ 

Sub 根據月份判斷季度() 
Dim Months As Byte'聲明變量 
Star:'設置一個標簽 
'彈出對話框讓用戶錄入月份,默認為當前月份 
Months = InputBox("請輸入月份,只能是數字", "月份", Month(Date) * 1) 
'如果錄入的數值小於1或者大於12則返回標簽Star處繼續執行 
If Months < 1 Or Months > 12 Then MsgBox "只能在1到12之間": GoTo Star 
'四個IIF嵌套運用,其中每個IIF的第一參數使用雙條件,在雙條件時需要用And連接 
MsgBox IIf(Months > 1 And Months < 4, "一季度", IIf(Months > 3 And Months < 7, "二季度", IIf(Months > 6 _ 
And Months < 10, "三季度", IIf(Months > 9 And Months < 1, "四季度", "錄入錯誤")))) 
End Sub 
____________________________________________________ 

本例中使用VBA中的IF語句配合Or運算符檢查錄入數值是否在1到12之間,如果不在該范圍則提示,且返回“Satr”標簽處,讓用戶重新輸入數值,直到符合條件完止。 
在過程中,使用了四個IIF函數嵌套,且四個IIF函數的第一個條件都包括兩個參數,利用And進行連接。 
在執行程序時,將彈出一個錄入數字的對話框,其默認值為當前月份,見圖34.1所示。如果此時錄入0或者13將會提示“只能輸入1到12間”,且再次返回月份錄入對話框等待用戶錄入正確的數字。當輸入數字9后,返回結果見圖34.2所示。 
  

圖34.1 月份錄入框              

圖34.2 根據月份判斷季度 
(3)多條件計算獎金 
某公司對業務員的獎金計算方式為:業績高於12萬,其利潤比例在15%以上者獎金為2000元;業績高於8萬、利潤12%以上但勞當選為勞模者也可以獎金2000元,其他人獎金1000元。 
利用VBA對圖10.29所示業務員計算獎金之代碼如下: 

____________________________________________________ 

Sub 計算獎金() 
Dim i As Byte'從2開始至最后一行個非空行結束 
For i = 2 To WorksheetFunction.CountA([B:B])'根據要求設置條件 
Cells(i, "E") = IIF((Cells(i, "B") > 12 And Cells(i, "C") > 0.15) Or ((Cells(i, "B") > 8 _ 
And Cells(i, "C") > 0.12) And Cells(i, "D") = "是"), 2000, 1000) 
Next i 
End Sub 

____________________________________________________ 

該過程中And運算符與Or運算符合用,顯得較復雜,但可以順利地完成需求。讀者需要將代碼與題目要求進行詳細的對比,理解代碼的設計思路。 

圖34.3 獎金計算表 
(4)IIF函數的限制 
IIF是一個函數,與工作表函數IF極其相似。但是在使用上,相對於IF函數卻不夠靈活,主要體現在以下方面。 
l第三參數是否必選參數 
IIF的第三參數是必須參數,而IF函數的第三參數是可選參數。 
例如工作表中可以使用以下公式,僅僅聲明滿足條件時的反回值: 
=IF(A1>=60,"及格") 
但是使用IIF時必須使用第三參數,否則將產生編譯錯誤。 
l是否檢驗第三參數 
當第一參數——條件為True時,IF函數可以忽略第三參數;而IIF函數則會同時樣檢驗第三參數的值,如果第三參數存在錯誤值則程序會中斷。例如以下語句: 
IIF([a1] > [b1], [b1] / [a1], [a1] / [b1]) 

當單元格a1大於0且b1為0時,程序會產生編譯錯誤。因為IIF的特點是條件成立仍然檢測第三數;如果使用工作表函數IF,則不會產生任何錯誤。 
l錯誤方式 
當IF函數計算結果為錯誤值時,它會在單元格中產生對應的值,不影響其它單元格中的公式;而IIF的第三參數中假設使用了零做除數,那么整個過程都會中斷,並提示錯誤信息。 
雖然IF較IIF更好用,但是在VBA中不能調用工作表函數IF,只能調用IFError或者Iferr等等函數。

(5)And運算符與Or運算符 
當IIF函數使用多條件時,必須借助And運算符與Or運算符來連接其條件。 
如果需要同時滿足多條件時,可使用And運算符。And運算符的主要作用是對兩個表達式進行邏輯連接。表達式如下: 
result = expression1 And expression2 
其中result與expression1、expression2之間的關系見表33-2所示: 
表33-2 And運算符參數與結果之關系

如果   expression1 為

且   expression2 為

則   result 為

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

TRUE

Null

Null

FALSE

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE

Null

FALSE

Null

TRUE

Null

Null

FALSE

FALSE

Null

Null

Null

如果有三個條件可以采用以下表達式: 
result = expression1 And expression2 And expression3 
如果某行業招聘時要求體重在50到65公斤之間合格,否則不合格,那么VBA表達方式如下: 
Msgbox IIF([a1] > 50 And [a1] < 65, "合格", "不合格") 
如果需要多條件中滿足條件之一即可返回指定值,那么可以使用Or運算符,其主要作用是對兩個表達式進行邏輯析取運算。其表達式如下: 
result = expression1 And expression2 
其中result與expression1、expression2之間的關系見表33-3所示: 
表33-3  Or運算符參數與結果之關系

部分

描述

result

必需的;任何數值變量

expression1  

必需的;任何表達式  

expression2  

必需的;任何表達式  

如果成績小於1或者大於100則提示“錄入錯誤”,否則返回空值,那么VBA表達方式如下: 
MsgBox IIF([a1] > 100 Or [a1] < 1, "錄入錯誤", "") 
IIF函數也可以嵌套使用,即一句代碼中使用多個IIF,根據兩個以上的條件返回對應的值,而且每個條件參數也可以借用And或者Or運算符來連接。 
當And和Or共用一個參數的時候,盡量采用括號來體現優先順序。例如 
(expression1 And expression2) Or (expression3 And expression4)

6、IF語句是VBA中極為常見的條件語句,用於程序中進行判斷,根據條件執行不同的語句.它和工作表函數IF有大大區別,不要混為一談. 
  IF語句主要有三種句式: 
  1.If …Then… 
  2.IF…Then…Else… 
  3.IF...then 

  … 
  Else 

  …. 
  End if 
  本篇重要講解IF…Then…的語法及案例。 
  “IF…Then…”即如果滿足條件則執行指定的語句或者一組語句。如果有多句代碼需要利用冒號進行連接。不是函數,而是根據表達式的值有條件地執行一組語句。它的語法如下: 
  IF condition Then [statements] 
  兩個參數均為必選參數,缺一不可。其中條件語句必須是數值表達式或字符串表達式,其運算結果為True或False。如果condition 為Null時,則VBA將其視為 False。 
  例如:變量A大於60,則變量B等於“及格”,其表達式為: 
  IF A > 60 Then B = "及格" 
  如果A1單元格字符數超過3個,那么將A1單元格字符加粗再傾斜,表達式如下: 
  IF Len([a1]) >= 3 Then Range("a1").Font.Bold = True: Range("a1").Font.Italic = True 
  IF… Then…語句句式的條件語句與IIF函數中的條件一樣也可以使用And和Or運算符來連接多個條件。And與Or運算方參見前一篇文章中的介紹。 
  現通過幾個案例展示IF…Then…句式的用法,讓讀者對它有進一步的認識。 
(1)禁止11點以前保存工作簿 

  工作簿中有很多工作表,禁止用戶打印工作表以外的任何工作表數據,實現步驟如下: 
  (i)按下快捷鍵【Alt+F11】進入VBE界面; 
  (ii)如果未顯示工程資源管理器,則使用快捷鍵【Ctrl+G】顯示工程資源管理器。然后雙擊ThisWorkbook進入工作簿事件代碼窗口; 
  (iii)在窗口中錄入以下事件過程代碼: 
______________________________________________

Private Sub workbook_BeforeSave(ByVal bSaveAsUI As Boolean, Cancel As Boolean) 
If Hour(Now) <= 10 Then MsgBox "禁止保存": Cancel = True 
End Sub 
_______________________________________________________

  (iv)返回工作表界面,如果當前時間小於11點,那么單擊“保存”按鈕時將彈出以下對話框,同時禁止保存工作簿。 

   

  圖35.1禁止11點以前保存工作簿 
  在該事件過程中,“Cancel”參數用於工作簿是否可以保存,如果賦值為True則禁止保存。 
  在本例的條件語句中,符合條件時需要執行兩句代碼,包括提示及禁止保存,那么兩句代碼之間必須使用冒號分隔,且必須寫在同一行中。 
(2)僅僅允許8到18點可以打開當前工作簿 
  某工作簿僅僅允許在早8:00至下午18:00之間可以開啟,其它時間開啟后則自動關閉。實同步驟如下: 
  (i)按下快捷鍵【Alt+F11】進入VBE界面; 
  (ii)如果未顯示工程資源管理器,則使用快捷鍵【Ctrl+G】顯示工程資源管理器。然后雙擊ThisWorkbook進入工作簿事件代碼窗口; 
  (iii)在窗口中輸入以下工作簿打開事件代碼: 

______

'聲明工作簿開啟事件 
Private Sub Workbook_Open() 
'如果現在的小時數大於等於8,而且小於等於18則退出程序 
If Hour(Now) >= 8 And Hour(Now) <= 18 Then Exit Sub 
'退出Excel程序 
Application.Quit 
End Sub 
_________________________________________________________

  (iv)保存工作簿后再重新開啟,如果當前時間小於8點鍾或者大於18點鍾,那么工作簿會自動關閉。 
  在該過程中,IF條件語句中有兩個條件,只要滿足條件之一即退出程序,所以借用And運算符來連接條件。也可以改用Or運算符,那么重編代碼如下: 

______________________________________________

'聲明工作簿開啟事件 
Private Sub Workbook_Open() 
'如果現在的小時數大於等於8,而且小於等於18則退出Excel程序 
IF Hour(Now) < 8 or Hour(Now) > 18 Then Application.Quit 
End Sub 
___________________________________________________________


  在本過程中,與前一個過程可以實現完全相同的功能,只不過對於條件的處理方式不同。

(3)判斷單元格首字符是數值、字母還是漢字 
  根據要求需要進行三次判斷,那么本例需要使用三次IF。其代碼如下: 

_________________________________________________________
Sub 判斷() 
If [a1] Like "[a-zA-Z]" Then MsgBox "字母"
If Left([a1], 1) Like "[0-9]" Then MsgBox "數字"
If [a1] Like "[一-龥]" Then MsgBox "漢字" 
End Sub 
__________________________________________________

  其中Like用來判斷字符串是字母、數字還是漢字本最有效率,在對首字符進行數值判斷時需要利用left限制。

(4)IF…Then…Else…語句有兩種用法,包括條件與滿足條件時的執行語句在同一行及條件與滿足條件時的執行語句在不同行兩種方式,它們的語法分別介紹如下: 
  同行時語法: 
IF condition Then [statements][Else elsestatements] 
  其中滿足條件時執的語句statements和不滿足條件時執行的語句elsestatements都是可選項,不需要“End if”結束。 
  不同行時語法: 
IF Condition Then 

[statements] 
[Else 

[elsestatements]] 
End IF 
  條件與執行語句不同行時必須以“End IF”結束條件語句,而“Else”則是可選項。 
  從語法上看,條件及執行語句同行與不同行沒大多分別,僅僅寫法不同。然而實際工作中,不同行的條件語句會占有一些優勢,特別是條件有多個或者執行的語句有多句時。 
(1)實例:多條件計算獎金 
  例如據圖36.1所示的數據計算提金額,條件為業績大於12萬且利潤比例大於15%時提成金額為2000元,否則為1000元。 
   
  圖36.1 業績表 
  完成本題需求有兩種解法,其代碼如下:

___________________________________________________


Sub 計算獎金1() '同行 
Dim i As Byte'從2開始至最后一行個非空行結束 
For i = 2 To WorksheetFunction.CountA([B:B])'根據要求設置條件:如果滿足條件,提成2000,否則提成1000 
IF (Cells(i, "B") > 12 And Cells(i, "C") > 0.15) Then Cells(i, "D") = 2000 Else Cells(i, "D") = 1000 
Next i 
End Sub

___________________________________________________

Sub 計算獎金2() '不同行 
Dim i As Byte

'從2開始至最后一行個非空行結束 
For i = 2 To WorksheetFunction.CountA([B:B]) 
'如果滿足條件,那么 
IF (Cells(i, "B") > 12 And Cells(i, "C") > 0.15) Then
Cells(i, "D") = 2000 '獎金為200 
Else'否則 
Cells(i, "D") = 1000'否則獎金為1000 
End IF '結束條件語句 
Next i 
End Sub

___________________________________________________

  兩個過程的執行結果完全一致,但在代碼閱讀和理解上前一個過程更方便,也顯得更簡潔。然而在執行語句較多時,多行句式會占有優勢。 
  再如,單元格A1的值大於60時,將A1的字體加粗傾斜,並添加紅色背景。也有兩種解法,見圖36.2所示: 

   
  圖36.2 兩種條件語句寫法的比較 
  從圖36.2進行比較,可以看到當有多行語句時,將IF…Then…Else…條件語句寫為多行會顯示更有條理性和層次感。

第六節 數據類型轉換

VBA數據類型轉換函數 VBA時間函數 vba字符串函數

CBool(expression)       轉換為Boolean型

CByte(expression)       轉換為Byte型

CCur(expression)        轉換為Currency型

CDate(expression)       轉換為Date型

CDbl(expression)        轉換為Double型

CDec(expression)        轉換為Decemal型

CInt(expression)        轉換為Integer型

CLng(expression)        轉換為Long型

CSng(expression)        轉換為Single型

CStr(expression)        轉換為String型

CVar(expression)        轉換為Variant型

Val(string)             轉換為數據型

Str(number)             轉換為String

 Now         返回一個 Variant (Date),根據計算機系統設置的日期和時間來指定日期和時間。

Date        返回包含系統日期的 Variant (Date)。

Time        返回一個指明當前系統時間的 Variant (Date)。

Timer       返回一個 Single,代表從午夜開始到現在經過的秒數。

TimeSerial(hour, minute, second) 返回一個 Variant (Date),包含具有具體時、分、秒的時間。

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant (Long) 的值,表示兩個指定日期間的時間間隔數目

Second(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數,表示一分鍾之中的某個秒

Minute(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數,表示一小時中的某分鍾

Hour(time)  返回一個 Variant (Integer),其值為 0 到 23 之間的整數,表示一天之中的某一鍾點

Day(date)   返回一個 Variant (Integer),其值為 1 到 31 之間的整數,表示一個月中的某一日

Month(date) 返回一個 Variant (Integer),其值為 1 到 12 之間的整數,表示一年中的某月

Year(date) 返回 Variant (Integer),包含表示年份的整數。

Weekday(date, [firstdayofweek]) 返回一個 Variant (Integer),包含一個整數,代表某個日期是星期幾

 

Trim(string)            去掉string左右兩端空白

Ltrim(string)           去掉string左端空白

Rtrim(string)           去掉string右端空白

Len(string)             計算string長度

Left(string, x)         取string左段x個字符組成的字符串

Right(string, x)        取string右段x個字符組成的字符串

Mid(string, start,x)    取string從start位開始的x個字符組成的字符串

Ucase(string)           轉換為大寫

Lcase(string)           轉換為小寫

Space(x)                返回x個空白的字符串

Asc(string)             返回一個 integer,代表字符串中首字母的字符代碼

Chr(charcode)           返回 string,其中包含有與指定的字符代碼相關的字符

第三章 VAB excel 語句集300句

定制模塊行為

(1) Option Explicit '強制對模塊內所有變量進行聲明

Option Private Module '標記模塊為私有,僅對同一工程中其它模塊有用,在宏對話框中不顯示

Option Compare Text '字符串不區分大小寫

Option Base 1 '指定數組的第一個下標為1

(2) On Error Resume Next '忽略錯誤繼續執行VBA代碼,避免出現錯誤消息

(3) On Error GoTo ErrorHandler '當錯誤發生時跳轉到過程中的某個位置

(4) On Error GoTo 0 '恢復正常的錯誤提示

(5) Application.DisplayAlerts=False '在程序執行過程中使出現的警告框不顯示

(6) Application.ScreenUpdating=False '關閉屏幕刷新

Application.ScreenUpdating=True '打開屏幕刷新

(7) Application.Enable.CancelKey=xlDisabled '禁用Ctrl+Break中止宏運行的功能

工作簿

(8) Workbooks.Add() '創建一個新的工作簿

(9) Workbooks(“book1.xls”).Activate '激活名為book1的工作簿

(10) ThisWorkbook.Save '保存工作簿

(11) ThisWorkbook.close '關閉當前工作簿

(12) ActiveWorkbook.Sheets.Count '獲取活動工作薄中工作表數

(13) ActiveWorkbook.name '返回活動工作薄的名稱

(14) ThisWorkbook.Name ‘返回當前工作簿名稱

ThisWorkbook.FullName ‘返回當前工作簿路徑和名稱

(15) ActiveWindow.EnableResize=False ‘禁止調整活動工作簿的大小

(16) Application.Window.Arrange xlArrangeStyleTiled ‘將工作簿以平鋪方式排列

(17) ActiveWorkbook.WindowState=xlMaximized ‘將當前工作簿最大化

工作表

(18) ActiveSheet.UsedRange.Rows.Count ‘當前工作表中已使用的行數

(19) Rows.Count ‘獲取工作表的行數(注:考慮向前兼容性)

(20) Sheets(Sheet1).Name= “Sum” '將Sheet1命名為Sum

(21) ThisWorkbook.Sheets.Add Before:=Worksheets(1) '添加一個新工作表在第一工作表前

(22) ActiveSheet.Move After:=ActiveWorkbook. _

Sheets(ActiveWorkbook.Sheets.Count) '將當前工作表移至工作表的最后

(23) Worksheets(Array(“sheet1”,”sheet2”)).Select '同時選擇工作表1和工作表2

(24) Sheets(“sheet1”).Delete或 Sheets(1).Delete '刪除工作表1

(25) ActiveWorkbook.Sheets(i).Name '獲取工作表i的名稱

(26) ActiveWindow.DisplayGridlines=Not ActiveWindow.DisplayGridlines '切換工作表中的網格線顯示,這種方法也可以用在其它方面進行相互切換,即相當於開關按鈕

(27) ActiveWindow.DisplayHeadings=Not ActiveWindow.DisplayHeadings ‘切換工作表中的行列邊框顯示

(28) ActiveSheet.UsedRange.FormatConditions.Delete ‘刪除當前工作表中所有的條件格式

(29) Cells.Hyperlinks.Delete ‘取消當前工作表所有超鏈接

(30) ActiveSheet.PageSetup.Orientation=xlLandscape

或ActiveSheet.PageSetup.Orientation=2 '將頁面設置更改為橫向

(31) ActiveSheet.PageSetup.RightFooter=ActiveWorkbook.FullName ‘在頁面設置的表尾中輸入文件路徑

ActiveSheet.PageSetup.LeftFooter=Application.UserName ‘將用戶名放置在活動工作表的頁腳

單元格/單元格區域

(32) ActiveCell.CurrentRegion.Select

或Range(ActiveCell.End(xlUp),ActiveCell.End(xlDown)).Select

'選擇當前活動單元格所包含的范圍,上下左右無空行

(33) Cells.Select ‘選定當前工作表的所有單元格

(34) Range(“A1”).ClearContents '清除活動工作表上單元格A1中的內容

Selection.ClearContents '清除選定區域內容

Range(“A1:D4”).Clear '徹底清除A1至D4單元格區域的內容,包括格式

(35) Cells.Clear '清除工作表中所有單元格的內容

(36) ActiveCell.Offset(1,0).Select '活動單元格下移一行,同理,可下移一列

(37) Range(“A1”).Offset(ColumnOffset:=1)或Range(“A1”).Offset(,1) ‘偏移一列

Range(“A1”).Offset(Rowoffset:=-1)或Range(“A1”).Offset(-1) ‘向上偏移一行

(38) Range(“A1”).Copy Range(“B1”) '復制單元格A1,粘貼到單元格B1中

Range(“A1:D8”).Copy Range(“F1”) '將單元格區域復制到單元格F1開始的區域中

Range(“A1:D8”).Cut Range(“F1”) '剪切單元格區域A1至D8,復制到單元格F1開始的區域中

Range(“A1”).CurrentRegion.Copy Sheets(“Sheet2”).Range(“A1”) '復制包含A1的單元格區域到工作表2中以A1起始的單元格區域中

注:CurrentRegion屬性等價於定位命令,由一個矩形單元格塊組成,周圍是一個或多個空行或列

(39) ActiveWindow.RangeSelection.Value=XX '將值XX輸入到所選單元格區域中

(40) ActiveWindow.RangeSelection.Count '活動窗口中選擇的單元格數

(41) Selection.Count '當前選中區域的單元格數

(42) GetAddress=Replace(Hyperlinkcell.Hyperlinks(1).Address,mailto:,””) ‘返回單元格中超級鏈接的地址並賦值

(43) TextColor=Range(“A1”).Font.ColorIndex ‘檢查單元格A1的文本顏色並返回顏色索引

Range(“A1”).Interior.ColorIndex ‘獲取單元格A1背景色

(44) cells.count ‘返回當前工作表的單元格數

(45) Selection.Range(“E4”).Select ‘激活當前活動單元格下方3行,向右4列的單元格

(46) Cells.Item(5,”C”) ‘引單元格C5

Cells.Item(5,3) ‘引單元格C5

(47) Range(“A1”).Offset(RowOffset:=4,ColumnOffset:=5)

或 Range(“A1”).Offset(4,5) ‘指定單元格F5

(48) Range(“B3”).Resize(RowSize:=11,ColumnSize:=3)

Rnage(“B3”).Resize(11,3) ‘創建B3:D13區域

(49) Range(“Data”).Resize(,2) ‘將Data區域擴充2列

(50) Union(Range(“Data1”),Range(“Data2”)) ‘將Data1和Data2區域連接

(51) Intersect(Range(“Data1”),Range(“Data2”)) ‘返回Data1和Data2區域的交叉區域

(52) Range(“Data”).Count ‘單元格區域Data中的單元格數

Range(“Data”). Columns.Count ‘單元格區域Data中的列數

Range(“Data”). Rows.Count ‘單元格區域Data中的行數

(53) Selection.Columns.Count ‘當前選中的單元格區域中的列數

Selection.Rows.Count ‘當前選中的單元格區域中的行數

(54) Selection.Areas.Count ‘選中的單元格區域所包含的區域數

(55) ActiveSheet.UsedRange.Row ‘獲取單元格區域中使用的第一行的行號

(56) Rng.Column ‘獲取單元格區域Rng左上角單元格所在列編號

(57) ActiveSheet.Cells.SpecialCells(xlCellTypeAllFormatConditions) ‘在活動工作表中返回所有符合條件格式設置的區域

(58) Range(“A1”).AutoFilter Field:=3,VisibleDropDown:=False ‘關閉由於執行自動篩選命令產生的第3個字段的下拉列表

名稱

(59) Range(“A1:C3”).Name=“computer” ‘命名A1:C3區域為computer

或Range(“D1:E6”).Name=“Sheet1!book” ‘命名局部變量,即Sheet1上區域D1:E6為book

或 Names(“computer”).Name=“robot” ‘將區域computer重命名為robot

(60) Names(“book”).Delete ‘刪除名稱

(61) Names.Add Name:=“ContentList”,_

RefersTo:=“=OFFSET(Sheet1!A2,0,0,COUNTA(Sheet2!$A:$A))” ‘動態命名列

(62) Names.Add Name:=“Company”,RefersTo:=“CompanyCar” ‘命名字符串CompanyCar

(63) Names.Add Name:=“Total”,RefersTo:=123456 ‘將數字123456命名為Total。注意數字不能加引號,否則就是命名字符串了。

(64) Names.Add Name:=“MyArray”,RefersTo:=ArrayNum ‘將數組ArrayNum命名為MyArray。

(65) Names.Add Name:=“ProduceNum”,RefersTo:=“=$B$1”,Visible:=False ‘將名稱隱藏

(66) ActiveWorkbook.Names(“Com”).Name ‘返回名稱字符串

公式與函數

(67) Application.WorksheetFunction.IsNumber(“A1”) '使用工作表函數檢查A1單元格中的數據是否為數字

(68) Range(“A:A”).Find(Application.WorksheetFunction.Max(Range(“A:A”))).Activate

'激活單元格區域A列中最大值的單元格

(69) Cells(8,8).FormulaArray=“=SUM(R2C[-1]:R[-1]C[-1]*R2C:R[-1]C)” ‘在單元格中輸入數組公式。注意必須使用R1C1樣式的表達式

圖表

(70) ActiveSheet.ChartObjects.Count '獲取當前工作表中圖表的個數

(71) ActiveSheet.ChartObjects(“Chart1”).Select ‘選中當前工作表中圖表Chart1

(72) ActiveSheet.ChartObjects(“Chart1”).Activate

ActiveChart.ChartArea.Select ‘選中當前圖表區域

(73) WorkSheets(“Sheet1”).ChartObjects(“Chart2”).Chart. _

ChartArea.Interior.ColorIndex=2 ‘更改工作表中圖表的圖表區的顏色

(74) Sheets(“Chart2”).ChartArea.Interior.ColorIndex=2 ‘更改圖表工作表中圖表區的顏色

(75) Charts.Add ‘添加新的圖表工作表

(76) ActiveChart.SetSourceData Source:=Sheets(“Sheet1”).Range(“A1:D5”), _

PlotBy:=xlColumns ‘指定圖表數據源並按列排列

(77) ActiveChart.Location Where:=xlLocationAsNewSheet ‘新圖表作為新圖表工作表

(78) ActiveChart.PlotArea.Interior.ColorIndex=xlNone ‘將繪圖區顏色變為白色

(79) WorkSheets(“Sheet1”).ChartObjects(1).Chart. _

Export FileName:=“C:MyChart.gif”,FilterName:=“GIF” ‘將圖表1導出到C盤上並命名為MyChart.gif

窗體

(80) MsgBox “Hello!” '消息框中顯示消息Hello

(81) Ans=MsgBox(“Continue?”,vbYesNo) '在消息框中點擊“是”按鈕,則Ans值為vbYes;點擊“否”按鈕,則Ans值為vbNo。

If MsgBox(“Continue?”,vbYesNo)<>vbYes Then Exit Sub '返回值不為“是”,則退出

(82) Config=vbYesNo+vbQuestion+vbDefaultButton2 '使用常量的組合,賦值組Config變量,並設置第二個按鈕為缺省按鈕

(83) MsgBox “This is the first line.” & vbNewLine & “Second line.” '在消息框中強制換行,可用vbCrLf代替vbNewLine。

(84) MsgBox "the average is :"&Format(Application.WorksheetFunction.Average(Selection),"#,##0.00"),vbInformation, "selection count average" & Chr(13) '應用工作表函數返回所選區域的平均值並按指定格式顯示

(85) Userform1.Show ‘顯示用戶窗體

(86) Load Userform1 ‘加載一個用戶窗體,但該窗體處於隱藏狀態

(87) Userform1.Hide ‘隱藏用戶窗體

(88) Unload Userform1 或 Unload Me ‘卸載用戶窗體

(89) (圖像控件).Picture=LoadPicture(“圖像路徑”) ‘在用戶窗體中顯示圖形

(90) UserForm1.Show 0 或 UserForm1.Show vbModeless ‘將窗體設置為無模式狀態

(91) Me.Height=Int(0.88*ActiveWindow.Height) ‘窗體高度為當前活動窗口高度的0.88

Me.Width=Int(0.88*ActiveWindow.Width) ‘窗體寬度為當前活動窗口高度的0.88

事件

(92) Application.EnableEvents=False '禁用所有事件

Application.EnableEvents=True '啟用所有事件

注:不適用於用戶窗體控件觸發的事件

對象

(93) Set ExcelSheet = CreateObject("Excel.Sheet") ‘創建一個Excel工作表對象

ExcelSheet.Application.Visible = True '設置 Application 對象使 Excel 可見

ExcelSheet.Application.Cells(1, 1).Value = "Data" '在表格的第一個單元中輸入文本

ExcelSheet.SaveAs "C:\TEST.XLS" '將該表格保存到C:\test.xls 目錄

ExcelSheet.Application.Quit '關閉 Excel

Set ExcelSheet = Nothing '釋放該對象變量

(94) ‘聲明並創建一個Excel對象引用

Dim xlApp As Excel.Application

Dim xlBook As Excel.Workbook

Dim xlSheet As Excel.WorkSheet

Set xlApp = CreateObject("Excel.Application")

Set xlBook = xlApp.Workbooks.Add

Set xlSheet = xlBook.Worksheets(1)

(95) ‘創建並傳遞一個 Excel.Application 對象的引用

Call MySub (CreateObject("Excel.Application"))

(96) Set d = CreateObject(Scripting.Dictionary) ‘創建一個 Dictionary 對象變量

(97) d.Add "a", "Athens" '為對象變量添加關鍵字和條目

其他

(98) Application.OnKey “^I”,”macro” '設置Ctrl+I鍵為macro過程的快捷鍵

(99) Application.CutCopyMode=False ‘退出剪切/復制模式

(100) Application.Volatile True '無論何時工作表中任意單元格重新計算,都會強制計算該函數

Application.Volatile False '只有在該函數的一個或多個參數發生改變時,才會重新計算該函數

定制模塊行為

(101) Err.Clear ‘清除程序運行過程中所有的錯誤

*******************************************************

工作簿

(102) ThisWorkbook.BuiltinDocumentProperties(“Last Save Time”)

或Application.Caller.Parent.Parent.BuiltinDocumentProperties(“Last Save Time”) ‘返回上次保存工作簿的日期和時間

(103) ThisWorkbook.BuiltinDocumentProperties("Last Print Date")

或Application.Caller.Parent.Parent.BuiltinDocumentProperties(“Last Print Date”) ‘返回上次打印或預覽工作簿的日期和時間

(104) Workbooks.Close ‘關閉所有打開的工作簿

(105) ActiveWorkbook.LinkSources(xlExcelLinks)(1) ‘返回當前工作簿中的第一條鏈接

(106) ActiveWorkbook.CodeName

ThisWorkbook.CodeName ‘返回工作簿代碼的名稱

(107) ActiveWorkbook.FileFormat

ThisWorkbook.FileFormat ‘返回當前工作簿文件格式代碼

(108) ThisWorkbook.Path

ActiveWorkbook.Path ‘返回當前工作簿的路徑(注:若工作簿未保存,則為空)

(109) ThisWorkbook.ReadOnly

ActiveWorkbook.ReadOnly ‘返回當前工作簿的讀/寫值(為False)

(110) ThisWorkbook.Saved

ActiveWorkbook.Saved ‘返回工作簿的存儲值(若已保存則為False)

(111) Application.Visible = False ‘隱藏工作簿

Application.Visible = True ‘顯示工作簿

注:可與用戶窗體配合使用,即在打開工作簿時將工作簿隱藏,只顯示用戶窗體.可設置控制按鈕控制工作簿可見

*******************************************************

工作表

(112) ActiveSheet.Columns("B").Insert ‘在A列右側插入列,即插入B列

ActiveSheet.Columns("E").Cut

ActiveSheet.Columns("B").Insert ‘以上兩句將E列數據移至B列,原B列及以后的數據相應后移

ActiveSheet.Columns("B").Cut

ActiveSheet.Columns("E").Insert ‘以上兩句將B列數據移至D列,原C列和D列數據相應左移一列

(113) ActiveSheet.Calculate ‘計算當前工作表

(114) ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetHidden ‘正常隱藏工作表,同在Excel菜單中選擇“格式——工作表——隱藏”操作一樣

ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetVeryHidden ‘隱藏工作表,不能通過在Excel菜單中選擇“格式——工作表——取消隱藏”來重新顯示工作表

ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetVisible ‘顯示被隱藏的工作表

(115) ThisWorkbook.Sheets(1).ProtectContents ‘檢查工作表是否受到保護

(116) ThisWorkbook.Worksheets.Add Count:=2, _

Before:=ThisWorkbook.Worksheets(2)

或 ThisWorkbook.Workshees.Add ThisWorkbook.Worksheets(2), , 2 ‘在第二個工作表之前添加兩個新的工作表

(117) ThisWorkbook.Worksheets(3).Copy ‘復制一個工作表到新的工作簿

(118) ThisWorkbook.Worksheets(3).Copy ThisWorkbook.Worksheets(2) ‘復制第三個工作表到第二個工作表之前

(119) ThisWorkbook.ActiveSheet.Columns.ColumnWidth = 20 ‘改變工作表的列寬為20

ThisWorkbook.ActiveSheet.Columns.ColumnWidth = _

ThisWorkbook.ActiveSheet.StandardWidth ‘將工作表的列寬恢復為標准值

ThisWorkbook.ActiveSheet.Columns(1).ColumnWidth = 20 ‘改變工作表列1的寬度為20

(120) ThisWorkbook.ActiveSheet.Rows.RowHeight = 10 ‘改變工作表的行高為10

ThisWorkbook.ActiveSheet.Rows.RowHeight = _

ThisWorkbook.ActiveSheet.StandardHeight ‘將工作表的行高恢復為標准值

ThisWorkbook.ActiveSheet.Rows(1).RowHeight = 10 ‘改變工作表的行1的高度值設置為10

(121) ThisWorkbook.Worksheets(1).Activate ‘當前工作簿中的第一個工作表被激活

(122) ThisWorkbook.Worksheets("Sheet1").Rows(1).Font.Bold = True ‘設置工作表Sheet1中的行1數據為粗體

(123) ThisWorkbook.Worksheets("Sheet1").Rows(1).Hidden = True ‘將工作表Sheet1中的行1隱藏

ActiveCell.EntireRow.Hidden = True ‘將當前工作表中活動單元格所在的行隱藏

注:同樣可用於列。

(124) ActiveSheet.Range(“A:A”).EntireColumn.AutoFit ‘自動調整當前工作表A列列寬

(125) ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlTextValues) ‘選中當前工作表中常量和文本單元格

ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlErrors+xlTextValues) ‘選中當前工作表中常量和文本及錯誤值單元格

*******************************************************

公式與函數

(126) Application.MacroOptions Macro:=”SumPro”,Category:=4 ‘將自定義的SumPro函數指定給Excel中的“統計函數”類別

(127) Application.MacroOptions Macro:=”SumPro”, _

Description:=”First Sum,then Product” ‘為自定義函數SumPro進行了功能說明

(128) Application.WorksheetFunction.CountA(Range(“A:A”))+1 ‘獲取A列的下一個空單元格

(129) WorksheetFunction.CountA(Cell.EntireColumn) ‘返回該單元格所在列非空單元格的數量

WorksheetFunction.CountA(Cell.EntireRow) ‘返回該單元格所在行非空單元格的數量

(130) WorksheetFunction.CountA(Cells) ‘返回工作表中非空單元格數量

(131) ActiveSheet.Range(“A20:D20”).Formula=“=Sum(R[-19]C:R[-1]C”’對A列至D列前19個數值求和

*******************************************************

圖表

(132) ActiveWindow.Visible=False

或 ActiveChart.Deselect ‘使圖表處於非活動狀態

(133) TypeName(Selection)=”Chart” ‘若選中的為圖表,則該語句為真,否則為假

(134) ActiveSheet.ChartObjects.Delete ‘刪除工作表上所有的ChartObject對象

ActiveWorkbook.Charts.Delete ‘刪除當前工作簿中所有的圖表工作表

*******************************************************

窗體和控件

(135) UserForms.Add(MyForm).Show ‘添加用戶窗體MyForm並顯示

(136)TextName.SetFocus ‘設置文本框獲取輸入焦點

(137) SpinButton1.Value=0 ‘將數值調節鈕控件的值改為0

(138) TextBox1.Text=SpinButton1.Value ‘將數值調節鈕控件的值賦值給文本框控件

SpinButton1.Value=Val(TextBox1.Text) ‘將文本框控件值賦給數值調節鈕控件

CStr(SpinButton1.Value)=TextBox1.Text ‘數值調節鈕控件和文本框控件相比較

(139) UserForm1.Controls.Count ‘顯示窗體UserForm1上的控件數目

(140) ListBox1.AddItem “Command1” ‘在列表框中添加Command1

(141) ListBox1.ListIndex ‘返回列表框中條目的值,若為-1,則表明未選中任何列表框中的條目

(142) RefEdit1.Text ‘返回代表單元格區域地址的文本字符串

RefEdit1.Text=ActiveWindow.RangeSelection.Address ‘初始化RefEdit控件顯示當前所選單元格區域

Set FirstCell=Range(RefEdit1.Text).Range(“A1”) ‘設置某單元格區域左上角單元格

(143) Application.OnTime Now + TimeValue("00:00:15"), "myProcedure" ‘等待15秒后運行myProcedure過程

(144) ActiveWindow.ScrollColumn=ScrollBarColumns.Value ‘將滾動條控件的值賦值給ActiveWindow對象的ScrollColumn屬性

ActiveWindow.ScrollRow=ScrollBarRows.Value ‘將滾動條控件的值賦值給ActiveWindow對象的ScrollRow屬性

(145) UserForm1.ListBox1.AddItem Sheets(“Sheet1”).Cells(1,1) ‘將單元格A1中的數據添加到列表框中

ListBox1.List=Product ‘將一個名為Product數組的值添加到ListBox1中

ListBox1.RowSource=”Sheet2!SumP” ‘使用工作表Sheet2中的SumP區域的值填充列表框

(146) ListBox1.Selected(0) ‘選中列表框中的第一個條目(注:當列表框允許一次選中多個條目時,必須使用Selected屬性)

(147) ListBox1.RemoveItem ListBox1.ListIndex ‘移除列表框中選中的條目

*******************************************************

對象

Application對象

(148) Application.UserName ‘返回應用程序的用戶名

(149) Application.Caller ‘返回代表調用函數的單元格

(150) Application.Caller.Parent.Parent ‘返回調用函數的工作簿名稱

(151) Application.StatusBar=”請等待……” ‘將文本寫到狀態欄

Application.StatusBar=”請等待……” & Percent & “% Completed” ‘更新狀態欄文本,以變量Percent代表完成的百分比

Application.StatusBar=False ‘將狀態欄重新設置成正常狀態

(152) Application.Goto Reference:=Range(“A1:D4”) ‘指定單元格區域A1至D4,等同於選擇“編輯——定位”,指定單元格區域為A1至D4,不會出現“定位”對話框

(153) Application.Dialogs(xlDialogFormulaGoto).Show ‘顯示“定位”對話框,但定位條件按鈕無效

(154) Application.Dialogs(xlDialogSelectSpecial).Show ‘顯示“定位條件”對話框

(155) Application.Dialogs(xlDialogFormatNumber).show ‘顯示“單元格格式”中的“數字”選項卡

Application.Dialogs(xlDialogAlignment).show ‘顯示“單元格格式”中的“對齊”選項卡

Application.Dialogs(xlDialogFontProperties).show ‘顯示“單元格格式”中的“字體”選項卡

Application.Dialogs(xlDialogBorder).show ‘顯示“單元格格式”中的“邊框”選項卡

Application.Dialogs(xlDialogPatterns).show ‘顯示“單元格格式”中的“圖案”選項卡

Application.Dialogs(xlDialogCellProtection).show ‘顯示“單元格格式”中的“保護”選項卡

注:無法一次顯示帶選項卡的“單元格格式”對話框,只能一次顯示一個選項卡。

(156) Application.Dialogs(xlDialogFormulaGoto).show Range("b2"), True ‘顯示“引用位置”的默認單元格區域並顯示引用使其出現在窗口左上角(注:內置對話框參數的使用)

(157) Application.CommandBars(1).Controls(2).Controls(16).Execute ‘執行“定位”話框,相當於選擇菜單“編輯——定位”命令

(158) Application.Transpose(Array(“Sun”,”Mon”,”Tur”,”Wed”,”Thu”,”Fri”,”Sat”)) ‘返回一個垂直的數組

(159) Application.Version ‘返回使用的Excel版本號

(160) Application.Cursor = xlNorthwestArrow ‘設置光標形狀為北西向箭頭

Application.Cursor = xlIBeam ‘設置光標形狀為Ⅰ字形

Application.Cursor = xlWait ‘設置光標形狀為沙漏(等待)形

Application.Cursor = xlDefault ‘恢復光標的默認設置

(161) Application.WindowState ‘返回窗口當前的狀態

Application.WindowState = xlMinimized ‘窗口最小化

Application.WindowState = xlMaximized ‘窗口最大化

Application.WindowState = xlNormal ‘窗口正常狀態

(162) Application.UsableHeight ‘獲取當前窗口的高度

Application.UsableWidth ‘獲取當前窗口的寬度

(163) Application.ActiveCell.Address ‘返回活動單元格的地址(注:返回的是絕對地址)

(164) Application.ActivePrinter ‘返回當前打印機的名稱

(165) Application.ActiveSheet.Name ‘返回活動工作表的名稱

(166) Application.ActiveWindow.Caption ‘返回活動窗口的標題

(167) Application.ActiveWorkbook.Name ‘返回活動工作簿的名稱

(168) Application.Selection.Address ‘返回所選區域的地址

(169) Application.ThisWorkbook.Name ‘返回當前工作簿的名稱

(170) Application.CalculationVersion ‘返回Excel計算引擎版本(右邊四位數字)及Excel版本(左邊兩位數字)

(171) Application.MemoryFree ‘以字節為單位返回Excel允許使用的內存數(不包括已經使用的內存)

(172) Application.MemoryUsed ‘以字節為單位返回Excel當前使用的內存數

(173) Application.MemoryTotal ‘以字節為單位返回Excel可以使用的內存數(包括已使用的內存,是MemoryFree和MemoryUsed的總和)

(174) Application.OperatingSystem ‘返回所使用的操作系統的名稱和版本

(175) Application.OrganizationName ‘返回Excel產品登記使用的組織機構的名稱

(176) Application.FindFormat ‘查找的格式種類

Application.ReplaceFormat ‘替換查找到的內容的格式種類

ActiveSheet.Cells.Replace What:=” “, _

Replacement:=” “,SearchFormat:=True,ReplaceFormat:=True ‘替換查找到的格式

(177) Application.Interactive=False ‘忽略鍵盤或鼠標的輸入

(178) Application.Evaluate("Rate") ‘若在工作表中定義了常量0.06的名稱為”Rate”,則本語句將返回值0.06

(179) Application.OnUndo “Undo Option”,“Undo Procedure” ‘選擇UndoOption后,將執行Undo Procedure過程

*******************************************************

Range對象

(180) Range(A1:A10).Value=Application.WorksheetFunction.Transpose(MyArray) ‘將一個含有10個元素的數組轉置成垂直方向的工作表單元格區域(A1至A10)

注:因為當把一維數組的內容傳遞給某個單元格區域時,該單元格區域中的單元格必須是水平方向的,即含有多列的一行。若必須使用垂直方向的單元格區域,則必須先將數組進行轉置,成為垂直的。

(181) Range(“A65536”).End(xlUp).Row+1 ‘返回A列最后一行的下一行

(182) rng.Range(“A1”) ‘返回區域左上角的單元格

(183) cell.Parent.Parent.Worksheets ‘訪問當前單元格所在的工作簿

(184) Selection.Font.Bold=Not Selection.Font.Bold ‘切換所選單元格是否加粗

(185) ActiveSheet.Range("A:B").Sort Key1:=Columns("B"), Key2:=Columns("A"), _

Header:=xlYes ‘兩個關鍵字排序,相鄰兩列,B列為主關鍵字,A列為次關鍵字,升序排列

(186) cell.Range(“A1”).NumberFormat ‘顯示單元格或單元格區域中的第一個單元格的數字格式

(187) cell.Range(“A1”).HasFormula ‘檢查單元格或單元格區域中的第一個單元格是否含有公式

或cell.HasFormula ‘工作表中單元格是否含有公式

(188) Cell.EntireColumn ‘單元格所在的整列

Cell.EntireRow ‘單元格所在的整行

(189) rng.Name.Name ‘顯示rng區域的名稱

(190) rng.Address ‘返回rng區域的地址

(191) cell.Range(“A1”).Formula ‘返回包含在rng區域中左上角單元格中的公式。

注:若在一個由多個單元格組成的范圍內使用Formula屬性,會得到錯誤;若單元格中沒有公式,會得到一個字符串,在公式欄中顯示該單元格的值。

(192) Range(“D5:D10”).Cells(1,1) ‘返回單元格區域D5:D10中左上角單元格

(193) ActiveCell.Row ‘活動單元格所在的行數

ActiveCell.Column ‘活動單元格所在的列數

(194) Range("A1:B1").HorizontalAlignment = xlLeft ‘當前工作表中的單元格區域數據設置為左對齊

(195) ActiveSheet.Range(“A2:A10”).NumberFormat=”#,##0” ‘設置單元格區域A2至A10中數值格式

(196) rng.Replace “ “,”0” ‘用0替換單元格區域中的空單元格

*******************************************************

Collection與object

(197) Dim colMySheets As New Collection

Public colMySheets As New Collection ‘聲明新的集合變量

(198) Set MyRange=Range(“A1:A5”) ‘創建一個名為MyRange的對象變量

(199) <object>.Add Cell.Value CStr(Cell.Value) ‘向集合中添加惟一的條目(即將重復的條目忽略)

*******************************************************

Windows API

(200) Declare Function GetWindowsDirectoryA Lib “kernel32” _

(ByVal lpBuffer As String,ByVal nSize As Long) As Long ‘API函數聲明。返回安裝Windows所在的目錄名稱,調用該函數后,安裝Windows的目錄名稱將在第一個參數lpBuffer中,該目錄名稱的字符串長度包含在第二個參數nSize中

(201) Set objExcel = CreateObject("Excel.Application")

objExcel.Workbooks.Add ‘創建Excel工作簿

(202) Application.ActivateMicrosoftApp xlMicrosoftWord '開啟Word應用程序

(203) Application.TemplatesPath ‘獲取工作簿模板的位置

(204) Application.Calculation = xlCalculationManual ‘設置工作簿手動計算

Application.Calculation = xlCalculationAutomatic ‘工作簿自動計算

(205) Worksheets(1).EnableCalculation = False ‘不對第一張工作表自動進行重算

(206) Application.CalculateFull '重新計算所有打開的工作簿中的數據

(207) Application.RecentFiles.Maximum = 5 '將最近使用的文檔列表數設為5

(208) Application.RecentFiles(4).Open '打開最近打開的文檔中的第4個文檔

(209) Application.OnTime DateSerial(2006,6,6)+TimeValue(“16:16:16”),“BaoPo” ‘在2006年6月6日的16:16:16開始運行BaoPo過程

(210) Application.Speech.Speak ("Hello" & Application.UserName) ‘播放聲音,並使用用戶的姓名問候用戶

(211) MsgBox Application.PathSeparator '獲取"\"號

(212) MsgBox Application.International(xlCountrySetting) '返回應用程序當前所在國家的設置信息

(213) Application.AutoCorrect.AddReplacement "葛洲壩", "三峽" '自動將在工作表中進行輸入的"葛洲壩"更正為"三峽"

(214) Beep '讓計算機發出聲音

(215) Err.Number ‘返回錯誤代碼

(216) MsgBox IMEStatus '獲取輸入法狀態

(217) Date = #6/6/2006#

Time = #6:16:16 AM# '將系統時間更改為2006年6月6日上午6時16分16秒

(218) Application.RollZoom = Not Application.RollZoom '切換是否能利用鼠標中間的滑輪放大/縮小工作表

(219) Application.ShowWindowsInTaskba = True ‘顯示任務欄中的窗口,即各工作簿占用各自的窗口

(220) Application.DisplayScrollBars = True ‘顯示窗口上的滾動條

(221) Application.DisplayFormulaBar = Not Application.DisplayFormulaBar '切換是否顯示編輯欄

(222) Application.Dialogs(xlDialogPrint).Show ‘顯示打印內容對話框

(223) Application.MoveAfterReturnDirection = xlToRight '設置按Enter鍵后單元格的移動方向向右

(224) Application.FindFile '顯示打開對話框

(225) ThisWorkbook.FollowHyperlink http://fanjy.blog.excelhome.net ‘打開超鏈接文檔

(226) ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly '將當前工作簿設置為只讀

(227) ActiveWorkbook.AddToFavorites '將當前工作簿添加到收藏夾文件夾中

(228) ActiveSheet.CheckSpelling '在當前工作表中執行"拼寫檢查"

(229) ActiveSheet.Protect userinterfaceonly:=True ‘保護當前工作表

(230) ActiveSheet.PageSetup.LeftHeader = ThisWorkbook.FullName ‘在當前工作表的左側頁眉處打印出工作簿的完整路徑和文件名

(231) Worksheets("Sheet1").Range("A1:G37").Locked = False

Worksheets("Sheet1").Protect

'解除對工作表Sheet1中A1:G37區域單元格的鎖定

'以便當該工作表受保護時也可對這些單元格進行修改

(232) Worksheets("Sheet1").PrintPreview '顯示工作表sheet1的打印預覽窗口

(233) ActiveSheet.PrintPreview Enablechanges:=False ‘禁用顯示在Excel的“打印預覽”窗口中的“設置”和“頁邊距”按鈕

(234) ActiveSheet.PageSetup.PrintGridlines = True '在打印預覽中顯示網格線

ActiveSheet.PageSetup.PrintHeadings = True '在打印預覽中顯示行列編號

(235) ActiveSheet.ShowDataForm '開啟數據記錄單

(236) Worksheets("Sheet1").Columns("A").Replace _

What:="SIN", Replacement:="COS", _

SearchOrder:=xlByColumns, MatchCase:=True '將工作表sheet1中A列的SIN替換為COS

(237) Rows(2).Delete '刪除當前工作表中的第2行

Columns(2).Delete '刪除當前工作表中的第2列

(238) ActiveWindow.SelectedSheets.VPageBreaks.Add before:=ActiveCell '在當前單元格左側插入一條垂直分頁符

ActiveWindow.SelectedSheets.HPageBreaks.Add before:=ActiveCell '在當前單元格上方插入一條垂直分頁符

(239) ActiveWindow.ScrollRow = 14 '將當前工作表窗口滾動到第14行

ActiveWindow.ScrollColumn = 13 '將當前工作表窗口滾動到第13列

(240) ActiveWindow.Close '關閉當前窗口

(241) ActiveWindow.Panes.Count '獲取當前窗口中的窗格數

(242) Worksheets("sheet1").Range("A1:D2").CreateNames Top:=True '將A2至D2的單元格名稱設定為A1到D1單元格的內容

(243) Application.AddCustomList listarray:=Range("A1:A8") '自定義當前工作表中單元格A1至A8中的內容為自動填充序列

(244) Worksheets("sheet1").Range("A1:B2").CopyPicture xlScreen, xlBitmap '將單元格A1至B2的內容復制成屏幕快照

(245) Selection.Hyperlinks.Delete ‘刪除所選區域的所有鏈接

Columns(1).Hyperlinks.Delete ‘刪除第1列中所有的鏈接

Rows(1).Hyperlinks.Delete ‘刪除第1行中所有的鏈接

Range("A1:Z30").Hyperlinks.Delete ‘刪除指定范圍所有的鏈接

(246) ActiveCell.Hyperlinks.Add Anchor:=ActiveCell, _

Address:="C:\Windows\System32\Calc.exe", ScreenTip:="按下我,就會開啟Windows計算器", TextToDisplay:="Windows計算器" '在活動單元格中設置開啟Windows計算器鏈接

(247) ActiveCell.Value = Shell("C:\Windows\System32\Calc.exe", vbNormalFocus) '開啟Windows計算器

(248) ActiveSheet.Rows(1).AutoFilter ‘打開自動篩選。若再運行一次,則關閉自動篩選

(249) Selection.Autofilter ‘開啟/關閉所選區域的自動篩選

(250) ActiveSheet.ShowAllData ‘關閉自動篩選

(251) ActiveSheet.AutoFilterMode ‘檢查自動篩選是否開啟,若開啟則該語句返回True

(252) ActiveSheet.Columns("A").ColumnDifferences(Comparison:=ActiveSheet. _

Range("A2")).Delete '在A列中找出與單元格A2內容不同的單元格並刪除

(253) ActiveSheet.Range("A6").ClearNotes '刪除單元格A6中的批注,包括聲音批注和文字批注

(254) ActiveSheet.Range("B8").ClearComments '刪除單元格B8中的批注文字

(255) ActiveSheet.Range("A1:D10").ClearFormats '清除單元格區域A1至D10中的格式

(256) ActiveSheet.Range("B2:D2").BorderAround ColorIndex:=5, _

Weight:=xlMedium, LineStyle:=xlDouble '將單元格B2至D2區域設置為藍色雙線

(257) Range("A1:B2").Item(2, 3)或Range("A1:B2")(2, 3) ‘引用單元格C2的數據

Range("A1:B2")(3) ‘引用單元格A2

(258) ActiveSheet.Cells(1, 1).Font.Bold = TRUE ‘設置字體加粗

ActiveSheet.Cells(1, 1).Font.Size = 24 ‘設置字體大小為24磅

ActiveSheet.Cells(1, 1).Font.ColorIndex = 3 ‘設置字體顏色為紅色

ActiveSheet.Cells(1, 1).Font.Italic = TRUE ‘設置字體為斜體

ActiveSheet.Cells(1, 1).Font.Name = "Times New Roman" ‘設置字體類型

ActiveSheet.Cells(1, 1).Interior.ColorIndex = 3 ‘將單元格的背景色設置為紅色

(259) ActiveSheet.Range("C2:E6").AutoFormat Format:=xlRangeAutoFormatColor3 '將當前工作表中單元格區域C2至E6格式自動調整為彩色3格式

(260) Cells.SpecialCells(xlCellTypeLastCell) ‘選中當前工作表中的最后一個單元格

(261) ActiveCell.CurrentArray.Select '選定包含活動單元格的整個數組單元格區域.假定該單元格在數據單元格區域中

(262) ActiveCell.NumberFormatLocal = "0.000; [紅色] 0.000" '將當前單元格數字格式設置為帶3位小數,若為負數則顯示為紅色

(263) IsEmpty (ActiveCell.Value) '判斷活動單元格中是否有值

(264) ActiveCell.Value = LTrim(ActiveCell.Value) '刪除字符串前面的空白字符

(265) Len(ActiveCell.Value) '獲取活動單元格中字符串的個數

(266) ActiveCell.Value = UCase(ActiveCell.Value) '將當前單元格中的字符轉換成大寫

(267) ActiveCell.Value = StrConv(ActiveCell.Value, vbLowerCase) '將活動單元格中的字符串轉換成小寫

(268) ActiveSheet.Range("C1").AddComment '在當前工作表的單元格C1中添加批注

(269) Weekday(Date) '獲取今天的星期,以數值表示,1-7分別對應星期日至星期六

(270) ActiveSheet.Range("A1").AutoFill Range(Cells(1, 1), Cells(10, 1)) '將單元格A1的數值填充到單元格A1至A10區域中

(271) DatePart("y", Date) '獲取今天在全年中的天數

(272) ActiveCell.Value = DateAdd("yyyy", 2, Date) '獲取兩年后的今天的日期

(273) MsgBox WeekdayName(Weekday(Date)) '獲取今天的星期數

(274) ActiveCell.Value = Year(Date) '在當前單元格中輸入今年的年份數

ActiveCell.Value = Month(Date) '在當前單元格中輸入今天所在的月份數

ActiveCell.Value = Day(Date) '在當前單元格中輸入今天的日期數

(275) ActiveCell.Value = MonthName(1) '在當前單元格中顯示月份的名稱,本句為顯示"一月"

(276) ActiveCell.Value = Hour(Time) '在當前單元格中顯示現在時間的小時數

ActiveCell.Value = Minute(Time) '在當前單元格中顯示現在時間的分鍾數

ActiveCell.Value = Second(Time) '在當前單元格中顯示現在時間的秒數

(277) ActiveSheet.Shapes(1).Delete '刪除當前工作表中的第一個形狀

(278) ActiveSheet.Shapes.Count '獲取當前工作表中形狀的數量

(279) ActiveSheet.Shapes(1).TextEffect.ToggleVerticalText '改變當前工作表中第一個藝術字的方向

(280) ActiveSheet.Shapes(1).TextEffect.FontItalic = True '將當前工作表中第一個藝術字的字體設置為斜體

(281) ActiveSheet.Shapes.AddTextEffect(msoTextEffect21, "三峽", _

"Arial Black", 22#, msoFalse, msoFalse, 66#, 80).Select '在當前工作表中創建一個名為"三峽"的藝術字並對其進行格式設置和選中

(282) ActiveSheet.Shapes.AddLine(BeginX:=10, BeginY:=10, EndX:=250, _

EndY:=100).Select '在當前工作表中以(10,10)為起點(250,100)為終點畫一條直線並選中

(283) ActiveSheet.Shapes.AddShape(Type:=msoShapeRightTriangle, _

Left:=70, Top:=40, Width:=130, Height:=72).Select '在當前工作表中畫一個左上角在(70,40),寬為130高為72的三角形並選中

(284) ActiveSheet.Shapes.AddShape(Type:=msoShapeRectangle, _

Left:=70, Top:=40, Width:=130, Height:=72).Select '在當前工作表中畫一個以點(70,40)為起點,寬130高72的矩形並選中

(285) ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _

Left:=70, Top:=40, Width:=130, Height:=72).Select '在當前工作表中畫一個左上角在(70,40),寬為130高為72的橢圓

(286) ActiveSheet.Shapes(1).Line.ForeColor.RGB = RGB(0, 0, 255) '將當前工作表中第一個形狀的線條顏色變為藍色

(287) ActiveSheet.Shapes(2).Fill.ForeColor.RGB = RGB(255, 0, 0) '將當前工作表中第2個形狀的前景色設置為紅色

(288) ActiveSheet.Shapes(1).Rotation = 20 '將當前工作表中的第1個形狀旋轉20度

(289) Selection.ShapeRange.Flip msoFlipHorizontal '將當前選中的形狀水平翻轉

Selection.ShapeRange.Flip msoFlipVertical '將當前選中的形狀垂直翻轉

(290) Selection.ShapeRange.ThreeD.SetThreeDFormat msoThreeD1 '將所選取的形狀設置為第1種立體樣式

(291) ActiveSheet.Shapes(1).ThreeD.Depth = 20 '將當前工作表中第一個立體形狀的深度設置為20

(292) ActiveSheet.Shapes(1).ThreeD.ExtrusionColor.RGB = RGB(0, 0, 255) '將當前工作表中第1個立體形狀的進深部分的顏色設為藍色

(293) ActiveSheet.Shapes(1).ThreeD.RotationX = 60 '將當前工作表中的第1個立體形狀沿X軸旋轉60度

ActiveSheet.Shapes(1).ThreeD.RotationY = 60 '將當前工作表中的第1個立體形狀沿Y軸旋轉60度

(294) Selection.ShapeRange.ThreeD.Visible = msoFalse '將所選擇的立體形狀轉換為平面形狀

(295) Selection.ShapeRange.ConnectorFormat.BeginDisconnect '在形狀中讓指定的連接符起點脫離原來所連接的形狀

(296) ActiveSheet.Shapes(1).PickUp '復制當前工作表中形狀1的格式

(297) ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 260, 160, 180, 30). TextFrame.Characters.Text = "fanjy.blog.excelhome.net" '在工作簿中新建一個文本框並輸入內容

(298) ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, 20, 80, 100, 200). TextFrame.Characters.Text = "fanjy.blog.excelhome.net" '在當前工作表中建立一個水平文本框並輸入內容

(299) ActiveSheet.Shapes.AddPicture "d:\sx.jpg", True, True, 60, 20, 400, 300 '在當前工作表中插入一張d盤中名為sx的圖片

(300) ActiveChart.ApplyCustomType xl3DArea '將當前圖表類型改為三維面積圖

 

例:刪除空白頁

Sub GetBlankPage()
Dim IsDelete As Boolean
Dim PageCount As Long
Dim rRange     As Range
Dim iInt     As Integer, DelCount As Integer
Dim tmpstr As String
 
    IsDelete = True
    PageCount = ThisDocument.BuiltInDocumentProperties(wdPropertyPages)
    For iInt = 1 To PageCount
        '超過PageCount退出
        If iInt > PageCount Then Exit For
        
        '取每一頁的內容
        If iInt = PageCount Then
            Set rRange = ThisDocument.Range( _
                            Start:=ThisDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start)
        Else
            Set rRange = ThisDocument.Range( _
                            Start:=ThisDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start, _
                            End:=ThisDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt + 1).Start _
                            )
        End If
        
        If Replace(rRange.Text, Chr(13), "") = "" Or Replace(rRange.Text, Chr(13), "") = Chr(12) Then
            tmpstr = tmpstr & "第 " & iInt & " 頁是空頁" & vbCrLf
            '刪除?
            If IsDelete Then
                DelCount = DelCount + 1
                '刪除空白頁
                rRange.Text = Replace(rRange.Text, Chr(13), "")
                rRange.Text = ""
                '重算頁數
                PageCount = ThisDocument.BuiltInDocumentProperties(wdPropertyPages)
                If iInt <> PageCount Then
                    '頁刪除后,頁碼變化,重新檢查當前頁
                    iInt = iInt - 1
                Else
                    '最后一個空頁
                    Set rRange = ThisDocument.Range( _
                                    Start:=ThisDocument.GoTo(wdGoToPage, wdGoToAbsolute, PageCount - 1).Start, _
                                    End:=ThisDocument.GoTo(wdGoToPage, wdGoToAbsolute, PageCount + 1).Start _
                                    )
                    '如果是分頁符,刪除上一頁中的換頁符
                    If InStr(1, rRange.Text, Chr(12)) > 0 Then
                        rRange.Characters(InStr(1, rRange.Text, Chr(12))) = ""
                    Else
                        '沒有分頁符,通過選中后刪除,最好不這樣做,如果判斷錯誤,有誤刪除的風險
                        Set rRange = ThisDocument.Range( _
                                        Start:=ThisDocument.GoTo(wdGoToPage, wdGoToAbsolute, iInt).Start)
                        rRange.Select
                        Selection.Delete
                    End If
                    Exit For
                End If
            End If
        End If
    Next
    
    If 1 = 1 Or Not IsDelete Then
        If tmpstr = "" Then
            MsgBox "沒有空頁", vbInformation + vbOKOnly
        Else
            MsgBox tmpstr, vbInformation + vbOKOnly
        End If
    Else
        If DelCount > 0 Then MsgBox "刪除空頁 " & DelCount, vbInformation + vbOKOnly
    End If
End Sub


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM