跳轉到內容

Visual Basic/資料型別

來自華夏公益教科書,開放的書籍,開放的世界

Visual Basic 中的資料型別可以分為三類

  • 原生: 編譯器直接理解的型別,無需程式設計師提供幫助
  • 使用者定義: 通常稱為 UDT,代表使用者定義型別,對應於 Pascal 記錄或 C 結構體
  • : Visual Basic 中面向物件程式設計的基礎。 類包括窗體、載入項和資料庫設計器。

如果你正在使用 Excel VBA,請記住 VBA 本質上是 VB6,因此這些規則適用。

內建型別

[編輯 | 編輯原始碼]

本節適用於 Visual Basic 的版本 7 及更高版本(即 VB.NET)

內建型別包括

Visual Basic 型別 公共語言執行時型別結構 名義儲存分配 值範圍
布林型 布林型 取決於實現平臺 TrueFalse
位元組 位元組 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

你可以使用 IsObjectTypeName 函式進一步瞭解型別

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
上一頁:檔案 目錄 下一頁:過程和函式
華夏公益教科書