跳转到内容

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
上一页:文件 目录 下一页:过程和函数
华夏公益教科书