这是一个简单的问题。我已经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中使用。最理想的是,还要访问函数设置的变量,而不必将它们放在数组中并返回它。
实际上,我对这个简单的包含或宏感到满意。这只是为了避免重复的代码。
答案 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
关键字复制的模块。 (它只复制变量,而不复制函数和子程序。)