编译常量
Visual Basic for Applications定义了用于#If的独占常量…Then…#Else 指令。 这些常量在功能上等效于使用“#If…Then…#Else”指令定义的常量(它们在范围内为全局常量时除外)
#If Win64 Then
' Win64=true, Win32=true, Win16= false
#ElseIf Win32 Then
' Win32=true, Win16=false
#Else
' Win16=true
#End If
在 16 位开发平台上,编译器常量定义如下。
常量 值 指示开发环境...
Win16 True 兼容 16 位。
Win32 False 不兼容 32 位。
Win64 False 不兼容 64 位。
在 32 位开发平台上,编译器常量的定义如下。
常量 值 指示开发环境...
Vba6 True Visual Basic for Applications版本 6.0 兼容。
Vba6 False 与 Visual Basic for Applications 版本 6.0 不兼容。
Vba7 True Visual Basic for Applications版本 7.0 兼容。
Vba7 False Visual Basic for Applications版本 7.0 不兼容。
Win16 False 不兼容 16 位。
Win32 True 兼容 32 位。
Win64 False 不兼容 64 位。
Mac True 是麦金托什。
Mac False 不是麦金托什。
在 64 位开发平台上,编译器常量的定义如下。
常量 值 指示开发环境...
Vba6 True Visual Basic for Applications版本 6.0 兼容。
Vba6 False 与 Visual Basic for Applications 版本 6.0 不兼容。
Vba7 True Visual Basic for Applications版本 7.0 兼容。
Vba7 False Visual Basic for Applications版本 7.0 不兼容。
Win16 False 不兼容 16 位。
Win32 True 兼容 32 位。
Win64 True 兼容 64 位。
Mac True 是麦金托什。
Mac False 不是麦金托什。
条件编译
使用条件编译有选择地运行代码块,例如调试语句,将不同方法的速度与同一编程任务进行比较,或者将应用程序本地化为不同的语言。
使用 #Const 指令在代码中声明条件编译器常量,并表示使用 #If…Then…#Else 指令。
' Declare public compilation constant in Declarations section.
#Const conDebug = 1
Sub SelectiveExecution()
#If conDebug = 1 Then
. ' Run code with debugging statements.
.
.
#Else
. ' Run normal code.
.
.
#End If
End Sub
Function 语句
函数过程是一系列由 Function 和 End Function语句括起来的 Visual Basic 语句。 函数过程类似于 Sub 过程,但函数也可以返回值。
Function 过程可接受通过调用过程传递给它的参数(如常量、变量或表达式)。 如果 Function 过程没有参数,则其 Function 语句必须包括一对空括号。 函数通过在过程的一条或多条语句中将值分配给其名称来返回值。
Sub Main()
temp = Application.InputBox(Prompt:= _
"Please enter the temperature in degrees F.", Type:=1)
MsgBox "The temperature is " & Celsius(temp) & " degrees C."
End Sub
Function Celsius(fDegrees)
Celsius = (fDegrees - 32) * 5 / 9
End Function
格式
[Public | Private | Friend] [ Static ] Function name [ ( arglist ) ] [ As type ]
[ statements ]
[ name = expression ]
[ Exit Function ]
[ statements ]
[ name = expression ]
End Function
[Public | Private | Friend] [ Static ] 可选
Public 可选。 指示 Function 过程可由所有模块中的所有其他过程访问。 如果在包含 Option Private 的模块中使用,那么该过程不能在项目的外部使用。
Private 可选。 指示 Function 过程仅能由声明它的模块中的其他过程访问。
Friend 可选。 仅在类模块中使用。 指示 Function 过程在整个项目中可见,但是对于对象实例的控制器不可见。
Static 可选。 指示在两次调用之间保留 Function 过程的本地变量。 Static 属性不影响在 Function 外部声明的变量,即使在过程中使用它们也一样。
name 必填。 Function 的名称;遵循标准变量命名约定。
arglist 可选。 代表调用 Function 过程时传递给该过程的参数的变量列表。 多个变量使用逗号分隔。
type 可选。 函数过程返回的值的数据类型;可以是Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal(当前不支持)、 Date, String(仅限可变长度), Object, Variant或任何用户定义的类型,如果参数不是“ Optional ”,则还可以指定用户定义的类型。
statements 可选。 任何一组要在 Function 过程中执行的语句。
expression 可选。 返回 Function 的值。
arglist 部分
[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]
Optional 可选。 指示不需要参数。 如果使用, arglist 中的所有后续参数也必须是可选的,并使用 Optional 关键字声明。 如果使用了 ParamArray,则不能将 Optional 用于任何参数。
ByVal 可选。 指示按值传递参数。
ByRef 可选。 指示按引用传递参数。 在 Visual Basic 中,ByRef 为默认值。
ParamArray 可选。 仅用作 arglist 中的最后一个参数来指示最后的参数为 Variant 元素的 Optional 数组。 ParamArray 关键字允许您提供任意数量的参数。 它无法用于 ByVal、ByRef 或 Optional。
varname 必填。 表示参数的变量的名称;遵循标准变量命名约定。
type 可选。 传递给过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(当前不受支持)、Date、String(仅限可变长度)、Object、Variant 或特定的对象类型。 如果参数不是可选的,则还可以指定用户定义的类型。
defaultvalue 可选。 任何常量或常量表达式。 仅对 Optional 参数有效。 如果类型是一个 Object,则显式默认值只能为 Nothing。
function AddNums as integer (x As integer, y As Integer, z As Integer)
AddNums=x+y+z
End Sub
Function BinarySearch(. . .) As Boolean
'. . .
' Value not found. Return a value of False.
If lower > upper Then
BinarySearch = False
Exit Function
End If
'. . .
End Function
如果未使用 Public、 Private 或 Friend 显式指定, 则默认情况下,函数 过程是公共的。
如果未使用 Static ,则不会在调用之间保留局部变量的值。
Friend 关键字只能用于类模块。 但是, Friend 过程可以由项目的任何模块中的过程访问。 Friend
过程不出现在其父类的类型库中,Friend 过程也不能后期绑定。Function 过程可以递归;即,它们可以自我调用以执行指定的任务。 但是递归可能会导致堆栈溢出。 Static 关键字通常不与递归
Function 过程配合使用。所有可执行代码必须位于过程中。 不能在另一个 Function、Sub 或 Property 过程中定义 Function 过程。
Exit Function 语句会导致立即退出 Function 过程。 程序将继续执行已调用 Function 过程的语句后面的语句。
任何数量的 Exit Function 语句可以出现在 Function 过程中的任何位置。与 Sub 过程一样,Function 过程是一个单独的过程,它可以获取参数、执行一系列语句和更改其参数的值。 但是,与 Sub
过程不同,当您希望使用函数返回的值时,可以在表达式的右侧使用 Function 过程,就像使用任何固有函数(例如 Sqr、Cos 或
Chr)一样。在表达式中使用函数名称(后跟括号中的参数列表)调用 Function 过程。 有关如何调用 Function 过程的具体信息,请参阅
Call 语句。要从函数返回值,请为函数名称赋值。 任意数量的此类赋值可以出现在过程中的任意位置。
如果未对名称进行赋值,该过程将返回一个默认值:数字函数返回 0,字符串函数返回零长度的字符串 (“”),Variant 函数返回
Empty。 如果在 Function 内没有为名称指定对象引用(使用 Set),那么返回对象引用的函数将返回 Nothing。
Function 过程中使用的变量分为两类:一类在过程中显式声明,另一类则不是。
过程中显式声明(使用 Dim 或等效语句)的变量始终是该过程的局部变量。 在过程中使用但未显式声明的变量依然是局部变量,除非在过程外某些更高级别显式声明这些变量。
过程可以使用未在过程中显式声明的变量,但如果在模块级别定义的任何内容具有相同的名称,则会发生命名冲突。 如果过程引用与其他过程、常量或变量具有相同名称的未声明变量,则假定该过程引用该模块级别名称。 显示声明变量可避免此类型的冲突。 使用 Option Explicit 语句强制显式声明变量。
Visual Basic 可以重新安排算术表达式以提高内部效率。 当函数更改相同表达式中变量的值时,应避免在算术表达式中使用 Function 过程。
使用 Function 语句声明组成 Function 过程主体的名称、参数和代码。
在excel中新建vba
右键鼠标出现自定义功能区。
Private Function getAverage(x As Double, y As Double, z As Double) As Double
Dim result As Double
result = 0
Dim count As Integer
If x > 0 Then
result = result + x
count = count + 1
End If
If y > 0 Then
result = result + y
count = count + 1
End If
If z > 0 Then
result = result + z
count = count + 1
End If
getAverage = result / count
End Function
Sub learn1()
Dim result As Double
result = getAverage(-12.43, 91.99, 1992.03)
MsgBox "The average is " & result
End Sub
运行
使用 ParamArray 关键字允许函数接受可变数量的参数。
Private Function getAverage(ParamArray nums()) As Double
Dim result As Double
result = 0
Dim count As Integer
For Each num In nums
If num > 0 Then
result = result + num
count = count + 1
End If
Next
getAverage = result / count
End Function
Sub learn1()
Dim result As Double
result = getAverage(-12.43, 91.99, 1992.03)
MsgBox "The average is " & result
End Sub
Optional 参数具有默认值和类型,而不是 Variant。
Private Function getAverage(x As Double, Optional y As Double = 1, Optional z As Double = 1) As Double
Dim result As Double
result = 0
Dim count As Integer
If x > 0 Then
result = result + x
count = count + 1
End If
If y > 0 Then
result = result + y
count = count + 1
End If
If z > 0 Then
result = result + z
count = count + 1
End If
getAverage = result / count
End Function
Sub learn1()
Dim result As Double
result = getAverage(-12.43)
MsgBox "The average is " & result
End Sub
编写 Sub 过程
Sub 过程是一系列 Visual Basic 语句,由 Sub 语句和 End Sub 语句括起来,这些语句执行操作但不返回值。 Sub 过程可采用参数,例如通过调用过程传递的常量、变量或表达式。 如果 Sub 过程没有参数,则 Sub 语句必须包括一组空括号。
下面的 Sub 过程具有说明每个行的注释。
' Declares a procedure named GetInfo
' This Sub procedure takes no arguments
Sub GetInfo()
' Declares a string variable named answer
Dim answer As String
' Assigns the return value of the InputBox function to answer
answer = InputBox(Prompt:="What is your name?")
' Conditional If...Then...Else statement
If answer = Empty Then
' Calls the MsgBox function
MsgBox Prompt:="You did not enter a name."
Else
' MsgBox function concatenated with the variable answer
MsgBox Prompt:="Your name is " & answer
' Ends the If...Then...Else statement
End If
' Ends the Sub procedure
End Sub
未完下一节继续