VBA MS-Access:私有子函数访问子变量

时间:2011-12-16 12:41:24

标签: ms-access variables vba scope

这是一个简单的问题。我已经google了一下,但发现并不是那么相关。

我已经完成了一个大型的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

...其中变量'base'可以在Function中使用。最理想的是,还要访问函数设置的变量,而不必将它们放在数组中并返回它。

实际上,我对这个简单的包含或宏感到满意。这只是为了避免重复的代码。

2 个答案:

答案 0 :(得分:7)

你不能在这样的子类中嵌套一个函数,它只会在编译时显示错误。

将函数放在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 :(得分:3)

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