電子表格VBA編程計算速成(4)| 第四章 電子表格計算編程
學會了自己編制函數(shù),,掌握了單元格和工作表的基本編程代碼和設置,就可以對您所需要的復雜專業(yè)項目進行編程自動化計算了,。如果您對編程是一無所知的初學者,,也許前面的自編函數(shù)還沒有完全看懂,這不要緊,,下面介紹VB編程基本語法之后,,自然就會清楚了;至于代碼,,那都是系統(tǒng)命令,,知道它的含義和用途,動腦筋靈活用好它就可以了,。
4.1 電子表格VB編程基本語法
VB編程計算是什么,?簡單說就是通過命名的變量、常量來存儲用于計算的數(shù)據(jù),,存儲和傳遞計算的中間或最后的結(jié)果,;通過一系列的代碼語句來處理數(shù)據(jù),輸出數(shù)據(jù),,從而完成計算任務,。下面簡明分述之:
4.1.1 變量和常量
一,標識符(變量,、常量,、數(shù)據(jù)類型,、過程、函數(shù)等)命名規(guī)則:
⑴字母開頭,;
⑵不超過255個字符;
⑶只包含字母,,數(shù)字,,下劃線;
⑷不能用系統(tǒng)的保留字(42個關(guān)鍵字),,即系統(tǒng)命令,、語句、函數(shù)的固定標識符,。如:As,,ByVai,Me,,Set,,F(xiàn)or,To等
VB中不區(qū)分字母大小寫,。在命名時最好采用好記,、又好理解的命名方式:一般用英語單詞或其縮寫加數(shù)字,下劃線,;國人也可以用漢語簡拼加數(shù)字,,下劃線來命名,首字母一般大寫,。
二,,聲明變量
1. Dim語句:用于創(chuàng)建過程級變量,聲明變量的數(shù)據(jù)類型并分配存儲空間,。
可以在一個語句中聲明幾個變量,,但必須將每一個變量的數(shù)據(jù)類型包含進來。如下語句中,,變量 intX,、intY、與 intZ 被聲明為 Integer 類型,。
Dim intX As Integer, intY As Integer, intZ As Integer
而下面的語句中,,變量 intX 與 intY 被聲明為 (缺省)Variant 類型 ,;只有 intZ 被聲明為 Integer 類型,。
Dim intX, intY, intZ As Integer
2. Public 語句:聲明公共模塊級別變量。公有變量可用于工程中的任何過程,。
Public strName As String
如果公有變量是聲明于標準模塊或是類模塊中,,則它也可以被任何引用到此公有變量所屬工程的工程中使用。
3. Private 語句:聲明私有的模塊級別變量。私有變量只可使用于同一模塊中的過程,。
Private MyName As String
注意,,在模塊級別中使用 Dim 語句與使用 Private 語句是相同的。不過使用 Private 語句可以更容易的讀取和解釋代碼,。
4. Static 語句:聲明靜態(tài)變量,。使用 Static 語句取代 Dim 語句時,所聲明的變量在每次調(diào)用時仍保留它原先的值,。
三,,聲明常數(shù):可用如下格式聲明公用常數(shù),數(shù)據(jù)類型也可用變量聲明字符%,、&,、!、#代表Integer(整型%),、Long(長整型&),、Single(單精度型!)、Double(雙精度型#),。
Public Const M_SEC# = 206264.8 '1弧度=206264.8″
Public Const M_DEG# = 57.2957795130823 '1弧度=57.2957795130823°
Public Const M_RAD# = 1.74532925199433E-02 '1度=1.74532925199433E-02弧度
Public Const M_PI# = 3.14159265358979 'π=3.14159265358979
可以在一個語句中聲明數(shù)個常數(shù),但必須將每一個常數(shù)的數(shù)據(jù)類型包含進來,。如下面的語句中,常數(shù) conAge 和 conWage 被聲明為 Integer 類型,。
Const conAge % = 34, conWage As Currency = 35000
四,,聲明數(shù)組:數(shù)組的聲明方式和其它的變量是一樣的。
Dim MyArray(10, 10) As Integer
第一個參數(shù)代表的是行,;而第二個參數(shù)代表的是列,。
與其它變量的聲明一樣,除非指定一個數(shù)據(jù)類型給數(shù)組,,否則聲明數(shù)組中元素的數(shù)據(jù)類型為Variant,。為了盡可能使寫的代碼簡潔明了,則要明確聲明的數(shù)組為某一種數(shù)據(jù)類型而非 Variant,。
4.1.2 數(shù)據(jù)類型
1. Byte(字節(jié)型),,1字節(jié),0到255
2. Boolean(布爾型),,2字節(jié),,True或False
3. Integer(整型%),2字節(jié),,-32,767到32,767
4. Long(長整型&),,4字節(jié),-2,147,483,648到2,147,483,647
5. Currency(貨幣型),,8字節(jié),,-922,337,203,685,477.5808到922,337,203,685,477.5807
6. Single(單精度型!),,4字節(jié),-3.402823E+38到-1.401298E-45,;
1.401298E-45到3.402823E+38
7. Double(雙精度型#),,8字節(jié),-1.79769313486232E+308到-4.94065645841247E-324,; 4.94065645841247E-324到1.79769313486232E+308
8. Date(日期型),,8字節(jié),100年1月1日到9999年12月31日
9. String(變長字符串$),,10字節(jié),0到大約20億
10. String * length (定長字符串),,字符串長度
11. Object(對象,,4字節(jié)),任何對象引用
12. Variant(變體型,,數(shù)字),,16字節(jié),任何數(shù)字值
13. Variant(變體型,,數(shù)字16字節(jié),;字符22字節(jié),任何字符串值
數(shù)據(jù)類型缺省為Variant,。
4.1.3 運算符與表達式
一,,算術(shù)運算符:+(加,也用于字符串拼接),,-(減,,也作為負號),*(乘),,/(浮點數(shù)除),,\(整數(shù)除),Mod(取模),,^(乘方,、開方),&(字符串拼接)
算術(shù)運算符的優(yōu)先級為:^,,-(負號),,*、/,、\,、Mod,+,、-,,&,。
在運算表達式中,有括號,,先算括號內(nèi),,有多層括號,內(nèi)層括號優(yōu)先,。
二,,關(guān)系運算符:<(小于),<=(小于等于),>(大于),>=(大于等于),=(等于),<>(不等于)
關(guān)系運算符用來對兩個表達式的值進行比較,結(jié)果是一個邏輯值真(True)或假(False),。
三,,邏輯運算符:
四,,表達式的執(zhí)行順序:
1. 方式運算
2. 算術(shù)運算
3. 關(guān)系運算
4. 邏輯運算
5. 賦值運算
4.1.4 流程控制語句
一,,順序結(jié)構(gòu)語句
1. 賦值語句:把一個表達式的值賦給一個變量或者控件對象的一個屬性。語句格式為:
變量名=表達式 或者 對象名. 屬性=表達式
示例1:指定 InputBox 函數(shù)的返回值給變量
yourName ,。Sub Question()
Dim yourName As String
yourName = InputBox("What is your name?")
MsgBox "Your name is " & yourName
End Sub
示例2:設置對于活動單元格 Font 對象的 Bold 屬性
ActiveCell.Font.Bold = True
2. 輸入輸出語句:
①InputBox 函數(shù):
在一對話框中顯示提示,,等待用戶輸入正文或按下按鈕,并返回包含文本框內(nèi)容的字符串,。其語法:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Prompt必需的,。對話框中的提示文本。prompt 的最大長度大約是 1024 個字符,,由所用字符的寬度決定,。如果 prompt 包含多個行,則可在各行之間用回車符 (Chr(13)),、換行符 (Chr(10)) 或回車換行符的組合 (Chr(13) & Chr(10)) 來分隔,。
Title可選的。顯示對話框標題欄中的文本,。如果省略 title,,則把應用程序名放入標題欄中。
Default可選的,。顯示文本框中缺省的字符串表達式,。如果省略 default,則文本框為空,。
Xpos可選的,。指定對話框的左邊與屏幕左邊的水平距離,,數(shù)值表達式,成對出現(xiàn),。如果省略 xpos,,則對話框會在水平方向居中。
Ypos可選的,。指定對話框的上邊與屏幕上邊的距離,,數(shù)值表達式,成對出現(xiàn),。如果省略 ypos,,則對話框被放置在屏幕垂直方向距下邊大約三分之一的位置。
Helpfile可選的,。識別幫助文件,,用該文件為對話框提供上下文相關(guān)的幫助,字符串表達式,。如果已提供 helpfile,則也必須提供 context,。
Context可選的,。指定給某個幫助主題的幫助上下文編號,數(shù)值表達式,。如果已提供 context,,則也必須要提供 helpfile。
說明
如果同時提供了 helpfile 與 context,,用戶可以按 F1 (Windows) or HELP (Macintosh) 來查看與 context 相應的幫助主題,。某些主應用程序,例如,,Microsoft Excel,,會在對話框中自動添加一個 Help 按鈕。如果用戶單擊 OK 或按下ENTER ,,則 InputBox 函數(shù)返回文本框中的內(nèi)容,。如果用戶單擊 Cancel,則此函數(shù)返回一個長度為零的字符串 (""),。
注意:如果還要指定第一個命名參數(shù)以外的參數(shù),,則必須在表達式中使用 InputBox。如果要省略某些位置參數(shù),,則必須加入相應的逗號分界符,。
下面是獲取InputBox函數(shù)的返回值的賦值語句
Xzan% = InputBox("0,清空;1,→算表面積,;2.寫入公式-10,; 3,計算-100,;4,計算-150;5,計算-200,;6,計算-250,;7,計算-300;8,計算-350,;9.計算-400,;10,刪除數(shù)據(jù)名…",”請選擇項目”)
② MsgBox 函數(shù):
在對話框中顯示消息,等待用戶單擊按鈕,,并返回一個 Integer 告訴用戶單擊哪一個按鈕,。
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
Prompt 必需的。顯示在對話框中的消息文本,。prompt 的最大長度大約為 1024 個字符,,由所用字符的寬度決定。如果 prompt 的內(nèi)容超過一行,,則可以在每一行之間用回車符 (Chr(13)),、換行符 (Chr(10)) 或是回車與換行符的組合 (Chr(13) & Chr(10)) 將各行分隔開來。
Buttons可選的,。數(shù)值表達式是值的總和,,指定顯示按鈕的數(shù)目及形式,使用的圖標樣式,,缺省按鈕是什么以及消息框的強制回應等,。如果省略,則 buttons 的缺省值為 0,。
Title可選的,。顯示對話框標題欄中的文本。如果省略 title,,則將應用程序名放在標題欄中,。
Helpfile可選的。字符串表達式,,識別用來向?qū)υ捒蛱峁┥舷挛南嚓P(guān)幫助的幫助文件,。如果提供了 helpfile,則也必須提供 context,。
Context可選的,。識別幫助文件,用該文件為對話框提供上下文相關(guān)的幫助,,字符串表達式,。如果已提供 helpfile,則也必須提供 context。
buttons 參數(shù)常用設置值:
按鈕返回值常數(shù):
說明
在提供了 helpfile 與 context 的時候,,用戶可以按 F1(Windows) or HELP (Macintosh) 來查看與 context 相應的幫助主題。像 Microsoft Excel 這樣一些主應用程序也會在對話框中自動添加一個 Help 按鈕,。
如果對話框顯示 Cancel 按鈕,,則按下 ESC 鍵與單擊 Cancel 按鈕的效果相同。如果對話框中有 Help 按鈕,,則對話框中提供有上下文相關(guān)的幫助。但是,,直到其它按鈕中有一個被單擊之前,,都不會返回任何值。
注意: 如果還要指定第一個命名參數(shù)以外的參數(shù),,則必須在表達式中使用 MsgBox,。為了省略某些位置參數(shù),必須加入相應的逗號分界符,。
二,,分支結(jié)構(gòu)語句
當要求有選擇地執(zhí)行指定操作時,采用條件分支程序結(jié)構(gòu),。
1. If...Then...Else 語句
根據(jù)給定條件的值,,使用 If...Then...Else 語句運行指定的語句或一個語句塊。If...Then...Else 語句可根據(jù)需要嵌套多級,。然而,,為了可讀性可能會使用 Select Case 語句而不使用多級嵌套的 If...Then...Else 語句。
① 如果條件為 True 則運行語句
當條件為 True 時,,若只要執(zhí)行一個語句,,則可以使用單行的 If...Then...Else 語法,。下列的示例顯示了單行語法,省略了 Else 關(guān)鍵字:
Sub FixDate()
myDate = #2/13/95#
If myDate < Now Then myDate = Now
End Sub
為了運行多行代碼,,必須使用多行的語法,。而此語法包含 End If 語句,如同下面示例所示:
Sub AlertUser(value as Long)
If value = 0 Then
AlertLabel.ForeColor = "Red"
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
End If
End Sub
② 如果條件為 True,,運行某些語句,;條件為 False,運行其它的語句
使用 If...Then...Else 語句可以定義兩個可執(zhí)行的語句塊:其中一個塊會在條件為True 時執(zhí)行,;而另一個塊會在條件為 False 時執(zhí)行,。
Sub AlertUser(value as Long)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
Else
AlertLabel.Forecolor = vbBlack
AlertLabel.Font.Bold = False
AlertLabel.Font.Italic = False
End If
End Sub
③ 如果第一個條件為 False 時,測試第二個條件
如果第一個條件為 False,,則可以在 If...Then...Else 語句中加上 ElseIf 語句來測試第二個條件,。例如,下列的函數(shù)過程根據(jù)工作分類來計算獎金,。如果所有 If 和 ElseIf 語句中條件都是 False,,則會運行跟在 Else 語句之后的語句。
Function Bonus(performance, salary)
If performance = 1 Then
Bonus = salary * 0.1
ElseIf performance = 2 Then
Bonus = salary * 0.09
ElseIf performance = 3 Then
Bonus = salary * 0.07
Else
Bonus = 0
End If
End Function
2. Select Case 語句
從一個條件設置中選擇某一分支,。下面是一個專業(yè)計算過程,,根據(jù)輸入框的輸入數(shù)字計算相應的語句體,。
Private Sub bmjjsButton1_Click()
Dim xzan As String
xzan = InputBox("0,清空,;1,→地形點計算;2.寫入公式-10,; 3,計算-100 ",”請選擇項目”)
If xzan = "" Then GoTo js
Select Case xzan
Case "0"
語句體(清空)
Case "1"
語句體(→地形點計算)
Case "2"
語句體(寫入公式-10)
Case "3"
語句體(計算-100)
End Select
js:
End Sub
請注意:每個 Case 語句可以包含一個以上的值,,一個值的范圍,,或是一個值的組合以及比較運算符。如果 Select Case 語句與Case 語句的任何值相匹配,,則可選的 Case Else 語句運行,。
Function Bonus(performance, salary)
Select Case performance
Case 1
Bonus = salary * 0.1
Case 2, 3
Bonus = salary * 0.09
Case 4 To 6
Bonus = salary * 0.07
Case Is > 8
Bonus = 100
Case Else
Bonus = 0
End Select
End Function
3. 無條件轉(zhuǎn)移語句Goto bz(標簽)
當程序執(zhí)行到Goto bz語句時,會無條件轉(zhuǎn)到bz:標志處,,并繼續(xù)往下運行,。很好利用這一特性可解決多條件分支和循環(huán)的問題。如:
Public Hz_Button1()
Dim Hx as Integer
Dim Qh, Zh As Double
Sheet2.Activate
' ………………
Hx = 3
sh2:
If Cells(Hx, 1) = 0 Then GoTo js2
If Cells(Hx, 1) >= Qh And Cells(Hx, 1) <= Zh Then
Cells(Hx, 4).Select
With Selection.Interior
.ColorIndex = 36 '淡黃=36
.Pattern = xlSolid
End With
' ………………
Hx = Hx + 1
GoTo sh2
ElseIf Cells(Hx, 1) < Qh Or Cells(Hx, 1) > Zh Then
Hx = Hx + 1
GoTo sh2
End If
js2:
' ………………
End Sub
4. 跳轉(zhuǎn)子程序語句GoSub...Return
當程序執(zhí)行到GoSub bz語句時,,會無條件轉(zhuǎn)到標志bz開始的子程序,,當碰到第一個 Return 語句時,程序就會返回到緊接在剛剛執(zhí)行的 GoSub 語句之后的語句繼續(xù)執(zhí)行,。利用這一特性,,我們可以將較長的相同過程代碼,創(chuàng)建分開的過程,并使用 GoSub...Return 來調(diào)用,,可以使程序更具結(jié)構(gòu)化,。須注意的是,GoSub 和與之相應的 Return 語句必須放在同一個過程中,。如:
Sub GosubDemo()
Dim Num
' 請求用戶輸入一個數(shù)字,。
Num = InputBox("Enter a positive number to be divided by 2.")
' 如果用戶輸入一個正整型,則使用子程序,。
If Num > 0 Then GoSub zcx
Debug.Print Num
Exit Sub ' 使用 Exit 命令來避免錯誤發(fā)生,。
zcx:
Num = Num/2 ' 將數(shù)除以 2。
Return '' 將控制返回 GoSub 之后的語句,。
End Sub
三,,循環(huán)結(jié)構(gòu)語句
當要求重復執(zhí)行一組操作時,采用循環(huán)程序結(jié)構(gòu)語句,。其中有些循環(huán)重復執(zhí)行語句直到條件為 False,;而有些循環(huán)重復執(zhí)行語句直到條件為 True。也有某些循環(huán)執(zhí)行一指定次數(shù)的語句或是集合中的每一個對象,。
1. Do...Loop 語句
可以使用 Do...Loop 語句去運行語句的塊,,而它所用掉的時間是不確定的。當條件為 True 或直到條件變成 True 時,,此語句會一直重復,。
① 直到條件為 True 時重復語句
當使用 While 關(guān)鍵字去檢查 Do...Loop 語句中的條件時,可以有兩種方法,??梢栽谶M入循環(huán)之前檢查條件式,也可以在循環(huán)至少運行一次之后才檢查條件式,。
在下面的 ChkFirstWhile 過程中,,在進入循環(huán)之前檢查條件。如果將 myNum 的值由 20 替換成 9,,則循環(huán)中的語句將永遠不會運行,。 在ChkLastWhile 過程中,,在條件變成 False 之前循環(huán)中的語句只執(zhí)行一次,。
Sub ChkFirstWhile()
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
Sub ChkLastWhile()
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
② 直到條件變成 True 才重復語句
當使用 Until 關(guān)鍵字去檢查 Do...Loop 語句中的條件時,可以使用兩種方法,??梢栽谶M入循環(huán)之前檢查條件(如同 ChkFirstUntil 過程所示),也可以在循環(huán)至少運行一次之后才檢查條件(如同 ChkLastUntil 過程所示),。當條件仍然為 False 時,,循環(huán)繼續(xù)。
Sub ChkFirstUntil()
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
Sub ChkLastUntil()
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
③ 從循環(huán)內(nèi)退出 Do...Loop 語句
可以使用 Exit Do 語句來退出 Do...Loop 語句。例如,,為了退出無窮循環(huán),,可以在 If...Then...Else 語句或是 Select Case 語句的 True 語句塊中使用 Exit Do 語句。如果條件為 False,,則循環(huán)會象通常那樣運行,。
在下面的示例中,myNum 被賦予一個會造成無窮循環(huán)的值,。而 If...Then...Else 語句會去檢查這個情況然后退出,,以避免無窮循環(huán)。
Sub ExitExample()
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
注意:可以按 ESC 或 CTRL+BREAK 鍵來終止無窮循環(huán),。
2. For...Next 語句
可以使用 For...Next 語句去重復一個語句塊,,而它的次數(shù)的數(shù)字是指定的。For 循環(huán)使用一個計數(shù)變量,,當重復每個循環(huán)時它的值會增加或減少,。
下面的過程會讓計算機發(fā)出嗶聲 50 次。For 語句會指定計數(shù)變量 x 的開始與結(jié)束值,。Next 語句會將計數(shù)變量的值加 1,。
Sub Beeps()
For x = 1 To 50
Beep
Next x
End Sub
使用 Step 關(guān)鍵字,可以由所指定的值增加或減少計數(shù)變量,。在下面的示例中,,計數(shù)變量 j 會在每次循環(huán)重復時加上 2。當循環(huán)完成時,,total 的值為 2,、4、6,、8 和 10 的總合,。
Sub TwosTotal()
For j = 2 To 10 Step 2
total = total + j
Next j
MsgBox "The total is " & total
End Sub
為了減少計數(shù)變量的值,可以使用負的 Step 值,。為了減少計數(shù)變量的值,,必須指定一個小于開始值的結(jié)束值。在下面的示例中,,計數(shù)變量 myNum 會在每次循環(huán)重復時減去 2,。當循環(huán)完成時,total 的值為 16,、14,、12、10,、8,、6,、4 和 2 的總合。
Sub NewTotal()
For myNum = 16 To 2 Step -2
total = total + myNum
Next myNum
MsgBox "The total is " & total
End Sub
注意:在 Next 語句后面不必包含計數(shù)變量的名稱,。上述的示例中,,因為要具有可讀性才加上計數(shù)變量的名稱。
可以在計數(shù)變量到達它的結(jié)束值之前,,使用 Exit For 語句來退出 For...Next 語句,。例如,當錯誤發(fā)生時,,可以使用在 If...Then...Else 語句或是 Select Case 語句的 True 語句塊中的 Exit For 語句,,它是專門用來檢查此錯誤的。如果沒有錯誤發(fā)生,,則 If...Then...Else 語句的值為 False,,循環(huán)會象預期那樣的運行。
3. For Each...Next 語句
For Each...Next 語句會重復一個語句塊,,而它是作用于集合中的每個對象或是數(shù)組中的每個元素,。當循環(huán)執(zhí)行一次則 Visual Basic 會自動設置一個變量。例如,,下面的過程會關(guān)閉所有的窗體,,除了窗體包含的過程正在運行以外。
Sub CloseForms()
For Each frm In Application.Forms
If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close
Next
End Sub
下面的代碼會在數(shù)組的每個元素中循環(huán),,并且將每個值設置成它的索引變量 I 的值,。
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
對某范圍的單元格做循環(huán)
可以使用 For Each...Next 循環(huán)對某范圍的單元格做循環(huán)。下面的過程會對于 Sheet1 中的 A1:D10 范圍做循環(huán),,并將任何絕對值小于 0.01 的號碼設為 0,。
Sub RoundToZero()
For Each myObject in myCollection
If Abs(myObject.Value) < 0.01 Then myObject.Value = 0
Next
End Sub
在完成前退出 For Each...Next 循環(huán)
可以使用 Exit For 語句來退出 For Each...Next 循環(huán)。例如,,當錯誤發(fā)生時可以在 If...Then...Else 語句或是 Select Case 語句的 True 語句塊中使用 Exit For 語句,,它是專門用來檢查此錯誤的。如果沒有錯誤發(fā)生,,If...Then...Else 語句的值為 False,,則循環(huán)會象預期那樣運行。
下面的示例,,測試在 A1:B5 范圍內(nèi)找出第一個不含數(shù)值的單元,。如果有找到此類單元,則會有信息顯示并用 Exit For 語句退出循環(huán),。
Sub TestForNumbers()
For Each myObject In MyCollection
If IsNumeric(myObject.Value) = False Then
MsgBox "Object contains a non-numeric value."
Exit For
End If
Next c
End Sub
4. With 語句
With 語句是指定同一個對象(或?qū)傩裕┑囊幌盗杏脩舳x類型的簡化格式,。With 語句使過程運行得更快并且?guī)椭苊夥磸偷逆I入代碼,。
下面的示例將某一范圍的單元格都填入 30,,字體使用黑體格式,,并將內(nèi)部單元格顏色設置成黃色。
Sub FormatRange()
With Worksheets("Sheet1").Range("A1:C10")
.Value = 30
.Font.Bold = True
.Interior.Color = RGB(255, 255, 0)
End With
End Sub
可以將 With 語句嵌套的使用,,如此將更具有效率,。下面的示例在 A1 這個存儲單元格中插入一個公式,然后格式化字體,。
Sub MyInput()
With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1)
.Formula = "=SQRT(50)"
With .Font
.Name = "Arial"
.Bold = True
.Size = 8
End With
End With
End Sub
4.1.5 Sub 過程
Sub 過程是一系列由 Sub 和 End Sub 語句所包含起來的 Visual Basic 語句,,它們會執(zhí)行動作卻不能返回一個值,。Sub 過程可有參數(shù),,例如常數(shù)、變量,、或是表達式等來調(diào)用它,。如果一個 Sub 過程沒有參數(shù),則它的 Sub 語句必須包含一個空的圓括號,。下面 Sub 過程是4.3中的一部分,,每一行都有注釋來解釋它的作用:
' 響應地形點視距極座標計算表“選擇按鈕”過程
‘聲明工作表1私有的過程dxdzbButton1_Click()…End Sub
Private Sub dxdzbButton1_Click()
Dim xzan As String ‘ 聲明變量xzan
Dim msg, style, title, response ‘ 聲明變量msg, style, title, response
Application.AskToUpdateLinks = False ‘ 取消Excel的更新鏈接
Sheet1.Visible = xlSheetVisible ‘ 設置Sheet1(“地形點”)可見
Sheet3.Visible = xlSheetVisible ‘ 設置Sheet3(“操作指南”)可見
Sheet2.Visible = xlSheetHidden ‘ 設置Sheet2(“表面積”)不可見
Sheet1.Activate ‘ 激活Sheet1
Range("J4").Select ‘ 選擇J4單元格
‘ 輸入公式"=COUNTA(R[1]C[-8]:R[396]C[-8])",計算B5:B400有數(shù)字的單元格的數(shù)量
ActiveCell.FormulaR1C1 =
‘ 在K5單元格輸入公式,,將點的坐標數(shù)據(jù)轉(zhuǎn)換成cass的展點文件格式
Range("K5").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-9]=0,0,RC[-9]&"",""&"",""&RC[-3]&"",""&RC[-4]&"",""&RC[-2])"
‘ 將K5單元格的公式自動填充到K100
Range("K5").Select
Selection.AutoFill Destination:=Range("K5:K100"), Type:=xlFillDefault
‘ 在F2單元格輸入公式,,自動顯示系統(tǒng)日期
Range("F2").Select
ActiveCell.FormulaR1C1 = "=Today()"
‘ 設置隱藏工作表活動窗口0值
ActiveWindow.DisplayZeros = False
‘ 卸載自編函數(shù)"新增測繪、工程,、科學計算函數(shù)1.0"加載宏
AddIns("新增測繪,、工程、科學計算函數(shù)1.0").Installed = False
‘ 選擇A5單元格
Range("A5").Select
ks: ‘ 表示開始的標號,,用于程序轉(zhuǎn)移的目標
‘ 賦值語句,,將InputBox()函數(shù)的返回值賦予變量xzan,InputBox()函數(shù)會出現(xiàn)一個標題為”請選擇項目”(不含“”)的輸入框,,依據(jù)選擇項目輸入相應的數(shù)字
xzan = InputBox("0,→清空,;1,→算表面積;2.寫入公式-10,; 3,計算-100", ”請選擇項目”)
‘ 條件語句,,當xzan = "",程序轉(zhuǎn)移到標號js,,否則執(zhí)行下面語句
If xzan = "" Then GoTo js
‘ Select Case xzan ……End Select語句,,依據(jù)xzan選擇Case "i"
Select Case xzan
‘ 當在輸入框輸入0時,程序執(zhí)行Case "0"下的語句體
Case "0"
msg = "確實要清空嗎,?" ‘ 賦值語句
style = vbYesNo + vbInformation + vbDefaultButton2 ‘ 賦值語句
title = "提示" ‘ 賦值語句
= MsgBox(msg, style, title) ‘ 賦值語句,,response= MsgBox(msg, style, title)函數(shù)(提示框)返回值
‘ 條件語句,response = vbYes(在提示框單擊“是”)執(zhí)行Then后的語句體:清除A5:I400區(qū)域內(nèi)容
If response = vbYes Then
Range("A5:I400").Select
Selection.ClearContents
Range("A5").Select
‘ 條件語句,,否則response = vbNo,,則結(jié)束條件語句
ElseIf response = vbNo Then
End If
‘ 當在輸入框輸入1時,,程序執(zhí)行Case "1"下的語句體
Case "1"
…………
…………
'結(jié)束 Sub 過程
End Sub
當上述過程是響應地形點視距極座標計算表自定義菜單“地形點坐標”時,只需將過程名稱改一下:
Private Sub dxdzb ()
‘ 上述過程語句體不變
……
End Sub
4.1.6 Function 過程
Function 過程是一系列由 Function 和 End Function 語句所包含起來的 Visual Basic 語句,。Function 過程和 Sub 過程很類似,,但函數(shù)可以返回一個值。Function 過程可經(jīng)由調(diào)用過程通過傳遞參數(shù),,例如常數(shù),、變量、或是表達式等來調(diào)用它,。如果一個 Function 過程沒有參數(shù),,它的 Function 語句必須包含一個空的圓括號。函數(shù)會在過程的一個或多個語句中指定一個值給函數(shù)名稱來返回值,。
在下面的示例中,,Celsius 函數(shù)會根據(jù)華式溫度來計算攝氏溫度。當 Main 過程調(diào)用此函數(shù)時,,會有一包含參數(shù)值的變量傳遞給此函數(shù),。而計算的結(jié)果會返回到調(diào)用的過程,并且顯示在一個消息框中,。
Sub Main()
temp = Application.InputBox(Prompt:= _
"Please enter the temperature in degrees F.", Type:=1)
MsgBox "The temperature is " & Celsius(temp) & " degrees C."
End Sub
Function Celsius(fDegrees)
Celsius = (fDegrees - 32) * 5 / 9
End Function
4.1.7 寫 Visual Basic 語句
Visual Basic 中的語句是一個完整的命令,。它可以包含關(guān)鍵字、運算符,、變量,、常數(shù),以及表達式,。每一個語句都屬于下列三種分類之一:
聲明語句,,它會為變量、常數(shù),、或程序取名稱,,并且指定一個數(shù)據(jù)類型。
賦值語句,,它會指定一個值或表達式給變量或常數(shù),。
可執(zhí)行語句,它會初始化動作,。它可以執(zhí)行一個方法或是函數(shù),,并且可以循環(huán)或從代碼塊中分支執(zhí)行??蓤?zhí)行的語句通常包含數(shù)學的或條件的運算符,。
將語句連續(xù)地寫在數(shù)行上
通常是將一個語句寫在同一行中,但也可以利用一個續(xù)行符(空格_)將語句連續(xù)到下一行中,。下面的示例中,,可執(zhí)行語句 MsgBox 被接續(xù)的寫在三行中:
Sub DemoBox() '該過程聲明一個字符串變量,,
'指定它值為 Claudia,然后顯示一個
'連接的消息,。
Dim myVar As String
myVar = "朋友"
MsgBox Prompt:="您好" & myVar, _
Title:="問候框", _
Buttons:=vbExclamation
End Sub
添加注釋
注釋可以為讀代碼的人解釋過程或是特別的命令。Visual Basic 在運行過程時,,會忽略掉注釋,。注釋行可由省略符號(')或 Rem 接著一個空格做為開始,并且可以加在過程的任何地方,。為了在語句的同一行中添加注釋,,必須在語句后面插入一個省略符號,然后加上注釋文本,。按照缺省規(guī)定,,注釋會以綠色文本顯示。
檢查語法錯誤
如果在鍵入一行代碼后按下 ENTER 鍵,,此行代碼以紅色文本顯示(同時可能也顯示一個錯誤信息),,則必須找出語句中的錯誤并更正它。
4.2 電子表格專業(yè)計算編程的一般步驟
了解了VB編程基本語法后,,返回專業(yè)函數(shù)的編程是不是更明白了,?學習和實踐的過程就是這樣,需要反反復復,,才能弄明白,。下面就要用前面掌握的知識,在Microsoft Excel電子表格這個優(yōu)秀平臺上進行二次開發(fā),,徹底解決各類專業(yè)的復雜計算,。
首先,需要了解一下電子表格編程計算的一般步驟,。為了簡明,、清晰,還是用框圖來表示,。
4.3 實戰(zhàn):一個表面積測算系統(tǒng)
下面還是來實戰(zhàn)一下,,心才能踏實下來。選一個什么課題呢,?
在高速公路兩側(cè),,對施工中破壞的地表植被要實施地表綠化工程,這在工程驗收中就需要進行表面積的測算,。
表面積如何進行測算,?
如圖,測出地面點1,,2,,3,,4,5,,6,,7,8,,9的坐標Xi,、Yi和高程Hi,以空間三角形面積①~⑦來擬合地表面積,。
因此,,需要新編以空間三角形3頂點的坐標Xi, Yi, Hi為參數(shù),計算空間三角形面積函數(shù)Kjsjxp(),;以及空間任意兩點間的距離函數(shù)Sk(),;如果地面點是以視距極坐標施測,還需編制以視距測量觀測值:視距Di,,天頂距Zi,,方位角fwj,儀高ig,,覘高cg為參數(shù)的視距極坐標計算函數(shù)sjx(),, sjy(),sjh()以及角度以“度.分秒”為單位的三角函數(shù)Sind(),,Cosd(),,Tand(),“度.分秒”轉(zhuǎn)換成弧度的函數(shù)Rad()等,。將這些系統(tǒng)沒有的函數(shù)編制成一個公共模塊:打開Excel,,選擇“工具”→“宏”→“Visual Basic編輯器”→“插入”→“模塊”,在代碼編輯窗口中輸入如下函數(shù)代碼:
' 1. 常數(shù)
Public Const M_SEC# = 206264.8
Public Const M_DEG# = 57.2957795130823
Public Const M_RAD# = 1.74532925199433E-02
Public Const M_PI# = 3.14159265358979
' 2. “° ′ ″ ”角度轉(zhuǎn)換為弧度
Public Function Rad(ByVal angle As Double) As Double
Dim A As Double, B As Double, C As Double, D As Double
Dim ang As Double, sign As Integer
ang = Abs(angle) + 0.0000000000001: sign = Sgn(angle)
A = Int(ang): B = (ang - A) * 100#: C = Int(B): D = (B - C) * 100#
Rad = sign * (A + C / 60# + D / 3600#) * M_RAD
End Function
' 3. 正弦sind(度.分秒)
Public Function sind(ByVal x As Double) As Double
sind = Sin(Rad(x))
End Function
' 4. 余弦cosd(度.分秒)
Public Function cosd(ByVal x As Double) As Double
cosd = Cos(Rad(x))
End Function
' 5. 正切tand(度.分秒)
Public Function tand(ByVal x As Double) As Double
tand = Tan(Rad(x))
End Function
' 6. 余切ctnd(度.分秒)
Public Function ctnd(ByVal x As Double) As Double
ctnd = 1 / Tan(Rad(x) + 0.00000000000001)
End Function
' 7. 平面兩點間方位角
Public Function Fwj(ByVal xa As Double, ByVal ya As Double, ByVal xb As Double, ByVal yb As Double) As Double
Fwj = M_PI * (1 - Sgn(yb - ya) / 2) - Atn((xb - xa) / (yb - ya + 0.00000000000001))
End Function
' 8. 平面兩點間邊長
Public Function Sp(ByVal xa As Double, ByVal ya As Double, ByVal xb As Double, ByVal yb As Double) As Double
Sp = Round(Sqr((xb - xa) ^ 2 + (yb - ya) ^ 2), 4)
End Function
' 9. 視距坐標X
Public Function Sjx(ByVal di As Double, ByVal zi As Double, ByVal fwa As Double) As Double
Sjx = Round(di * sind(zi) ^ 2 * cosd(fwa), 2)
End Function
' 10. 視距坐標Y
Public Function Sjy(ByVal di As Double, ByVal zi As Double, ByVal fwa As Double) As Double
Sjy = Round(di * sind(zi) ^ 2 * sind(fwa), 2)
End Function
' 11. 視距高差
Public Function Sjh(ByVal di As Double, ByVal zi As Double, ByVal ig As Double, ByVal cg As Double) As Double
Sjh = Round(di * sind(zi) * cosd(zi) + ig - cg, 2)
End Function
' 12. 空間兩點間距離
Public Function Sk(ByVal xx1 As Double, ByVal yy1 As Double, ByVal hh1 As Double, ByVal xx2 As Double, _
ByVal yy2 As Double, ByVal hh2 As Double) As Double
Sk = Round(Sqr((xx2 - xx1) ^ 2 + (yy2 - yy1) ^ 2 + (hh2 - hh1) ^ 2), 6)
End Function
'13 空間三角形面積
Public Function Kjsjxp(ByVal x1 As Double, ByVal y1 As Double, ByVal h1 As Double, ByVal x2 As Double, _
ByVal y2 As Double, ByVal h2 As Double, ByVal x3 As Double, ByVal y3 As Double, ByVal h3 As Double) As Double
Dim A As Double, B As Double, C As Double, D As Double, s As Double
Dim xx1 As Double, yy1 As Double, hh1 As Double, xx2 As Double, yy2 As Double, hh2 As Double
If x1 = 0 Or x2 = 0 Or x3 = 0 Then GoTo js
xx1 = x1: yy1 = y1: hh1 = h1: xx2 = x2: yy2 = y2: hh2 = h2
A = Sk(ByVal xx1, yy1, hh1, xx2, yy2, hh2)
xx1 = x2: yy1 = y2: hh1 = h2: xx2 = x3: yy2 = y3: hh2 = h3
B = Sk(ByVal xx1, yy1, hh1, xx2, yy2, hh2)
xx1 = x1: yy1 = y1: hh1 = h1: xx2 = x3: yy2 = y3: hh2 = h3
C = Sk(ByVal xx1, yy1, hh1, xx2, yy2, hh2)
D = (A + B + C) / 2
Kjsjxp = Round(Sqr(D * (D - A) * (D - B) * (D - C)), 3)
js:
End Function
' 14. 正三角截柱重心坐標
Public Function Zsjjzx(ByVal x1 As Double, ByVal x2 As Double, ByVal x3 As Double) As Double
If x3 = 0 Or x2 = 0 Or x1 = 0 Then GoTo js
Zsjjzx = Int((x1 + x2 + x3) / 3)
js:
End Function
Public Function Zsjjzy(ByVal y1 As Double, ByVal y2 As Double, ByVal y3 As Double) As Double
If y3 = 0 Or y2 = 0 Or y1 = 0 Then GoTo js
Zsjjzy = Int((y1 + y2 + y3) / 3)
js:
End Function
進行編譯,,成功后退出,。
此外,依據(jù)計算表的設計,,需要調(diào)用的常用系統(tǒng)函數(shù)有:顯示日期“Today()”,,計算非空單元格個數(shù)“COUNTA(單元格區(qū)域)”,求和“SUM(單元格區(qū)域)”,,在數(shù)據(jù)區(qū)域中查找指定數(shù)據(jù)“VLOOKUP(RC[-1],dxdzb,6,False)”(在命名dxdzb的區(qū)域中查找與RC(-1)指定點號行完全匹配的相應的第6列數(shù)據(jù)),,等等。
接下來,,依據(jù)專業(yè)計算項目精心設計計算表式樣,。本實戰(zhàn)例:工作表1用來計算地形點坐標;工作表2用來計算表面積。設計式樣如下:
往下就是逐一對工作表進行編程:1. 對有關(guān)計算單元格用代碼寫入公式,;2. 手動或用代碼設置工作簿界面,;3. 手動或用代碼設置工作表選項。
工作表1:
1,, 選擇“視圖”→“工具欄”→“控件工具箱”→在J2單元格處拖出一個“命令按鈕”,,打開“屬性窗口”設置:①名稱=dxdzbButtonl;②Backcolor=選你喜歡的背景色,;③Caption=啟動計算,;④Font=宋體;⑤ForeColor=選你喜歡的前景色,;⑥PrintObject=False,;Shadow=True,。
2,, 雙擊“啟動計算”按鈕,進入“VB代碼編輯窗口”,,輸入如下代碼(‘ ***注釋語句,,輸入代碼時可省略):
' 地形點視距極座標計算表“選擇按鈕”過程
‘聲明工作表1私有的過程dxdzbButton1_Click()…End Sub
Private Sub dxdzbButton1_Click()
Dim xzan As String ‘ 聲明變量xzan
Dim msg, style, title, response ‘ 聲明變量msg, style, title, response
Application.AskToUpdateLinks = False ‘ 取消Excel的更新鏈接
Sheet1.Visible = xlSheetVisible ‘ 設置Sheet1(“地形點”)可見
Sheet3.Visible = xlSheetVisible ‘ 設置Sheet3(“操作指南”)可見
Sheet2.Visible = xlSheetHidden ‘ 設置Sheet2(“表面積”)不可見
Sheet1.Activate ‘ 激活Sheet1
Range("J4").Select ‘ 選擇J4單元格
‘ 輸入公式"=COUNTA(R[1]C[-8]:R[396]C[-8])",計算B5:B400有數(shù)字的單元格的數(shù)量
ActiveCell.FormulaR1C1 =
‘ 在K5單元格輸入公式,,將點的坐標數(shù)據(jù)轉(zhuǎn)換成cass的展點文件格式
Range("K5").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-9]=0,0,RC[-9]&"",""&"",""&RC[-3]&"",""&RC[-4]&"",""&RC[-2])"
‘ 將K5單元格的公式自動填充到K100
Range("K5").Select
Selection.AutoFill Destination:=Range("K5:K100"), Type:=xlFillDefault
‘ 在F2單元格輸入公式,,自動顯示系統(tǒng)日期
Range("F2").Select
ActiveCell.FormulaR1C1 = "=Today()"
‘ 設置隱藏工作表活動窗口0值
ActiveWindow.DisplayZeros = False
‘ 卸載自編函數(shù)"新增測繪、工程,、科學計算函數(shù)1.0"加載宏
AddIns("新增測繪,、工程、科學計算函數(shù)1.0").Installed = False
‘ 卸載A5單元格
Range("A5").Select
ks: ‘ 表示開始的標號,,用于程序轉(zhuǎn)移的目標
‘ 賦值語句,,將InputBox()函數(shù)的返回值賦予變量xzan,InputBox()函數(shù)會出現(xiàn)一個標題為”請選擇項目”(不含“”)的輸入框,,依據(jù)選擇項目輸入相應的數(shù)字
xzan = InputBox("0,→清空,;1,→算表面積;2.寫入公式-10,; 3,計算-100", ”請選擇項目”)
‘ 條件語句,,當xzan = "",程序轉(zhuǎn)移到標號js,,否則執(zhí)行下面語句
If xzan = "" Then GoTo js
‘ Select Case xzan ……End Select語句,,依據(jù)xzan選擇Case "i"
Select Case xzan
‘ 當在輸入框輸入0時,程序執(zhí)行Case "0"下的語句體
Case "0"
msg = "確實要清空嗎,?" ‘ 賦值語句
style = vbYesNo + vbInformation + vbDefaultButton2 ‘ 賦值語句
title = "提示" ‘ 賦值語句
= MsgBox(msg, style, title) ‘ 賦值語句,,response= MsgBox(msg, style, title)函數(shù)(提示框)返回值
‘ 條件語句,response = vbYes(在提示框單擊“是”)執(zhí)行Then后的語句體:清除A5:I400區(qū)域內(nèi)容
If response = vbYes Then
Range("A5:I400").Select
Selection.ClearContents
Range("A5").Select
‘ 條件語句,否則response = vbNo,,則結(jié)束條件語句
ElseIf response = vbNo Then
End If
‘ 當在輸入框輸入1時,,程序執(zhí)行Case "1"下的語句體
Case "1"
msg = "確定進入表面積計算嗎?"
style = vbYesNo + vbInformation + vbDefaultButton2
title = "提示"
response = MsgBox(msg, style, title)
If response = vbYes Then
Sheet2.Visible = xlSheetVisible
Sheet3.Visible = xlSheetVisible
Sheet1.Visible = xlSheetHidden
Sheet2.Activate
ElseIf response = vbNo Then GoTo ks
End If
‘ 當在輸入框輸入2時,,程序執(zhí)行Case "2"下的語句體:在G6,H6,I6單元格輸入公式
Case "2"
Range("G6").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-4]=0,0,sjx(RC[-4],RC[-2],RC[-1])+R5C7)"
Range("H6").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-5]=0,0,sjy(RC[-5],RC[-3],RC[-2])+R5C8)"
Range("I6").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-6]=0,0,sjh(RC[-6],RC[-4],R6C1,RC[-5])+R5C9)"
‘ 對G6,H6,I6單元格公式自動填充到第10行
Range("G6:I6").Select
Selection.AutoFill Destination:=Range("G6:I10"), Type:=xlFillDefault
‘ 顯示消息框:提示下面的操作,,并依據(jù)響應的操作退出
msg = "請在編輯欄修改I6單元格公式:將公式中的絕對引用改為相應數(shù)據(jù)(儀高、起算高程),;并對G6,H6的公式中的絕對引用作同樣的修改,;然后選擇項目“3”…* 注意:每一新測站都應該對起算數(shù)據(jù)進行相應的修改,然后按常規(guī)用鼠標進行拖拉填充,!"
style = vbYesNo + vbInformation + vbDefaultButton2
title = "提示"
response = MsgBox(msg, style, title)
If response = vbYes Or response = vbNo Then
GoTo js
End If
‘ 當在輸入框輸入3時,,程序執(zhí)行Case "3"下的語句體:自動填充"G6:I100"
Case "3"
Range("G6:I6").Select
Selection.AutoFill Destination:=Range("G6:I100"), Type:=xlFillDefault
Range("G50").Select
GoTo js
End Select
js:
End Sub
工作表2:
操作與工作表1中1,2,,相似,,代碼如下:
' 表面積計算“選擇按鈕”過程宏
Private Sub bmjjsButton1_Click()
Dim xzan As String
Dim msg, style, title, response
Application.AskToUpdateLinks = False
Sheet2.Visible = xlSheetVisible
Sheet3.Visible = xlSheetVisible
Sheet1.Visible = xlSheetVisible
Sheet1.Activate
ActiveWorkbook.Names.Add Name:="dxdzb", RefersToR1C1:="=地形點!R5C2:R400C9"
Sheet1.Visible = xlSheetHidden
Sheet2.Activate
Range("E6").Select
ActiveCell.FormulaR1C1 = "=COUNTA(R[1]C:R[394]C)"
Range("E3").Select
ActiveCell.FormulaR1C1 = "=SUM(R[4]C[3]:R[397]C[3])"
Range("I6").Select
ActiveCell.FormulaR1C1 = "=COUNTA(R[1]C[-8]:R[394]C[-8])"
Range("J7").Select
ActiveCell.FormulaR1C1= _
"=IF(RC[-5]=0,0,RC[-5]&"",""&"",""&RC[-3]&"",""&RC[-4]&"",""&RC[-2])"
Range("J7").Select
Selection.AutoFill Destination:=Range("J7:J100"), Type:=xlFillDefault
Range("E2").Select
ActiveCell.FormulaR1C1 = "=Today()"
ActiveWindow.DisplayZeros = False ' 隱藏窗口0值★
Range("A7").Select
ks:
xzan = InputBox("0,清空;1,→地形點計算,;2.寫入公式-100 ",”請選擇項目”)
If xzan = "" Then GoTo js
Select Case xzan
Case "0"
msg = "確實要清空嗎,?"
style = vbYesNo + vbInformation + vbDefaultButton2
title = "提示"
response = MsgBox(msg, style, title)
If response = vbYes Then
Range("B7:J400").Select
Selection.ClearContents
Range("A7").Select
ElseIf response = vbNo Then
End If
Case "1"
msg = "確定進入地形點計算嗎?"
style = vbYesNo + vbInformation + vbDefaultButton2
title = "提示"
response = MsgBox(msg, style, title)
If response = vbYes Then
Sheet1.Visible = xlSheetVisible
Sheet3.Visible = xlSheetVisible
Sheet2.Visible = xlSheetHidden
Sheet1.Activate
ElseIf response = vbNo Then GoTo ks
End If
Case "2"
Sheet2.Activate
Range("B7").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,0,VLOOKUP(RC[-1],dxdzb,6,False))"
Range("C7").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-2]=0,0,VLOOKUP(RC[-2],dxdzb,7,False))"
Range("D7").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-3]=0,0,VLOOKUP(RC[-3],dxdzb,8,False))"
Range("F7").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-4]=0,0,zsjjzx(RC[-4],R[1]C[-4],R[2]C[-4]))"
Range("G7").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-4]=0,0,zsjjzy(RC[-4],R[1]C[-4],R[2]C[-4]))"
Range("H7").Select
ActiveCell.FormulaR1C1 = _
"=IF(R[2]C[-6]=0,0,kjsjxp(RC[-6],RC[-5],RC[-4],R[1]C[-6],R[1]C[-5],R[1]C[-4],R[2]C[-6],R[2]C[-5],R[2]C[-4]))"
Range("B7:D7").Select
Selection.AutoFill Destination:=Range("B7:D100"), Type:=xlFillDefault
Range("F7:H7").Select
Selection.AutoFill Destination:=Range("F7:H100"), Type:=xlFillDefault
Range("E100").Select
‘ 顯示消息框:提示下面的操作,,并依據(jù)響應的操作退出
msg = "公式僅自動填充至100行,,超過100行,按常規(guī)用鼠標從100開始進行拖拉填充,!"
style = vbYesNo + vbInformation + vbDefaultButton2
title = "提示"
response = MsgBox(msg, style, title)
If response = vbYes Or response = vbNo Then
GoTo js
End If
End Select
js:
End Sub
工作表3(操作指南):
在工作表3插入一個文本框,寫進有關(guān)計算操作的說明,。
過程代碼輸入完成后,,進行編譯,,然后對程序進行保護:在“VB編輯器”窗口,單擊“工具”→“VBAProject屬性…”→“保護”,,選定“查看時鎖定工程”,,輸入兩個相同密碼,“確定”,,退出“VB編輯器”,。
接下來,,如果你還想對工作表的外觀界面進一步設置,,如:隱藏“工具欄”,,“狀態(tài)欄”…以及其它設置,,你可以按常規(guī)操作(勾銷“工具欄”的所有選項及菜單欄“工具”→“選項”下的顯示項目)進行設置,當然也可根據(jù)需要用代碼進行設置,,這都不是重要的,。
最后“保存”,,OK,!一個實用的表面積計算系統(tǒng)編制完成,。
仿照上述操作過程,,你已經(jīng)可以對專業(yè)計算項目進行編程自動化計算了。
寫在后面前面所寫的,只是我對電子表格VBA編程,,解決專業(yè)復雜計算探索中的一點心得。對電子表格VBA編程來說,,這僅僅是個“開始”,。事情就是這樣,,越是深入進去,越是感到知識的浩瀚和自己的無知,。我在探索中的最重要的心得就是:編程并不難,,代碼是規(guī)定的,解決問題的思路才是最最關(guān)鍵的,。根據(jù)思路去“幫助”中找代碼,在學代碼中調(diào)整思路,,邊學,、邊積累,、邊提高,這是學習VBA編程的最好途徑。希望專家,、高手們寫一些“菜鳥”看得懂,用的上,,推的開的書來提高一下,,這將是對非編程專業(yè)的廣大科技界,、工程界……的朋友們的一大貢獻,。我的這點心得,,權(quán)當拋磚引玉……,。 |
|