VBA的直接或间接调用的语法格式

简介: VBA|过程或方法内部的直接或间接调用与相对怪异的语法格式

在VBA中,有两种基本代码模块,过程(Sub Procedure)和函数(Function),有返回值的代码模块使用函数,没有返回值的代码模块使用过程。

两种代码模块都可以使用参数,也可以不使用参数,参数的传递方式有两种,传值和传址。

过程在Excel中可以通过菜单、工具栏、按钮、快捷键等方式直接调用,函数可以在工作表的公式中如同内置函数一样调用。

过程和函数在模块内可以直接调用,也可以使用OnTime或OnKey方法来间接调用。

1 直接调用
过程和函数在模块内的调用可以使用以下语法格式:

Sub main()
call 过程名
过程名
值 = 函数名()
End Sub
对许多内建函数、语句和方法,Visual Basic 提供了命名参数方法来快捷传递参数值。对命名参数,通过给命名参数赋值,就可按任意次序提供任意多参数。为此,键入命名参数,其后为冒号、等号和值 (MyArgument := "SomeValue") ,可以按任意次序安排这些赋值,它们之间用逗号分开。

在调过程或方法调用时,参数是否使用括号?视是否使用其参数而定:

Sub calc()
Application.ActivateMicrosoftApp Index:=0 ' 打开windows附件中的计算器
End Sub

Sub demo(a As Integer)
Debug.Print a
End Sub

Function foo()
foo = 3
End Function

Function add(ByVal a As Double, ByRef b As Double, Optional c As Double)
a = a + 11
b = b + 22
add = a + b + c
End Function

Sub test()
Dim ws1 As Worksheet, str1 As String
Dim val As Double, ref As Double, sum As Double
Call calc '使用call调用过程
calc ' 不使用call调用过程
demo (3)
val = foo()
ref = 4
sum = add(val, ref) ' 调用函数
Debug.Print val, ref, sum '3 26 40
'InputBox(prompt [, title] [, default] [, xpos] [, ypos] _ [, helpfile, context])
InputBox ("please input:") '调用内置函数
InputBox Prompt:="请输入删除的工作表名称:" '在调用不使用返回值的函数时不使用括号
str1 = InputBox(Prompt:="请输入删除的工作表名称:") '在调用使用返回值的函数时才应使用括号
End Sub
如果实际上在调用Sub时确实无意中使用了括号,则VB6将按值而不是按引用传递参数。

Sub AddOne(ByRef i As Integer)
i = i + 1
End Sub

Sub Command1_Click()
Dim i As Integer
i = 1
AddOne i 'i will be passed by reference and increased by 1
MsgBox i 'Will print"2"
AddOne (i) 'i will be passed by value, so the return value will be lost!!
MsgBox i 'Will still print"2"!!
End Sub
2 间接调用
2.1 OnTime 方法

使用Application 对象的OnTime 方法,可安排一个过程在某个特定的时间运行(既可以是具体指定的某个时间,也可以是指定的一段时间之后)。其语法格式如下:

表达式.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
各参数的含义如下。

● EarliestTime:希望此过程运行的时间。

● Procedure:要运行的过程名。

● LatestTime:过程开始运行的最晚时间。例如,如果LatestTime 参数设置为EarliestTime+30,且当到达EarliestTime 时间时,由于其他过程处于运行状态而导致Excel 不能处于“就绪”、“复制”、“剪切”或“查找”模式,则Excel 将等待30 秒让第一个过程先完成。如果Excel 不能在30 秒内回到“就绪”模式,则不运行此过程。如果省略该参数, Excel 将一直等到可以运行该过程为止。

● Schedule:如果为True,则预定一个新的OnTime 过程。如果为False,则清除先前设置的过程。默认值为True。

(1)“打开整点报时”按钮的VBA 代码如下:
//代码效果参考:http://www.zidongmutanji.com/bxxx/452588.html

