VBA MS-Access:私人小组访问子变量的功能
问题描述:
这是一个简单的问题。我搜索了一下,但发现没有多大关系。VBA MS-Access:私人小组访问子变量的功能
我已经完成了一个large-ish Sub,并希望用任何需要几个输入参数并返回结果的代码来替换重复的代码块。
所以基本上,我想剪的代码片段,去
Private Sub Command1_Click()
Function Calc(input) as Integer
<insert snippet using Sub variables>
End Function
Dim base As Integer
base=1337
total = Calc(55)
if total <100 then total = Calc(56)
End Sub
...其中变量“基地”可以在函数中使用。最理想的是,也可以访问由函数设置的变量,而不必将它们放入数组中并返回。其实,我会很满意这个简单的包含或宏。这只是为了避免重复的代码。
答
你不能像这样在一个子集中嵌套一个函数,它会在编译时向你显示一个错误。
把功能子外,并通过它的所有需要做计算的变量:
Private Sub Command1_Click()
Dim base As Integer
base=1337
total = Calc(55, base)
if total <100 then total = Calc(56, base)
End Sub
Function Calc(input as integer, ByRef base as integer) as Integer
<insert snippet using Sub variables>
End Function
使用ByRef关键字装置,用于将可变的引用被传递而不是值,这意味着,如果您在函数中更新base
,它在子中更改。
答
在Pascal或Modula-2等语言中,可以嵌套过程和函数。这在VBA中是不可能的。
如果有许多参数来传递,然后代替具有用于参数单个变量,也可以重新分组在一个用户定义的类型是这样的参数:
Private Type CalcParameters
number As Double
otherNumber As Double
percent As Long
End Type
Function Calc(params As CalcParameters) As Long
Calc = params.percent * (params.number + params.otherNumber)/100
End Function
Private Sub Command1_Click()
Dim params As CalcParameters
Dim total As Long
params.number = 77.5
params.otherNumber = 2.5
params.percent = 30
total = Calc(params)
End Sub
一个更详尽的解决方案是通过创建一个类模块来使用面向对象的方法。让我们把它称为“clsCalcData”:
Option Compare Database
Option Explicit
Public Number As Double
Public OtherNumber As Double
Public Percent As Long
Public Function GetTotal() As Long
GetTotal = Percent * (Number + OtherNumber)/100
End Function
你会使用这样的:
Private Sub Command1_Click()
Dim calcData As clsCalcData
Dim total As Long
Set calcData = New clsCalcData
calcData.Number = 77.5
calcData.OtherNumber = 2.5
calcData.Percent = 30
total = calcData.GetTotal()
End Sub
请注意,在这里你没有传递任何参数可言,因为GetTotal函数可以访问的值直。
您可以将类模块想像为可以使用new
关键字复制副本的模块。 (它仅复制变量,而不是函数和子过程。)
默认情况下,VBA中的所有参数均通过引用传递。您需要使用“ByVal”关键字来显式传递它们。我想@webturner已经知道这一点,就像我一样,只使用'ByRef`关键字来增强代码的可读性。在我的代码中,如果一个参数被标记为“ByRef”,它通常意味着我可能会故意在我的过程中更改该参数的值,意图在过程退出后新值有意义。 – mwolfe02 2011-12-16 20:51:48
说了这么多之后,我通常会尽量避免更改过程中参数的值,因为当您开始这样做时,很容易引入难以找到的错误。如果我想从一个过程中返回多个值,我创建一个返回用户定义类型的函数。 – mwolfe02 2011-12-16 20:57:29