第三章 VB的程序設計基礎
2.1 VB編碼規(guī)則
1. 語言元素
VB的語言基礎是BASIC語言,VB程序的語言元素主要由:
關鍵字(如: Dim、Print、Cls)
函數(shù)(如:Sin()、Cos()Sqr())
表達式(如:Abs(-23.5)+45*20/3 )
語句(如:X=X+5 、 IF……ELSE……END IF)等組成。
2. VB代碼書寫規(guī)則
?。?) 程序中不區(qū)分字母的大小寫,Ab 與AB等效;
(2) 系統(tǒng)對用戶程序代碼進行自動轉換:
1) 對于VB中的關鍵字,首字母被轉換成大寫,其余轉換成小寫
2) 若關鍵字由多個英文單詞組成,則將每個單詞的首字母轉換成大寫
3) 對于用戶定義的變量、過程名,以第一次定義的為準,以后輸入的自動轉換成首次定義的形式
3. 語句書寫規(guī)則
(1)在同一行上可以書寫多行語句,語句間用冒號(:)分隔
(2)單行語句可以分多行書寫,在本行后加續(xù)行符:空格和下劃線 _
(3) 一行允許多達255個字符
4. 程序的注釋方式
(1)整行注釋一般以 Rem開頭,也可以用撇號 ';
(2)用撇號 ' 引導的注釋,既可以是整行的,也可以直接放在語句的后面,最方便;
(3)可以利用“編輯”工具欄的“設置注釋塊”、“解除注釋塊”來將設置多行注釋。
5. 保留行號和標號
VB源程序接受行號與標號,但不是必須的(早期的BASIC語言中必須用行號)。
標號是以字母開始以冒號結束的字符串,一般用在GOTO語句(現(xiàn)在很少用)中。
2.2 VB的語言基礎
1.數(shù)據(jù)類型
VB的標準數(shù)據(jù)類型
數(shù)據(jù)類型 | 關鍵字 | 類型符 | 前綴 | 存儲空間 | 范圍 | |
數(shù)值數(shù)據(jù)類型 | 字節(jié)型 | Byte | Byt | 1 個字節(jié) | 0 到 255 | |
整型 | Integer | % | Int | 2 個字節(jié) | -32,768 到 32,767 | |
長整型 | Long | & | Lng | 4 個字節(jié) | -2,147,483,648 到 2,147,483,647 | |
單精度型 | Single | ! | Sng | 4 個字節(jié) | 負數(shù):-3.402823E38 到 -1.401298E-45;正數(shù):1.401298E-45 到 3.402823E38 | |
雙精度型 | Double | # | Dbl | 8 個字節(jié) | 負數(shù): -1.79769313486232E308 - 4.94065645841247E-324; 正數(shù):4.94065645841247E-324 1.79769313486232E308 | |
貨幣型 | Currency | @ | Cur | 8 個字節(jié) | 從 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 | |
邏輯型 | Boolean | Bln | 2 個字節(jié) | True 或 False | ||
日期型 | Date | Dtm | 8 個字節(jié) | 100 年1月 1日 到 9999 年 12 月 31 日 | ||
對象型 | Object | Obj | 4 個字節(jié) | 任何 Object 引用 | ||
變長字符型 | String | $ | Str | 10 字節(jié)加字符串長度 | 0 到大約 20 億 | |
定長字符型 | String | $ | Str | 字符串長度 | 1 到大約 65,400 | |
變體數(shù)字型 | Variant | Vnt | 16 個字節(jié) | 任何數(shù)字值,最大可達 Double 的范圍 | ||
變體字符型 | Variant | Vnt | 22 個字節(jié)加字符串長度 | 與變長 String 有相同的范圍 |
注意:
1)VB中對沒有聲明的變量其缺省的數(shù)據(jù)類型是變體型,可以用來存儲各種數(shù)據(jù),但所占用的內存比其它類型都多。為提高運行效率(整型效率較高),或達到一定的運算精確度(浮點型精度較高,但運行較慢),應合理的定義數(shù)據(jù)類型。
2) 邏輯型數(shù)據(jù)只有True 和False兩個值,轉換成整型時,True=-1 ,False=0,將其它類型轉換成邏輯型時,非0數(shù)轉換為True ,0轉換為False。
3) 字符型可以包括所有的西文字符和漢字,字符必須用雙引號括" "起來,如:"abc123"
4)日期型數(shù)據(jù)按8字節(jié)的浮點數(shù)來存儲,日期型數(shù)表示方式有兩種:可以用號碼符#括起來,也可以用數(shù)字序列表示(小數(shù)點左邊的數(shù)字代表日期,右邊代表時間,0為午夜,0。5為中午12點,負數(shù)表示是1899年12月31日前的日期和時間)。
如:#3/22/2002# #2002-3-2214:30:20#
DimT As Date
T=-2.5
Print T ' 打印出來的結果是1899-12-28 12:00:00
5)任何數(shù)據(jù)類型的數(shù)組都需要 20 個字節(jié)的內存空間,加上每一數(shù)組維數(shù)占 4 個字節(jié),再加上數(shù)據(jù)本身所占用的空間。數(shù)據(jù)所占用的內存空間可以用數(shù)據(jù)元數(shù)目乘上每個元素的大小加以計算。例如,以 4 個 2字節(jié)之 Integer 數(shù)據(jù)元所組成的一維數(shù)組中的數(shù)據(jù),占 8 個字節(jié)。這 8 個字節(jié)加上額外的 24 個字節(jié),使得這個數(shù)組所需總內存空間為 32 個字節(jié)。
2. 變量與常量
(1)變量或常量的命名規(guī)則
1)必須以字母或漢字開頭,由字母、漢字、數(shù)字或下劃線組成,長度≤255個字符;
2)不能使用VB中的關鍵字,并盡量不與VB中標準函數(shù)名同名;如:Dim 、Sin
3)VB中不區(qū)分變量的大小寫,一般變量首字母用大寫,其余用小寫;常量全部用大寫字母表示
4)為了增加程序的可讀性,可在變量名前加一個縮寫的前綴來表明該變量的數(shù)據(jù)類型。
(2)變量聲明
1)用Dim語句進行顯式聲明
語句形式: Dim 變量名 [As 類型] 如:Dim intX As integer
說明:·如果沒有As類型,則默認為變體類型。
·可在變量名后加類型符來代替As類型 如: Dim intX%
·一條語句可以同時定義多個變量,但每個變量必須有自己的類型聲明,類型聲明不能共用;
·字符串變量根據(jù)其存放的長度是否固定,定義方法不同:
定長字符串: Dim strA As String*10
表示最多存放10個字符,如果賦值不足10個,則右補空;若多于10個,則多余部分截去。
不定長字符串:Dim strA As String ’最多可存放2MB個字符
2) 隱式聲明
VB中允許變量不經過聲明就直接使用,這種稱為隱式聲明,所有隱式聲明的變量都是變體型的。
隱式聲明容易造成錯誤,為了調試程序方便,一般對使用的變量都進行聲明,可以在通用聲明段使用Option Explicit 語句來強制顯式聲明所有變量。
(3)常量
1)直接常量
指在程序中直接給出值的數(shù)據(jù),如:123、123&、123.45、1.234E2、123D3分別表示整型、長整型、單精度浮點型(小數(shù)形式)、單精度浮點型(指數(shù)形式)、雙精度浮點型。
八進制常數(shù): 在數(shù)值前加&O ,如 &O123
十六進制常數(shù):在數(shù)值前加&H ,如&H123
2)用戶聲明的符號常量
用Const來聲明: Const 符號常量名 [As 類型] = 表達式
如:Const PI=3.14159 '聲明了常量PI,代表3.14159,單精度型
Const MAX As Integer=&O144 ''聲明了常量MAX,代表八進制數(shù)144,整型
Const COUNT#=45.67 '聲明了常量COUNT,代表45.67,雙精度型
3)系統(tǒng)提供的常量
系統(tǒng)定義的常量位于對象庫中,在對象瀏覽器中的Visual Basic(VB)和Visual Basic for Aplication(VBA)等對象庫中列出了VB的常量。這些常量可以與應用程序的對象、方法、屬性一起使用。
如:Form1.WindowsState=vbMaximized 表示將窗口極大化。
3. 運算符
(1) 算術運算符
運算符 | 含義 | 優(yōu)先級 | 示例 | 結果 |
^ | 乘方 | 1 | Ia^2 | 9 |
- | 負號 | 2 | -iA | -3 |
* | 乘 | 3 | IA* iA* iA | 27 |
/ | 除 | 3 | 10/iA | 3.33333333333333 |
\ | 整除 | 4 | 10\iA | 3 |
Mod | 取模 | 5 | 10 Mod iA | 1 |
+ | 加 | 6 | 10+iA | 13 |
- | 減 | 7 | IA-10 | -7 |
說明:設表中的變量iA=3, 為整型。
算術運算符兩邊的操作數(shù)應該是數(shù)值型,若是數(shù)字字符或邏輯型,則自動轉換為數(shù)值類型后再運算。
(2) 字符串運算符
運算符 | 作用 | 區(qū)別 | 示例 | 結果 |
& | 將兩個字符串拼接起來 | 連接符兩旁的操作數(shù)不管是字符型還是數(shù)值型,系統(tǒng)先將操作數(shù)轉換成字符,然后再連接。 | "123"&55 "abc"+12 | "12355" "abc12" |
+ | 連接符兩旁的操作數(shù)均為字符型;若均為數(shù)值型則進行算術加法運算;若一個為數(shù)字字符型,一個數(shù)值型,則自動將數(shù)字字符轉換為數(shù)值,然后進行算術加;若一個為非數(shù)字字符型,一個數(shù)值型,則出錯。 | "123"+55 "abc"+12 | 178 出錯 |
(3) 關系運算符
運算符 | 含義 | 示例 | 結果 |
= | 等于 | "ABCDE"="ABR" | False |
> | 大于 | "ABCDE">"ABR" | False |
>= | 大于等于 | "bc">="大小" | False |
< | 小于 | 23<3 | False |
<= | 小于等于 | "23"<="3" | True |
<> | 不等于 | "abc"<>"ABC" | True |
Like | 字符串匹配 | "ABCDEFG" Like "*DE*" | True |
Is | 對象引用比較 |
注意:
1) 如果兩個操作數(shù)都是數(shù)值型,則按其大小比較
2) 如果兩個操作數(shù)都是字符型,則按字符的ASCII碼值從左到右一一比較
3) 漢字字符大于西文字符
4) 關系運算符的優(yōu)先級相同
5) VB6.0中Like運算符與通配符的使用:
?——表示任何單一字符
*——表示0個或多個字符
#——表示任何一個數(shù)字(0 - 9)
[字符列表]——表示字符列表中的任何單一字符
[!字符列表]—— 表示不在字符列表中的任何單一字符
(4) 邏輯運算符
運算符 | 含義 | 優(yōu)先級 | 說明 | 示例 | 結果 |
Not | 取反 | 1 | 當操作數(shù)為假時,結果為真 | Not F Not T | T F |
And | 與 | 2 | 兩個操作數(shù)均為真時,結果才為真 | T And T F And F T And F F And T | T F F F |
Or | 或 | 3 | 兩個操作數(shù)中有一個為真時,結果為真 | T Or T F Or F T Or F F Or T | T F T T |
Xor | 異或 | 3 | 兩個操作數(shù)不相同,結果才為真,否則為假 | T Xor F T Xor T | T F |
Eqv | 等價 | 4 | 兩個操作數(shù)相同時,結果才為真 | T Eqv F T Eqv T | F T |
Imp | 蘊含 | 5 | 第一個操作數(shù)為真,第二個操作數(shù)為假時,結果才為假,其余都為真 | T Imp F T Imp T | F T |
說明:
1)若有多個條件時,And必須全部條件為真才為真;Or只要有一個條件為真就為真。
2)如果邏輯運算符對數(shù)值進行運算,則以數(shù)字的二進制值逐位進行邏輯運算。And運算常用于屏蔽某些位;Or運算常用于把某些位置1。
如:12 And 7 表示對1100與0111進行And運算,得到二進制值100,結果為十進制4。
3)對一個數(shù)連續(xù)進行兩次Xor操作,可恢復原值。在動畫設計中,用Xor可恢復原來的背景。
4.表達式
(1)表達式的組成
表達式由常量、變量、運算符、函數(shù)和圓括號按一定的規(guī)則組成,通過運算后有一個結果,運算結果的類型由數(shù)據(jù)和運算符共同決定。
(2)表達式的書寫規(guī)則
1)乘號不能省略
2)括號必須成對出現(xiàn),均使用圓括號,可以嵌套,但必須配對。
3)表達式從左到右在同一基準上書寫,無高低、大小之分。
例:sqr((3*x+y)-z)/(x*y)^4
(3)不同數(shù)據(jù)類型的轉換
操作數(shù)的數(shù)據(jù)類型應該符合要求,不同的數(shù)據(jù)應該轉換成同一類型。在算術運算中,如果操作數(shù)的數(shù)據(jù)精度不同,VB規(guī)定運算結果采用精度較高的數(shù)據(jù)類型。
(4)優(yōu)先級
同一表達式中,不同運算符的優(yōu)先級是:算術運算符 > 字符運算符 > 關系運算符 > 邏輯運算符
注意:對于存在多種運算符的表達式,可增加圓括號改變優(yōu)先級或使表達式更清晰。
2.3 VB的公共函數(shù)
1. 數(shù)學函數(shù)
VB中常用的數(shù)學函數(shù)
函數(shù)名 | 功能 | 示例 | 結果 |
Sqr(x) | 求平方根 | Sqr(9) | 3 |
Log(x) | 求自然對數(shù),x>0 | Log(10) | 2.3 |
Exp(x) | 求以e為底的冪值,即求ex | Exp(3) | 20.086 |
Abs(x) | 求x的絕對值 | Abs(-2.5) | 2.5 |
Hex[$](x) | 求x的十六進制數(shù),返回的是字符型值 | Hex[$](28) | "1C" |
Oct[$](x) | 求x的八進制數(shù),返回的是字符型值 | Oct[$](10) | "12" |
Sgn(x) | 求x的符號, 當x>0, 返回1 ;x=0, 返回0; x<0, 返回-1 | Sgn(15) | 1 |
Rnd(x) | 產生一個在(0,1)區(qū)間均勻分布的隨機數(shù),每次的值都不同;若x=0,則給出的是上一次本函數(shù)產生的隨機數(shù) | Rnd(x) | 0-1之間的數(shù) |
Sin(x) | 求x的正弦值,x的單位是弧度 | Sin(0) | 0 |
Cos(x) | 求x的余弦值,x的單位是弧度 | Cos(1) | 0.54 |
Tan(x) | 求x的正切值,x的單位是弧度 | Tan(1) | 1.56 |
Atn(x) | 求x的反正切值,x的單位是弧度,函數(shù)返回的是弧度值 | Atn(1) | 0.79 |
2. 字符函數(shù)
(1)字符串編碼
在Windows采用的DBCS(Double Byte Character Set)編碼方案中,一個漢字在計算機內存中占2個字節(jié),一個西文字符(ASCII碼)占1個字節(jié),但在VB中采用的是Unicode(ISO字符標準)來存儲字符的,所有字符都占2個字節(jié)。為方便使用,可以用StrConv函數(shù)來對Unicode 與DBCS進行轉換,可以用函數(shù)Len()函數(shù)求字符串的字符數(shù),用 LenB()函數(shù)求字符串的字節(jié)數(shù)。
(2)常用的字符串函數(shù)
函數(shù)名 | 功能 | 示例 | 結果 |
Len(x) | 求x字符串的字符長度(個數(shù)) | Len("ab技術") | 4 |
LenB(x) | 求x字符串的字節(jié)個數(shù) | LenB("ab技術") | 8 |
Left(x,n) | 從x字符串左邊取n個字符 | Left("ABsYt",2) | "AB" |
Right(x,n) | 從x字符串右邊取n個字符 | Right("ABsYt",2) | "Yt" |
Mid(x,n1,n2) | 從x字符串左邊第n1個位置開始向右取n2個字符 | Mid("ABsYt",2,3) | "BsY" |
Ucase(x) | 將x字符串中所有小寫字母改為大寫 | Ucase("ABsYug") | ABSYUG |
Lcase(x) | 將x字符串中所有大寫字母改為小寫 | Ucase("ABsYug") | absyug |
Ltrim(x) | 去掉x左邊的空格 | Lrim(" ABC ") | "ABC " |
Rtrim(x) | 去掉x右邊的空格 | Trim(" ABC ") | " ABC" |
Trim(x) | 去掉x兩邊的空格 | Trim(" ABC ") | "ABC" |
Instr(x,"字符", M) | 在x中查找給定的字符,返回該字符在x中的位置,M=1不區(qū)分大小寫,省略則區(qū)分 | Instr("WBAC","B") | 2 |
String(n,"字符") | 得到由n個首字符組成的一個字符串 | String(3,"abcd") | "aaa" |
Space (n) | 得到n個空格 | Space (3) | "□□□" |
Replace(C,C1,C2,N1,N2) | 在C字符串中從N1開始將C2替代N2次C1,如果沒有N1表示從1開始 | Replace("ABCASAA","A","12",2,2) | "ABC12S12A" |
StrReverse (C) | 將字符串反序 | StrReverse ("abcd") | "dcba" |
3. 日期與時間函數(shù)
常用的日期與時間函數(shù)
函數(shù)名 | 含義 | 示例 | 結果 | |
Date () | 返回系統(tǒng)日期 | Date () | 02-3-19 | |
Time() | 返回系統(tǒng)時間 | Time() | 3:30 :00 PM | |
Now | 返回系統(tǒng)時間和日期 | Now | 02-3-19 3:30 :00 | |
Month(C) | 返回月份代號(1-12) | Month("02,03,19") | 3 | |
Year(C) | 返回年代號(1752-2078) | Year("02-03-19") | 2002 | |
Day(C) | 返回日期代號(1-31) | Day("02,03,19") | 19 | |
MonthName(N) | 返回月份名 | MonthName(1) | 一月 | |
WeekDay() | 返回星期代號(1-7),星期日為1 | WeekDay("02,03,17") | 1 | |
WeekDayName(N) | 根據(jù)N返回星期名稱, 1為星期日 | WeekDayName(4) | 星期三 | |
增減日期函數(shù): DateAdd(要增減日期形式,增減量,要增減的日期變量)
例:計算期末考試日期:DateAdd("ww",15,#2002/3/19#)
求日期之差函數(shù): DateDiff(要間隔日期形式,日期一,日期二)
例:計算距畢業(yè)天數(shù): DateDiff("d",Now, #2005/6/30#)
日期形式
日期形式 | yyyy | q | m | y | d | w | ww | h | n | s |
意義 | 年 | 季 | 月 | 一年的天數(shù) | 日 | 一周的天數(shù) | 星期 | 時 | 分 | 秒 |
4. 轉換函數(shù)
函數(shù)名 | 功能 | 示例 | 結果 |
Str (x) | 將數(shù)值數(shù)據(jù)x轉換成字符串 | Str (45.2) | "45.2" |
Val(x) | 將字符串x中的數(shù)字轉換成數(shù)值 | Val("23ab") | 23 |
Chr(x) | 返回以x為ASCII碼的字符 | Chr(65) | "A" |
Asc(x) | 給出字符x的ASCII碼值,十進制數(shù) | Asc("a") | 97 |
Cint(x) | 將數(shù)值型數(shù)據(jù)x的小數(shù)部分四舍五入取整 | Cint(3.6) | 4 |
Int(x) | 取小于等于x的最大整數(shù) | Int(-3.5) Int(3.5) | -4 3 |
Fix(x) | 將數(shù)值型數(shù)據(jù)x的小數(shù)部分舍去 | Fix(-3.5) | - 3 |
CBool(x) | 將任何有效的數(shù)字字符串或數(shù)值轉換成邏輯型 | CBool(2) CBool("0") | True False |
CByte(x) | 將0-255之間的數(shù)值轉換成字節(jié)型 | CByte(6) | 6 |
CDate(x) | 將有效的日期字符串轉換成日期 | CDate(#1990,2,23#) | 1990-2-23 |
CCur(x) | 將數(shù)值數(shù)據(jù)x轉換成貨幣型 | CCur(25.6) | 25.6 |
Round(x,N) | 在保留N位小數(shù)的情況下四舍五入取整 | Round(2.86,1) | 2.9 |
CStr(x) | 將x轉換成字符串型 | CStr(12) | "12" |
CVar(x) | 將數(shù)值型數(shù)據(jù)x轉換成變體型 | CVar("23")+"A" | "23A" |
CSng(x) | 將數(shù)值數(shù)據(jù)x轉換成單精度型 | CSng(23.5125468) | 23.51255 |
CDbl(x) | 將數(shù)值數(shù)據(jù)x轉換成雙精度型 | CDbl(23.5125468) | 23.5125468 |
5. 格式輸出Format函數(shù)
Format函數(shù)用于制定字符串或數(shù)字的輸出格式。
語法:x = Format (expression, fmt )
expression是所輸出的內容。fmt是指輸出的格式,這是一個字符串型的變量,這一項若省略的話,那么Format函數(shù)將和Str函數(shù)的功能差不多。如:
語句 | 輸出 |
Format (2, “0.00”) | 2.00 |
Format (.7, “0%”) | 70% |
Format (1140, “$#,##0”) | $1,140 |
fmt字符的意義
字符 | 意義 | 字符 | 意義 |
0 | 顯示一數(shù)字,若此位置沒有數(shù)字則補0 | . | 小數(shù)點 |
# | 顯示一數(shù)字,若此位置沒有數(shù)字則不顯示 | , | 千位的分隔符 |
% | 數(shù)字乘以100并在右邊加上”%”號 | - + $ ( ) | 這些字出現(xiàn)在fmt里將原樣打出 |
Format函數(shù)對時間進行輸出時的意義
fmt | 輸出 | fmt | 輸出 |
m/d/yy | 8/16/96 | h:mm:ss a/p | 10:41:29 p |
d-mmmm-yy | 16-August-96 | h:mm | 22:41 |
d-mmmm | 16-August | h:mm:ss | 22:41:29 |
mmmm-yy | august-96 | m/d/yy h:mm | 8/16/96 22:41 |
hh:mm AM/PM | 10:41 PM |
6.InputBox函數(shù)與MsgBox函數(shù)
(1)InputBox函數(shù)
語法:x = InputBox (prompt, title, default, xpos, ypos, helpfile, context)
其中,prompt是提示的字符串,這個參數(shù)是必須的。title是對話框的標題,是可選的。default是文本框里的缺省值,也是可選的。xpos,ypos決定輸入框的位置。helpfile,context用于顯示與該框相關的幫助屏幕。返回值 x 將是用戶在文本框里輸入的數(shù)據(jù),x是一個字符串類型的值。如果用戶按了Cancel鈕,則x 將為空字符串。
(2)MsgBox函數(shù)
語法:Action = MsgBox (msg, type, title)
數(shù)值 | 符號常量 | 意義 |
0 | vbOKOnly | 只顯示 Ok 按鈕 |
1 | vbOKCancel | 顯示 Ok Cancel 按鈕 |
2 | vbAbortRetryIgnore | 顯示 Abor Retry Ignore 按鈕 |
3 | vbYesNoCancel | 顯示 Yes No Cancel 按鈕 |
4 | vbYesNo | 顯示 Yes No 按鈕 |
5 | vbRetryCancel | 顯示 Retry Cancel 按鈕 |
16 | vbCritical | Stop Sign對極其重要的問題提醒用戶 |
32 | vbQuestion | Question Mark增亮沒有危險的問題 |
48 | vbExclamation | Exclamation Mark強調警告用戶必須知道的事情 |
64 | vbInformation | Information Mark可以使乏味的信息變得有趣 |
0 | vbDefaultButton1 | 第一個按鈕缺省 |
256 | vbDefaultButton2 | 第二個按鈕缺省 |
512 | vbDefaultButton3 | 第三個按鈕缺省 |
Action的值
返回值 | 含義 | 返回值 | 含義 |
1 | 選擇 Ok 按鈕 | 5 | 選擇 Ignore 按鈕 |
2 | 選擇 Cancel 按鈕 | 6 | 選擇 Yes 按鈕 |
3 | 選擇 Abort 按鈕 | 7 | 選擇 No 按鈕 |
4 | 選擇 Retry 按鈕 |