Sub starttime()
Application.OnTime EarliestTime:=TimeSerial((Hour(Now) + 1) Mod 24, 0, 0), _
Procedure:="starttime"
MsgBox "现在时间是:" & Hour(Now) & " 点!"
End Sub
以上代码首先通过OnTime 方法设置整点时(小时数与24 进行模运算)调用的过程,接着显示一个对话框进行报时。

(2)“结束整点报时”按钮的VBA 代码如下:

Sub endtime()
On Error Resume Next
Application.OnTime EarliestTime:=TimeSerial((Hour(Now) + 1) Mod 24, 0,0), _
Procedure:="starttime", schedule:=False
End Sub
以上代码取消OnTime 设置的过程。在执行本过程时,如果没有使用OnTime 设置调用对应的过程,则程序将出错,所以第1 条语句设置错误捕捉。

Sub otime()
Application.OnTime Now() + TimeValue("00:01:00"), "wbSave"
End Sub

Sub wbSave()
This Workbook.Save
Debug.Print (Now())
Call otime
End Sub
2.2 OnKey 方法

使用Application 对象的OnKey 方法,可在设定的特定键或组合键被按下时,运行指定的过程,其语法格式如下:

表达式.OnKey(Key, Procedure)

两个参数的含义如下。

● Key:表示要按的键的字符串,其表示方法与例138 中的SendKeys 方法相同。Key 参数可指定任何单个键或与Alt、Ctrl 或Shift 的组合键(或者这些键的组合),每个键可用一个或多个字符表示。例如,"a"表示字符a,或者"{ENTER}"表示Enter。控制键Shift、Ctrl、Alt 分别用加号(+)、插入符号(^)和百分号(%)表示。

● Procedure:表示要运行的过程名称的字符串。如果Procedure 为空文本(""),则按Key 时不发生任何操作。如果省略Procedure 参数,则Key 恢复为Excel 中的正常结果,同时清除先前使用OnKey 方法所做的特殊击键设置。

1)“设置自定义功能键”按钮的VBA 代码如下:

Sub NextPage()
ActiveWindow.LargeScroll down:=1
End Sub

Sub PrePage()
ActiveWindow.LargeScroll up:=1
End Sub

Sub 设置自定义功能键()
Application.OnKey "%.", "NextPage"
Application.OnKey "%,", "PrePage"
End Sub
(2)“禁止自定义功能键”按钮的VBA 代码如下:

Sub 禁止自定义功能键()
Application.OnKey "%."
Application.OnKey "%,"
End Sub

相关文章
|
7天前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
16 0
|
20天前
|
C++
C++的引用定义语法和应用
C++的引用定义语法和应用
|
2月前
|
编译器 C++
在C++语言中函数的定义
在C++语言中函数的定义
15 0
|
10月前
|
Python
学习Python语言的语法,例如函数、类、模块、循环中的类详解
学习Python语言的语法,例如函数、类、模块、循环中的类详解
53 1
python总结(数据类型、逻辑控制、函数、类与对象、推导式、解包、类型转换、异常、上下文、jsonpath、定时器)
python总结(数据类型、逻辑控制、函数、类与对象、推导式、解包、类型转换、异常、上下文、jsonpath、定时器)
|
Dart 前端开发 JavaScript
dart中将方法当做参数传递时的注意事项
众所周知,Dart是一门面向对象的语言,比Java更纯粹,Dart中的方法也是对象,也有类型Function。这意味着方法可以被分配给对象,也可以当做参数传递给其他方法。
|
Python
Python 获取被调用函数名称,所处模块,被调用代码行
Python 获取被调用函数名称,所处模块,被调用代码行
93 0
|
开发工具
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
436 0
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
|
C语言 C++
【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
157 0
|
Python
Python 技巧篇-同一个方法多次引用不同效果功能实现,可选参数设置方法
Python 技巧篇-同一个方法多次引用不同效果功能实现,可选参数设置方法
179 0