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,它在子中更改。

+1

默认情况下,VBA中的所有参数均通过引用传递。您需要使用“ByVal”关键字来显式传递它们。我想@webturner已经知道这一点,就像我一样,只使用'ByRef`关键字来增强代码的可读性。在我的代码中,如果一个参数被标记为“ByRef”,它通常意味着我可能会故意在我的过程中更改该参数的值,意图在过程退出后新值有意义。 – mwolfe02 2011-12-16 20:51:48

+1

说了这么多之后,我通常会尽量避免更改过程中参数的值,因为当您开始这样做时,很容易引入难以找到的错误。如果我想从一个过程中返回多个值,我创建一个返回用户定义类型的函数。 – mwolfe02 2011-12-16 20:57:29

在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关键字复制副本的模块。 (它仅复制变量,而不是函数和子过程。)