Visual Basic/資料型別
Visual Basic 中的資料型別可以分為三類
- 原生: 編譯器直接理解的型別,無需程式設計師提供幫助
- 使用者定義: 通常稱為 UDT,代表使用者定義型別,對應於 Pascal 記錄或 C 結構體
- 類: Visual Basic 中面向物件程式設計的基礎。 類包括窗體、載入項和資料庫設計器。
如果你正在使用 Excel VBA,請記住 VBA 本質上是 VB6,因此這些規則適用。
本節適用於 Visual Basic 的版本 7 及更高版本(即 VB.NET)。
內建型別包括
| Visual Basic 型別 | 公共語言執行時型別結構 | 名義儲存分配 | 值範圍 |
|---|---|---|---|
| 布林型 | 布林型 | 取決於實現平臺 | True 或 False |
| 位元組 | 位元組 | 1 位元組 | 0 到 255(無符號) |
| 字元(單個字元) | 字元 | 2 位元組 | 0 到 65535(無符號) |
| 日期 | DateTime | 8 位元組 | 公元 0001 年 1 月 1 日 0:00:00(午夜)到公元 9999 年 12 月 31 日 11:59:59 PM |
| 十進位制 | 十進位制 | 16 位元組 | 0 到 +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9...E+28) † 無小數點;0 到 +/-7.9228162514264337593543950335 有 28 位小數; 最小的非零數是 +/-0.0000000000000000000000000001 (+/-1E-28) † |
| 雙精度浮點數(雙精度浮點數) | 雙精度 | 8 位元組 | -1.79769313486231570E+308 到 -4.94065645841246544E-324 † 負值; 4.94065645841246544E-324 到 1.79769313486231570E+308 † 正值 |
| 整數 | Int32 | 4 位元組 | -2,147,483,648 到 2,147,483,647(有符號) |
| 長整數(長整數) | Int64 | 8 位元組 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (9.2...E+18 †)(有符號) |
| 物件 | 物件(類) | 32 位平臺上為 4 位元組 64 位平臺上為 8 位元組 |
任何型別都可以儲存在 Object 型別的變數中 |
| SByte | SByte | 1 位元組 | -128 到 127(有符號) |
| 短整數(短整數) | Int16 | 2 位元組 | -32,768 到 32,767(有符號) |
| 單精度浮點數(單精度浮點數) | 單精度 | 4 位元組 | -3.4028235E+38 到 -1.401298E-45 † 負值; 1.401298E-45 到 3.4028235E+38 † 正值 |
| 字串(可變長度) | 字串(類) | 取決於實現平臺 | 0 到大約 20 億個 Unicode 字元 |
| 無符號整數 | UInt32 | 4 位元組 | 0 到 4,294,967,295(無符號) |
| 無符號長整數 | UInt64 | 8 位元組 | 0 到 18,446,744,073,709,551,615 (1.8...E+19 †)(無符號) |
| 使用者定義(結構體) | (繼承自 ValueType) | 取決於實現平臺 | 結構體中的每個成員都具有由其資料型別確定的範圍,與其他成員的範圍無關 |
| 無符號短整數 | UInt16 | 2 位元組 | 0 到 65,535(無符號) |
本節適用於 Visual Basic 的版本 6 及更早版本,這是一個 較舊 的版本。
示例
Dim a as Byte
Dim i as Integer
Dim x,y as Long 'Define two variables. Note that only the last variable will be a long integer.
現在這些變數只能儲存整數值(無小數)。 長整型可以儲存比整型更大的數值範圍,但它們佔用更大的 RAM 空間。
| 型別 | 儲存 | 值範圍 |
|---|---|---|
| 位元組 | 1 位元組 | 0 到 254 |
| 整數 | 2 位元組 | -32,768 到 32,767 |
| 長整數 | 4 位元組 | -2,147,483,648 到 2,147,483,647 |
一些你需要了解的函式:Int()
Int() 將十進位制值轉換為整數值
Dim i as Integer
i=Int(3.9)
Print i 'Prints 3
這些資料型別可以儲存小數。 “雙精度” 相對於 “單精度” 類似於 “長整數” 相對於 “整數”。
| 型別 | 儲存 | 值範圍 |
|---|---|---|
| 單精度 | 4 位元組 | -3.402823E+38 到 -1.401298E-45 負值 1.401298E-45 到 3.402823E+38 正值。 |
| 雙精度 | 8 位元組 | -1.79769313486232E+308 到 -4.94065645841247E-324 負值 4.94065645841247E-324 到 1.79769313486232E+308 正值。 |
一些有用的函式:Round()
Round() 將小數四捨五入到程式設計師所需的特定小數位數。 第一個引數應該是要四捨五入的小數值。 第二個引數指定所需的位數,例如
Dim pi as Double
pi=3.141592653589
pi=Round(pi,2) 'Rounds off 3.141592653589 to only two decimal digits
Print pi 'Prints 3.14
字串是字元陣列。 例如
Dim a As String
a = "This is a string"
字串可以使用 “&” 運算子連線(連線在一起形成一個新的字串)。 例如,
dim b as String
b = "Wiki" & "book" & "s"
Print b 'Prints "Wikibooks"
一個普通的字串變數佔用 10 個位元組的 RAM,加上字串的大小,最多可以容納 20 億個字元!
一些常用的內建字串常量:vbTab、vbCrLf
vbTab 包含一個字串,它與鍵盤上的 Tab 鍵的作用相同,而 vbCrLf 建立一個回車和換行符(類似於 Enter 鍵)
Print "Jack:" & vbTab & "1 pie" & vbCrLf & "me:" & vbTab & "10 pies"
將列印
Jack: 1 pie me: 10 pies
要在字串中包含特殊字元和引號,可以使用 Chr() 函式
Dim a As String
Print "A quotation mark: [" & Chr(34) & "]"
a = "Replace 'apostrophes' for quotation marks"
Replace( a, "'", Chr(34) )
Print a
一些字串函式:Str()、Val()、inStr()、Mid()、Replace()、Trim()
事實上,有大量的內建字串操作函式可用。 但現在,我將只介紹兩個:Str() 和 Val()。
Str() 將任何數值轉換為字串值,而 Val() 將字串值轉換為數值(只有在可轉換時)。
Dim MyString As String
Dim MyNumber As Single
MyString=Str(300) 'converts a number into a string
MyNumber=Val("300") 'converts a string into a number
即使你不進行轉換,也不會遇到型別不匹配錯誤。 然而,建議使用顯式型別轉換,因為這更容易除錯。
即使你做了準備,也可能遇到幾乎不可能除錯的問題,因為 VB 拒絕轉換某些內容,並且拒絕告訴你到底是什麼。 VB 非常敏感,並且在最意想不到的時候丟擲異常。
結構體型別定義示例
Type E2Point
x As Double
y As Double
End Type
Sub Test()
Dim MyPoint As E2Point
Dim MyPoint2 As E2Point
MyPoint.x = 4
MyPoint.y = -5
MyPoint2 = MyPoint 'Make a copy
MyPoint2.x = 3
MyPoint2.y = -6
Debug.Print MyPoint.x, MyPoint.y '4, -5: not overriden with 3 and -6
Debug.Print TypeOf MyPoint Is E2Point 'True
Debug.Print TypeOf MyPoint Is Object 'False
End Sub
型別必須在過程之外定義。
結構體型別變數不是物件。
連結
- Type 語句,Office 2013,msdn.microsoft.com
- Type 語句 在 Visual Basic for Applications 參考中,msdn.microsoft.com
列舉型別定義示例
Enum Colors
Red '=0
Green '=1
Blue '=2
End Enum
Enum Colors2
Red2 = 1
Green2 '=2
Blue2 '=3
End Enum
Sub Test()
Debug.Print Red, Green, Blue
Debug.Print Red2, Green2, Blue2
Dim MyVar As Colors 'Ends up being typed as Long
MyVar = 8 'Does not lead to an error: no restriction on values
End Sub
連結
- Enum 語句,Office 2013,msdn.microsoft.com
- Enum 語句 在 Visual Basic for Applications 參考中,msdn.microsoft.com
要了解變數的型別,可以使用 “TypeOf ... Is ...” 測試。 測試的型別只能是物件型別和結構體型別,但測試可以應用於任何變數,無論是整數、字串還是物件型別。
TypeOf 在 Excel 中的示例
Set MyVar = Selection
Debug.Print "Selection is an object: " & TypeOf MyVar Is Object
Debug.Print "Selection is a range: " & TypeOf MyVar Is Range
Debug.Print "Sheets is of type Sheets: " & TypeOf Sheets Is Sheets
MyStr = "Hello"
Debug.Print "Text is an object: " & TypeOf MyStr Is Object
If TypeOf MyVar Is Range Then
Set MyCells = MyVar.Cells
End If
使用 “Select Case True” 的示例測試
Set MyVar = new Collection
Select Case True
Case TypeOf MyVar is Range
Debug.Print "Range"
Case TypeOf MyVar is Collection
Debug.Print "Collection"
Case Else
Debug.Print "Other cases"
End Select
你可以使用 IsObject 和 TypeName 函式進一步瞭解型別
Debug.Print IsObject(Selection) 'True
Debug.Print IsObject("Hello") 'False
Debug.Print TypeName("Hello") 'String
Debug.Print TypeName(4) 'Integer
Debug.Print TypeName(3.5) 'Double
Debug.Print TypeName(Selection) 'Range
連結
- If...Then...Else 語句 在 Visual Basic for Applications 參考中,msdn.microsoft.com
- TypeName 函式 在 Visual Basic for Applications 參考中,msdn.microsoft.com
- IsObject 函式 在 Visual Basic for Applications 參考中,msdn.microsoft.com
- IsArray 函式 在 Visual Basic for Applications 參考中,msdn.microsoft.com
- IsDate 函式 在 Visual Basic for Applications 參考中,msdn.microsoft.com
- IsNumeric 函式 在 Visual Basic for Applications 參考中,msdn.microsoft.com
- IsNull 函式 在 Visual Basic for Applications 參考中,msdn.microsoft.com
| 上一頁:檔案 | 目錄 | 下一頁:過程和函式 |