excel vba統計數量?第三章 變量第一節 計算機中對信息的保存形式,今天小編就來說說關于excel vba統計數量?下面更多詳細答案一起來看看吧!
第三章 變量
第一節 計算機中對信息的保存形式
3.1.1進制
在小學階段,我們就知道,在書寫一個數字的時候,按照從高位到低位的原則書寫,高位上的1代表相鄰低位上的10. 我們不妨再回憶一下這一部分的内容,這将對于我們理解進制有着非常大的幫助:
例如156這個數字,我們讀作”一百五十六”。而當我們寫下這個數字的時候,為啥就默認它等于1個一百,5個十,以及6個1組成的呢?這是因為,一般情況下,我們采用10進制來記錄一個數字,所謂10進制,就是”逢10進1”,如果我們進一步把這個156用10進制的方式拆開,就是1*102 5*101 6*100.這裡可以看到,”個位”上的數字自動認為是100,”十位”上的數字自動認為是101,”百位”上的數字自動認為是102.
然而,在現實生活中,并不是所有的進制都是10進制,最典型的例子是時間,在時間的表示中,1天等于24小時,這個是24進制,也就是”逢24進1”;1小時等于60分鐘,1分鐘等于60秒,這裡是60進制,即”逢60進1”;1年等于12個月,這是12進制……
那麼現在有一個問題,2天13小時12分20秒等于多少秒,這個時間由如何表示?對于這個時間我們是否可以表示為2:13:12:20 ? 當然可以,這裡每兩個”小結”之間的進制不再是10進制了。那麼,不同的進制有什麼不一樣呢?我們知道,在10進制中,所有的數字為0~9,共計9個數字,所有的數都是由這9個數組成。而在過去的年代,我們采用”十六兩稱”的時候,即一斤等于16兩。如何表示1斤12兩這樣的數呢?此時,由于12兩不等于1斤,也不到當時的一斤,所以我們這樣表示當然是不對的,正确的表示方式是:C兩。在16進制中,我們引入A、B、C、D、E、F這五個字母表示大于等于10,且沒有達到16的5個數字,即A代表10,B代表11……,那麼相對于10進制,16進制就需要有16個”數字”構成,分别是從0~F。在音樂中,這個進制為8,即逢8進1,(隻有7個音符,第8個音符與第一個音符唱名相同)。在8進制中,10等于10進制中的8.因此,8進制數需要用0~7,共計8個”數字”構成。
從上面的論述可以看到,任何一個進制的數,其采用的數字的個數等于進制單位。如何表示不同進行的數字呢?一般情況下,10進制的數字按照原來的方式寫即可,其他進制的數字,在書寫的時候,數字兩邊加上小括号,并在右下角寫上進制的方法,用于相互區分,例如,16進制中的數字12,表示為(12)16. 8進制中的數字27,表示為(27)8.二進制中的數字101,表示為(101)2.
3.1.2 進制直接的相互換算
(1)其他進制轉換為10進制
其他進制轉化為10進制的方法比較簡單,隻需要”安位置”計算即可。我們可以參考10進制的計算原則,例如137=1*102 3*101 7*100,計算一下16進制的12C:
(12C)16=1*162 2*161 12*160=300.
同樣的原理,可可以計算一下8進制下的45. (45)8=4*8 5=37.
(2) 10進制數轉換為其他進制
将10進制數轉化為其他進制數的方法是:用10進制數除以需要轉換成為的進制,餘數作為”各位”,然後商再除以進制,餘數作為”十位”,然後依次類推,直到是這個十進制數除以進制後商等于0,将最後的餘數作為最高位。
例如:将10進制數的25轉換為2進制數,則進行如下運算:
第一輪:25除以2,商為12,餘數為1.于是,第一位是1,商不等于0,進行第二輪。
第二輪:12除以2,商為6,餘數為0,于是,第二位是0,商不等于0,進行第三輪。
第三輪:6除以2,商為3,餘數是0,于是,第三位是0,商不等于0,進行第四輪。
第四輪:3除以2,商為1,餘數是1,于是,第四位是1,商不等于0,進行第五輪。
第五輪:1除以2,商為0,餘數是1,于是,第五位是1,商等于0,結束
于是。25化為2進制數便是(11001)2. (即上面的餘數按照從低位到高位的順序寫)。
3.1.3計算機對信息的保存形式
計算機中,所有的信息都是以2進制的方式進行保存的。為什麼計算機采用2進制保存信息?簡單來說,2進制保存信息時,所需要的原件種類最少,原件結構最為簡單!不妨想象一下,假設計算機以10進制來保存信息,那麼勢必需要一種能夠表示10個不同狀态的原件。而在電子原件中,讓一個原件可以有10種不同的狀态,遠遠比讓一個原件隻有兩種不同的狀态複雜!
在日常生活中,最常見到的2進制是開關,開關對于電路來說最為簡單,假設開的狀态我們表示為1,而關的狀态表示為0,那麼,我們隻需要4個開關,就可以表示16進制中從0~F,這16個不同的數。
第一個開關 第二個開關 第三個開關 第四個開關 表示的數字
0 0 0 0 0
0 0 0 1 1
0 0 1 0 2
0 0 1 1 3
0 1 0 0 4
0 1 0 1 5
0 1 1 0 6
0 1 1 1 7
1 0 0 0 8
1 0 0 1 9
1 0 1 0 A
1 0 1 1 B
1 1 0 0 C
1 1 0 1 D
1 1 1 0 E
1 1 1 1 F
3.1.4 原碼和補碼
計算機中,最基本的儲存單位是字節Byte,一個字節由8個上面說到的”元件”組成。一個字節可以表示的數字範圍為0~255(在上面的例子中,4個開關最多表示16種不同的情況,即16個數字)以計算機中最常見的整型為例,一個整形數據是有2個Byte組成,讀者可以思考一下其表示的數字範圍是多少?
原碼:在計算機中,一個數字轉化為2進制後,就是這個數字在計算機中的”原碼”。例如,數字5在計算機中的原碼為:0000000000000101。
補碼:在原碼的基礎上,将原碼中的0轉換為1,1轉換為0,最後再加上1。例如,數字5在計算機中的補碼為:1111111111111011。
在計算機中,正數以原碼的形式表示,而負數以補碼的形式表示,上面的例子中,5,在計算機中為0000000000000101,而-5為1111111111111011。
負數儲存為補碼的好處:當負數表示為補碼以後,減法運算可以簡化為加法運算!例如,5-5=0,在計算機中,其運算為5 (-5),即0000000000000101 1111111111111011。我們可以看到,因為2進制中為”逢2進1”因此,0 0=0,1 0=1,0 1=1,1 1=10,這個0000000000000101 1111111111111011運算後,等于10000000000000000.而計算機中,一個整形最多保存16位,所以,最前面的那個1将會被”丢失”掉,最後這16個位置上的數正好全部歸零。
3.1.5 ASCII碼表
以上我們探讨了計算機對于整數的保存和運算形式,接下來我們來探讨一下計算機對于字母和符号的保存。與數字的保存形式一緻,計算機也是采用2進制的方式保存字母和符号,計算機中,将特定的符号按照ASCII字母表的方式同一個byte(0-255)中的數相互對應。所謂ASCALL表,其全稱是American Standard Code For Information Interchange,即美國信息交換标準代碼。
ASCII數值 字符 ASCII數值 字符 ASCII數值 字符 ASCII數值 字符
0 NUL 32 Space 64 @ 96 ·
1 SOH 33 ! 65 A 97 a
2 STX 34 “ 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 ‘ 71 G 103 g
8 BS 40 ( 72 H 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DC1 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 TB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 / 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 `
31 US 63 ? 95 _ 127 DEL
第二節 VBA數據類型
3.2.1 數據類型和VBA的數據類型
數據在計算機中的儲存方式成為數據類型,在上面一節中,曾經中提到,在計算機中,一個整形數據的儲存形式,是2個字節範圍。數據隻有以一定的數據類型儲存起來才具有意義。VBA中支持的數據類型以及該種數據類型表示的數據範圍如下。
數據類型 儲存空間 能夠表示的範圍
Byte 1個字節 0~255
Boolean 2個字節 True或者False
Integer 2個字節 -32768~32767
Long 4個字節 -2147483648~2147483647
Single 4個字節 -3.4E38~-1.4E-45,1.4E-45~3.4E38
Double 8個字節 -1.79E308~-4.8E-324,4.8E-324~1.79E308
Currency 8個字節 -9.22E18~9.22E18
Decimal 14個字節 ±7.9E20範圍内整數,28位小數:±7.9,最小非零1E-25
Date 8個字節 100年1月1日~9999年12月31日
String(變長) 10個字節 0~2E9字符
String(定長) 字符串長度 1~6E4字符
Variant(數字) 16個字節 任何數字,最大可以到Double範圍
Variant(字符) 22個字節 與String(變長)相同
Type(用戶自定義) Type中字節 等于Type中所有基礎數據類型表示範圍
對象型 與對象有關 等于對象最大表示範圍
3.2.2 VBA數據類型
1用于儲存邏輯型數據和整數型數據的類型
有Byte型、Boolean型、Integer型、Long型。Byte型,用于儲存一個介于0~255之間的整數。Boolean型,用于儲存邏輯數值,僅僅可以儲存兩個”邏輯數值”,即”True”或者”False”。Integer型和Long型,分别用于儲存整形數據,Integer型的儲存空間為2個字符,Long的儲存空間為8個字符。
一個Integer型的數據,可以儲存的最大數據是32767,如果讓一個32767的整形數據再加上1,将會發生著名的”溢出錯誤”,即加完之後等于-32768。為什麼會發生如此的情況呢?
在計算機中,最高位上的數表示這個數據的”符号”,最高位上等于0時,表示這個數是正數,按照”原碼”的原則儲存的;最高位是1時,表示這個數是負數,按照”補碼”的原則儲存的。(詳見3.1.4原碼和補碼),所以,在計算機中進行32767 1運算時會發生如下的情況:32767=(0111111111111111)2,32767 1=(0111111111111111)2 (1)2=(1000000000000000)2,而這個數,正好是32768的補碼,所以,等于-32768。
2 用于儲存小數的數據類型
有Single型、Double型、Currency型、Decimal型,其中,Single型為4個字節,Double型為8個字節,Currency型為”貨币類型”,可以儲存沒有小數的數據(整數),也可以儲存有小數的數據,并且根據小數點的位置,其表示範圍是可以變化的,Decimal型也具有這種儲存方式,其精确程度在所有數據型類型中最高。
這裡要說明的是,這些類型除了同樣會有”溢出錯誤”以外,對于一個小數,計算機并不能完全儲存小數點後的無限多的位置,所以,在計算機中,保存的小數位有限的情況下,後面的小數位将自動被”四舍五入”忽略。其中一個例子是,一個Single型的數據,等于1/3,然後讓這個Single型數據再乘以3,結果将會是0.9999999999……。
3 用于保存日期的數據類型
在VBA中,有一個用于保存日期的數據類型,即Data型,Data型的數據可以直接想減,得到的數字為兩個日期直接相隔的天數。
4 用于保存字符串的數據類型
String(變長)型:當字符串的長度不确定時,用String(變長)型來儲存,用這種類型來保存字符串時,會自動在字符串前端加上字符串的長度,此時,占有的儲存空間大小為10個字符 字符串長度。
String(定長)型:當字符串長度确定時,用String(定長)型來存儲,這種類型保存字符串,保存長度等于字符串長度。
注意的一點是,當字符串中有漢字時,一個漢字或者一個漢字符号等于兩個字符!(詳見國标2312,GB2312)
5 變體型
當儲存類型暫時不能确定時,VBA給用戶提供了一種可以”通用”的類型,即Variant,使用這種類型數據時,用戶不必擔心所需要儲存的數據是那種類型,而是編譯器會自動根據實際數據的類型進行轉換,然後再儲存。
6 Type型
VBA允許用戶自定義數據類型,自定義的數據類型由上述基礎的數據類型構成,這種數據類型叫做結構體,我們将在數值與結構體一章中詳細講解。
用戶自定義的結構體的儲存空間大小,等于結構體中所有成員的儲存空間大小之和。
7 對象類型
實際上,可以把對象類型看成一個結構體類型,不同的是,這種結構體是系統自帶的,即VBA内部所支持的一個”類”。
第三節 變量和運算
3.3.1 變量
變量就是計算機中被命名的一個儲存位置。不妨把變量想象成一個容器,在這個容器中,儲存的是程序運算過程中可以改變的”數據”或者”對象”。也可以把變量想象成中學課本中的”未知數”,這些”未知數”可以改變,也可以參與求解運算。
3.3.2 變量的聲明
在使用一個變量前,需要在計算機中進行聲明該變量,即向系統說明,現在有這麼一個變量。VBA聲明變量的命令是: Dim 變量名 As 類型、Public 變量名 As 類型、Private 變量名 As 類型、Static 變量名As 類型。這裡,隻講解第一種聲明形式,剩下的聲明形式在變量使用範圍中講解。
在命令”Dim 變量名 As 變量類型”中,變量名可以用英文字母、數字、下劃線以及其組合,類型可以用上述類型中的任何一個類型。
例如:
Dim A As Integer
這一條命令即聲明一個名字叫做”A”的整形變量。
Dim B As String(5)
這一條命令聲明了一個名字叫做”B”的字符串變量,這個B的長度為5個字符。
Dim C As String
這一條命令聲明了一個名字叫做’C”的字符串變量。C長度不确定。
Dim A As Integer, B As String
這一條命令一次性聲明了兩個變量,第一個是名字為A的整形變量,第二個是名字為B的字符串型變量。
對于數字和字符串的規定:VBA中規定,所有雙引号中的内容,均被當作字符串進制處理,而沒有雙引号的内容當作數字、變量或者函數、過程處理。對于變量名稱大小寫的規定:VBA中,變量名稱不區分大小寫,即在VBA中,整形變量A和a,VBA認為是一個變量,VBE在第二次遇到相同的變量時,會自動把變量名稱修改為與第一次的名稱形式相同。
對于隐式聲明和顯示聲明的規定:在VBA中,可以不用聲明一個變量而直接使用,這時,編譯器自動将第一次使用的該變量(隐式地)聲明為變體型。變體型數據将會造成程序運行速度減慢,為了杜絕這一現象,可以讓VBA強制采用顯示聲明的辦法,即在程序開頭的位置加上Option Explicit。加上該命令後,必須先顯示聲明變量才可以使用該變量。
3.3.3 變量的運算
既然變量是一個”數據”那麼,就有同數據一樣的參與運算的功能,那麼,對變量進行的任何操作都可以稱為變量的”運算”,我們可以根據在變量中儲存的東西是數據或者對象,将變量分為數值變量和對象變量。下面将講解變量的運算。
1. 賦值運算
變量最基礎的運算便是”賦值運算”,也就是把一個數或者對象通過”賦值”的方法”複制”到變量中。在VBA中,賦值運算的方法有兩種:Let 變量=表達式 或者Set 變量=表達式。Let用于數值變量的賦值,Set用于對對象變量的賦值。在”Let 變量=表達式”中,Let可以省略 所以,對于數值變量的賦值就簡化成了”變量=表達式”
在上面這個式子中,變量一定要位于”=“符号的左邊,而”=“符号的右邊可以是任意的數學運算、判斷運算或者字符串運算等。這個”=“不再是數學中的”等于”的意思,而是将右邊的數字、字符或者邏輯值進行運算,然後把右邊的結果複制給左邊的變量。例如
a=a 1
這一個命令是,把原來變量a的數值加上1,然後再賦值給變量a,命令結束後,a的數值在原先基礎上加了1.
2. 數學運算
VBA中支持許多數學運算,相關的數學運算有:
(1)四則運算:加法” ”,減法”-”,乘法”*”,除法”/”,整除”\”,取餘數”Mod”運算。例如:”5 2”,”7-4”,”4/3” ,”3\2”,”17 Mod 3” 等。下面我們着重講解除法和整除運算。
除法運算,即計算兩個數的除後的結果,這裡,如果運算後賦值給一個Single或者Double型将不會産生任何問題,但是,如果賦值給一個Integer或者Long型,将會産生一個小問題,請嘗試一下下面的程序:
Sub Test()
Dim A As Integer, B As Single
A=1/2
B=1/2
MsgBox(“A=“& A &” B=“ & B)
End Sub
将顯示”A=1 B=.5。這裡,B=.5的輸出我們暫且不去管它,這個輸出等價于B=0.5,也就是說,B的運算時完全正确的,但是A為什麼處于2以後任然等于1呢?
這是因為,我們在把例如0.5這樣的小時賦值給一個整數時,VBA系統自動給我們”四舍五入”了!
整除運算,在進行整除運算時,計算機自動給出除後的整數部分,而忽略小數部分,還是上面的程序,現在修改一下:
Sub Test2()
Dim A As Integer, B As Single
A=1\2
B=1\2
MsgBox(“A=“ & A & “ B=“ & B)
End Sub
再次運行,發現此時結果是”A=0 B=0”這是因為,在進行整除運算時,計算機隻取計算結果的整數部分,所以把一個整數賦值給一個小數或者整數,結果還是這個整數!
求餘數運算,Mod運算符可以求除法運算中的”餘數”,這個運算可以判斷一個數是否為偶數(奇數)(偶數對2的餘數等于0)。表達式 a Mod b表示求a對b的餘數。
Sub Test3()
Dim A As Integer
A=17 Mod 3
MsgBox(a)
End Sub
程序将輸出17對3的餘數,即2.
(2)取整運算:取整運算的結果是把一個小數取成整數。取整運算有兩種,即Int() 和Fix()。這兩者是有區别的,Int()運算是求不大于這個小數的整數,當小數大于0時,将返回小數的整數部分,當小數小于0時,将返回這個小數的整數部分減去1,而Fix()作用是返回小數的整數部分,無論小數大于0或者小于0,例如:Int(8.7)等于8,Fix(3.6)=3,而Int(-7.2)=-8,Fix(-7.2)=-7
(3)函數運算:VBA支持的函數運算有:幂運算”^”,表示求幂,例如3^2表示求3的2次方幂。Exp()表示求底數為e的幂。對數運算:Log() 表示求以e為底的對數。三角函數:Sin()、Cos()、Tan()表示求弧度情況下的正弦、餘弦、正切(注意括号内的數的單位為弧度)。随機函數:Rnd(),表示生成一個0~1之間的随機數。
3.邏輯運算
所謂邏輯運算,就是得到邏輯值True(真)或者邏輯值False(假)的運算,邏輯運算中,有邏輯值運算和邏輯值之間的運算。邏輯值運算就是得到一個命題為真或者為假的運算
VBA的邏輯值運算有:”>“,”<“,”<>“,”>=“,”<=“以及”=“
(1)大于運算 “>“ 判斷左邊是否大于右邊,例如3>5,結果為False請嘗試以下程序:
Sub Logisic()
Dim a As Boolean
a=3>5
Msgbox(a)
End Sub
正如所預料,得到結果”False”
(2)小于運算”<“判斷左邊的是否小于右邊。
(3)不等于運算”<>“ 判斷左右兩邊是否不等。
(4)等于運算”=“ 判斷左右兩邊的是否相等。
(5)大于等于運算”>=“判斷左邊是否大于或等于右邊。
(6)小于等于運算”<=“判斷左邊是否小于或等于右邊。
VBA中的邏輯數值之間的運算有:And、Or、Not、Eqv、Imp、Xor。
(1) And運算:計算兩個邏輯數值的”邏輯且”,隻有當And兩邊的兩個邏輯數均為Ture時,計算結果才為Ture。
(2) Or運算:計算兩個邏輯數值的”邏輯或”,當參與Or運算的兩個邏輯值其中一個為True時,結果為Ture,隻有兩個邏輯值均為”False”時,結果才為”False”
(3) Not運算:計算單一邏輯數值的”邏輯非”,當參與運算的邏輯值為Ture時,計算結果為False;當參與運算的邏輯值為False時,運算結果為True。
(4) Eqv運算:計算兩個邏輯數值的”邏輯等價”,當參與Eqv運算的兩個邏輯值的數值一緻時,即兩邊都為True或者都為False,結果為True;否則結果為False
(5) Imp運算:計算兩個邏輯數值的”邏輯蘊含”,當參與Imp運算的第一個邏輯數值為Ture,且第二個邏輯數值為False時,運算結果為False,其他情況下運算結果均為True。
(6) Xor運算:計算兩個邏輯數值的”異或”結果,即當兩個邏輯值中其中一個是True,一個是False時,運算結果為True,其他情況下,運算結果為False.
4. 字符串運算
(1) 判斷字符串大小運算,字符串大小比較的運算符,同邏輯比較運算符。在比較兩個字符串時,先比較字符串首字母ASCII碼的大小,如果一緻,則進行比較第二個字符的ASCII……,如果全部一緻,則兩個字符串大小一緻。
(2) 求字符串長度函數Len(),函數Len() 将返回一個整數,這個整數等于字符串的長度,請嘗試如下程序:
Sub StrLen()
Dim A As String, N As Integer
A=“I Love China”
N=Len(A)
MsgBox(N)
End Sub
運行結果顯示,N的數值為12,(空格也算字符!)
(3) 左側取字符函數Left(). 函數Left()返回從左側取字符串的結果,函數的用法是:Left(字符串,N)表示從字符串的左側取長度為N個字符後的結果。請嘗試一下下面的程序。
Sub L()
Dim A As String, B As String
A=“Microsoft Cooperation”
B=Left(A,5)
MsgBox(B)
End Sub
運行結果,從字符串”Microsoft Cooperation”中,從左側取5個字符,等于Micro。
(4) 右側去字符函數Right(). 函數Right()的用法和Left()一緻,不同的是,這個結果為從右側取字符。
(5) 從中間取字符函數 Mid().Mid()的用法是: Mid(字符串,開始位置,N),表示從字符串中開始位置(第多少個字符開始)取N個字符,請嘗試下列程序
Sub M()
Dim A As String, B As String
A=“I Came From China”
B=Mid(A,3,4)
MsgBox(B)
End Sub
運行結果:在字符串”I Came From China”中,從第3個字符開始取4個字符,得到”Came”。
(6) 獲取字符串2在字符串1中的起始位置。Instr()函數可以返回字符串1在字符串2中的位置。用法是Instr(開始位置,字符串1,字符串2),表示從字符串1的開始位置查找字符串2.請嘗試以下程序,若字符串2中沒有找到字符串1,則返回開始位置的數值減去1.
Sub I()
Dim A As String, B As String
A=“Microsoft Visual Basic For Applications”
B=“For”
MsgBox(Instr(1,A,B))
End Sub
運行結果。返回字符串”For”在字符串”Microsoft Visual Basic For Applications”中的位置,24.
這裡需要說明的是,如果字符串2中包含兩個或者兩個以上的字符串1,函數隻會給出字符串1第一次在字符串2中出現的位置。例如
Sub I2()
Dim A As String, B As String
A=“Microsoft Visual Basic For Applications Is Suit For Beginners”
B=“For”
MsgBox(Instr(1,A,B))
End Sub
結果還是輸出24.
(7) 反向獲取字符串2在字符串1中的起始位置,InStrRev()函數,可以獲得字符串1在字符串2中的位置,用法為InStrRev(字符串1,字符串2,起始位置),與上面函數不同的是,這個函數将在其實位置處從後向前查找,查找到的位置還是按照從前往後計算的!
(8) 将字符串中的英文字符換成大寫UCase()函數。UCase(字符串) 作用是,将字符串中的英文字符寫成大寫。在轉換後,數字或者其他符号并不會改變。
(9) 将字符串中的英文字符換成小寫LCase() 函數。LCase(字符串) 作用是,将字符串中的英文字符寫成小寫。
(10) 獲取字符的ASCII碼:Asc()函數。ASCII(字符)作用是,獲取字符的ASCII碼。
(11) 按照ASCII碼獲取字符:Chr()函數。Chr(ASCIICode)作用是,根據ASCIICode(數字)獲得ASCII碼對照表中數字相對應的字符。
(12) 重複輸入String()函數,String(N,字符)将獲得字符重複N遍的字符串。
(13) 空格函數Space()。Space(N)将返回N個空格。
(14) 分割字符串函數Split()。Split()的用法是:Split(字符串,分割字符),它的意思是,在字符串中,按照分割字符分割字符串,分割後的結果,是一個字符串數組。請嘗試下列程序(關于數組的相關内容,請閱讀第4章)
Sub S()
Dim A As String, B() As String, I As Variant
A=“Red,Yellow,Blue,Black,Orange,Pink”
B=Split(A,”,”)
For Each I In B
MsgBox(I)
Next I
End Sub
這一段程序的作用是,先聲明一個字符串變量A,這個字符串變量A中儲存了各種顔色,即”Red”、”Yellow”、”Blue”、”Black”、”Orange”、”Pink”。每種顔色之間以逗号”,”連接。然後再定義一個數組B,用Split函數分割數組A,分割的依據是逗号”,”。分割完了之後,B這個數組中,有6個元素,這6個元素分别等于上面的”顔色”,然後再用一個I變量把B中的元素一個一個顯示出來。所以結果是,第一次信息框顯示”Red”,點擊”确定”後,第二次顯示”Yellow”……,一直到顯示”Pink”。
(15) 字符串連接函數Join()。Join()函數正好和Split函數相反,即将一個數組合并為一個字符串。使用方法是,Join(數組,分隔符号),表示用分隔符号連接數組。請嘗試下列程序:
Sub J()
Dim A(2) As String, B As String
A(0) = "Red"
A(1) = "Green"
A(2) = "Blue"
B = Join(A, " ")
MsgBox (B)
End Sub
這一程序作用是,先定義了一個數組A,數組A中的三個元素分别賦值為”Red”,”Green”和”Blue”,然後用加号” ”将3個元素連接起來,連接後的字符串為”Red Green Blue”。
(16) 字符串連接符号 “&”。”&”符号用于對兩個字符串的”連接”。例如:”12” & “34” 連接後結果為”1234”,”Hello” & “World”連接後結果為”HelloWorld”,記住,”&”符号隻是簡單是”連接”,并不能在連接的兩個字符之間加入空格或者其他特殊字符,需要加入這些字符時,可以采用 “&”字符的方式,例如,想連接”Hello”和”World”,中間加入Tab(制表符)時,可以寫成”Hello” & Chr(9) & “World”. (制表符的ASCII碼為9)。”&”也可以用于字符串和數字的連接,連接效果是,先把數字轉化成字符串,再連接,因此,”12” & “34” 與 “12” & 34效果是一樣的,均為”1234”。
(17) 字符串連接字符 “ ”,” ”也可以用作字符串連接符,與”&”不同的是,” ”的行為比較”詭異”,其連接效果往往不是我們所需要的效果。連接規律為:當連接的兩側均為字符串時,連接效果與”&” 相同,即 “12” & “34” 與”12” “34” 效果一緻,均為”1234”。當連接的一側為數字字符,另一側為數字時,會進行數字的加法運算,然後再轉換為字符,例如”12” 34,結果為”46”。而當連接的兩側一側為字符(含有字母)一側為數字時,則不可以連接。
3.3.4 變量類型的轉換
正如我們之前所見,變量在進行運算時,VBA可以自動将變量進行轉換。但是有些轉換就不可以自動實現了。VBA中,提供了各種轉換類型的函數。我們可以用這些函數進行數據轉換,然後再運用于各種運算。
(1)轉換成整形變量CInt()。CInt()的作用是,将一個字符或者小數轉換成整數,轉換過程中,所需要轉換的内容為字符時,這個字符中的所有字符必須全部是數字,例如CInt(“2.6”)可以轉換成功,如果含有其他字符,例如CInt(“My1”)則會顯示類型不匹配。CInt()轉換時,無論正數或者負數,均采用”五舍六入”原則,即隻有小數部分大于0.5時,才會”入”。例如CInt(2.5),結果是2,CInt(2.51)結果是3,CInt(-2.5)結果是-2,CInt(-2.51)結果是-3。
(2)轉換成數值型變量Val()。Val()函數的作用是,将一個字符串轉換成數值,轉換的數值,當第一個字符是數字的時候,等于第一個數字,當第一個字符不是數字的時候,結果等于0,例如Val(“My21thBook2”)結果為0,而Val(“21th2”)結果為21。
(3)轉化成字符串型變量Str()和CStr(),Str()的作用是,将一個數字轉換成字符串,轉換規律是,如果原先數字大于0,則會在字符串最前端多出一個空格,如果原先數字小于0,則最前面是表示複數的符号,即”-“。CStr()作用也是數字轉換成字符,不同的是,如果原先數字大于0,則轉換後的字符前面不會多出一個空格。
3.3.5 變量的命名法則
當一個程序比較複雜,使用的變量比較多的時候,有必要引用變量的命名法則。變量的命名法則并不是VBA強行規定的,隻是為了程序編譯人員方便而人為規定的,可以想象,如果一個程序有1000行命令,涉及到100個變量,如果這些變量随機地按照a1、a2、a3……這樣命名,那麼用不了多久,程序的編寫人員自己都會忘記當初這些變量每一個是什麼作用,是什麼類型了。
(1)變量命名的總原則:”見字知意”,即看到變量名稱就知道這個變量在程序中的作用。例如,定義一個向用戶顯示信息的字符串變量為Dim MyMsg As String。由于MyMsg這個名字,由My(我的)加上Msg(信息=Massage)所以以後看到MyMsg就知道這個變量當初的用途是向用戶顯示信息,或者需要向用戶顯示信息時候,就用這個MyMsg變量。
(2)變量名稱盡可能地短,畢竟,不會有人用像例如Get_The_Information_Of_
FileName_As_My_Massage這麼長的變量名稱(打字都得大半天)。
(3)大小寫混合,可以感受一下下面四個變量名: MyName, myname, MYNAME, Myname, myName。盡管VBA中變量名和函數名不區分大小寫(後面章節中會說到函數名),但是,在這幾種表達方式中,最為舒服的表達方式為MyName。
(4)用變量類型的前3個字母表示這個變量的類型,例如,定義一個字符串的變量,用StrL這個名字比用A這樣的名字更能顯示這個變量的類型。
(5)使用公認的變量名稱,例如,i、j、k一般用于循環變量名,i,j還用于表示行和列的行數、列數,M、N一般用于表示一個二維數組的大小(M為列,N為行),File一般用于文件操作時的文件名稱、Path一般用于文件操作時的路徑名稱,等。
第四節 變量的使用範圍
3.4.1 内部變量、私有變量、公共變量、靜态變量
(1) 内部變量
正如之前的例子用Dim在Sub内部可以定義變量,但是,這種用Dim在一個過程(Sub)内部定義的變量,在過程的外部卻訪問不到,不同的過程中,同樣的變量名的變量也是不同的兩個變量。例如,下面一段程序。
Sub Test1()
Dim MyAge As Integer
MyAge=27
Msgbox(MyAge)
End Sub
Sub Test2()
MyAge=MyAge 1
MsgBox(MyAge)
End Sub
分别運行這兩個過程,可以看到,第一個過程結果是27,第二個過程結果是1.因為在Test2過程中的MyAge與Test1中的MyAge是不同的變量。在Test1中聲明的MyAge變量,賦值為27。但是在Test2中,并不能訪問Test1中的變量而是又重新定義了一個變量MyAge,因為沒有給MyAge賦值,所以這個變量的值自動為0,把此時再把這個變量進行加一運算,結果是1.
像這種在過程或者函數内部,随着函數或者過程的消失而消失的變量叫做内部變量,由于内部變量總是随着過程或者函數的結束而消失,所以,在不同的函數或者過程内部可以有相同名稱的内部變量。
如果我們想在過程Test2中訪問過程Test1中的MyAge變量怎麼辦?我們可以把過程Test2加上一個參數,并且讓這個參數等于過程Test1中的MyAge,然後用過程Test1來調用過程Test2,如下所述。
Sub Test1()
Dim MyAge As Integer
MyAge=27
MsgBox(MyAge)
Call Test2(MyAge)
End Sub
Sub Test2(MyAge As Integer)
MyAge=MyAge 1
MsgBox(MyAge)
End Sub
這裡,過程Test1中的MyAge變量通過參數的形式傳遞給過程Test2,需要注意的是,過程Test2的參數可以用任意的名稱,例如寫成下列形式:
Sub Test2(Age As Integer)
Age=Age 1
MsgBox(Age)
End Sub
運行結果是一樣的。這裡有兩點值得我們注意,第一,在Test1中,運用Test2過程的時候,前面加了一個關鍵字:”Call” 這個關鍵字的作用是,在Test1執行的過程中,執行到這一條語句時,轉到Call後面的過程或者函數起始位置開始執行命令。第二,Test2通過參數傳遞的方式,從Test1中傳遞了參數MyAge,執行完畢後,Test1中的這個變量MyAge的數值也會發生改變,這一條讀者先行記住即可,我們将在代碼實戰部分講解參數的傳遞。
(2)私有變量
可以在一個模塊開始的時候定義這個模塊所使用的”私有變量”,定義私有變量的方法為Private 變量名 As 類型,定義在一個模塊中的私有變量,在這個模塊中随處可以訪問,隻有當模塊結束的時候,這個變量才會消失。例如,在同一個用戶模塊中編入下列程序:
Private MyAge As Integer
Sub T1()
MyAge = 27
MsgBox (MyAge)
End Sub
Sub T2()
MyAge = MyAge 1
MsgBox (MyAge)
End Sub
在這個模塊中,T1過程和T2過程均可以訪問變量MyAge,所以運行結果,如果先運行第一個,再運行第二個,第一次結果為27,第二次結果為1.如果直接執行第二個過程,則運行結果為1。(第一個過程相等于給MyAge變量賦值為1,而第二個過程是把MyAge的數值加上1)
私有變量隻能在模塊内部處處可見,而在模塊外部卻不可以調用,因此,不同的模塊可以有相同名稱的私有變量。
(3)公共變量
可以在模塊開始的時候聲明一個公共變量,聲明公共變量的方法是: Public 變量名 As 類型。定義的公共變量,在這個工程中随處可見,不同的模塊之間也可以調用。例如,首先插入一個模塊,寫入:Public MyAge As Integer,然後再插入一個模塊寫入以下兩個過程。
Sub T1()
MyAge=27
MsgBox(MyAge)
End Sub
Sub T2()
MyAge=MyAge 1
MsgBox(MyAge)
End Sub
可以看到,盡管在這個模塊中并沒有定義私有變量MyAge,但是因為在之前的模塊中,已經把MyAge定義成為了公共變量,所以,T1和T2仍然能夠正常調用。
(4)靜态變量
靜态變量是介于内部變量和私有變量之間的一種變量,這種變量隻有函數或者過程本身可以調用,其他函數或者過程不可以調用,但是,每調用一次後,靜态變量的數值将會得到保存。舉個例子說明一下,首先我們來看一下下列程序段。
Sub S()
Dim a As Integer
a=a 1
MsgBox(a)
End Sub
這樣一段程序段,無論執行所少次,a的數值始終等于1,這是因為這個過程中的這個變量a随着過程的結束就會消失了,下一次再執行的時候,再重新聲明變量a,在變量a沒有賦值的時候,VBA自動給這個變量a賦值為0,所以a加上1,始終等于1。
但是,我們隻需要把上面過程中的Dim 改成Static,情況就會發生改變了!像下面的這一段程度:
Sub S()
Static a As Integer
a=a 1
MsgBox(a)
End Sub
這樣一段程序,随着執行次數的增加,a的數值會一直增加,每一次增加1,隻要不關閉這個Excel工作表,a的數就會增加!這是因為,這個過程中,聲明了一個靜态的變量a,這個a的數值并不會因為過程的結束而消失,下一次再運行的時候,a的數值會保留上一次的運行結果。
第五節 常量
3.5.1 定義常量的意義
計算機中有變量,就有常量。所謂常量就是不能更改的量,例如數字123,字符串”My Work” 等,顯然,我們可以用常量給變量賦值,例如Dim a As Integer a=1,但是卻不可以給一個常量“賦值”,顯然,數字3不可以“賦值”成數字5.即除了賦值運算,常量可以參與前面提到的所有運算。
為什麼要定義常量呢,我們來看一下一個例子,假如我們現在要計算一個圓形的表面積、一個圓柱體的體積、和一個球的體積。這時候就需要用到圓周率這樣一個常數π,而這個常數π等于3.1415926(假設我們隻取小數點後7位數),那麼,這個程序就需要這樣寫。
Sub CalC()
Dim R1 As Double, R2 As Double, H As Double, R3 As Double
Dim S1 As Double, V1 As Double, V2 As Double
R1=Inputbox(“輸入圓的半徑”)
S1=3.1415926*R1*R1
MsgBox(“圓形的面積為” & S1)
R2=Inputbox(“輸入圓柱的半徑”)
H=Inputbox(“輸入圓柱的高”)
V1=3.1415926*R2*R2*H
MsgBox(“圓柱體積為” & V1)
R3=Inputbox(“輸入球的直徑”)
V2=4/3*3.1415926*R3*R3*R3
MsgBox(“球的體積為” & V2)
End Sub
這個程序中,Inputbox()的作用是,用一個對話框提示用戶輸入數據,在計算圓形的面積的時候需要用戶輸入圓形的半徑,在計算圓柱體體積的時候,需要用戶輸入圓柱的半徑和高,而需要計算球體體積的時候,需要用戶輸入球體的半徑。MsgBox()這個在我們之前許多程序中已經見到了,它的作用,是向用戶輸出程序的結果和相關信息。關于Inputbox和MsgBox的作用,我們将在後續章節中詳細講解。
從這個程序中,我們可以看到,3.1415926這個數字被一個程序用了很多次。像這種常量,因為我們需要不斷地引用,所以如果按照每一次重新輸入的做法,一是比較麻煩,二是有可能在某一次輸入的時候輸入錯誤。這時,就可以定義一個常量。定義常量的命令是: Const 常量名 = 常量。
3.5.2 常量的定義和使用
還是用上面這個例子,如果我們定義了一個常量PI=3.1415926那麼,上面這一段程序可以寫成:
Sub CalC()
Dim R1 As Double, R2 As Double, H As Double, R3 As Double
Dim S1 As Double, V1 As Double, V2 As Double
Const PI=3.1415926
R1=Inputbox(“輸入圓的半徑”)
S1=PI*R1*R1
MsgBox(“圓形的面積為” & S1)
R2=Inputbox(“輸入圓柱的半徑”)
H=Inputbox(“輸入圓柱的高”)
V1=PI*R2*R2*H
MsgBox(“圓柱體積為” & V1)
R3=Inputbox(“輸入球的直徑”)
V2=4/3*PI*R3*R3*R3
MsgBox(“球的體積為” & V2)
End Sub
可以看出,我們這裡用常量PI代替了3.1415926,在程序中,每一次需要使用數字3.1415926的時候,就用PI來代替。這樣做有三個好處:第一,在語法上更加接近我們傳統的數學公式,畢竟,PI*R1*R1比3.1415926*R1*R1“更像”圓面積公式。第二,減少輸入,隻需要在開始定義的時候把PI定義成3.1415926,後面就可以直接用PI來代替這個數字了。第三,減少輸入的錯誤,假設程序有100行,3.1415926這個數字需要使用100次,那麼,如果直接用數字,可能會在某一次輸入的時候輸入成3.14或者3.14159265358979這樣的數(畢竟人的大腦容易産生遺忘)。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!