В таких языках, как 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
. (Копирует только переменные, а не функции и подпроцедуры.)