VBA MS-Access: функция в частной подпрограмме для доступа к подпеременным - PullRequest
2 голосов
/ 16 декабря 2011

Это простой вопрос.Я немного погуглил, но нашел немного подходящего.

Я закончил 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' может быть использована в функции.Оптимально, чтобы также получить доступ к переменным, установленным функцией, без необходимости помещать их в массив и возвращать это.

На самом деле, я был бы рад простому включению или макросу для этого.Это просто во избежание дублирования кода.

Ответы [ 2 ]

7 голосов
/ 16 декабря 2011

Вы не можете вложить функцию в подобную подпрограмму, она просто покажет вам ошибку при компиляции.

Поместите функцию за пределы подпрограммы и передайте ей все переменные, необходимые для вычисления:

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 в функции, она изменится в подпрограмме.

3 голосов
/ 16 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...