access2022(microsoft365)实战(4)-语言基础(2)

本文介绍了VisualBasicforApplications(VBA)中的编译常量,如#IfWin64Then等,用于在不同平台上的条件编译。同时,详细阐述了Function语句和Sub过程的用法,包括参数传递、返回值以及如何编写和调用。文章还展示了如何使用条件编译有选择地运行代码块,以及Function过程的递归和局部变量管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译常量

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

未完下一节继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值