Как вызвать пользовательскую функцию в коде VBA - PullRequest
0 голосов
/ 25 августа 2018

Я создал функцию Public во втором модуле, которая называется "t_value".Теперь я хочу использовать эту функцию в коде VBA для пользовательской формы, которая использует ввод от пользовательской формы.

Это функция:

Public Function t_value(theta As Variant)
    Dim theta_1 As Integer, theta_2 As Integer
    Dim A As Variant, B As Variant, s As Variant

    theta_1 = Application.WorksheetFunction.Floor(theta, 5)
    theta_2 = Application.WorksheetFunction.Ceiling(theta, 5)
    A = theta - theta_1
    B = theta_2 - theta_1
    s = A / B
    t_value = s

End Function

Вот код, который я хотел быиспользовать вышеуказанную функцию в:

Private Sub Submit_Click()
    Dim theta As Variant, alpha As Variant, t As Variant, u As Variant

    theta = UserForm1.theta_input.Value
    alpha = UserForm1.alpha_input.Value
    t = Application.WorksheetFunction.t_value(theta)

End Sub

Обычно "Application.WorksheetFunction.[function]" работает, но в этой ситуации у меня это не сработает - я подумал, что это может быть связано с тем, что я создал формулу.Будет ли проще просто поместить формулу в Sub?Я беспокоился о времени выполнения.Я довольно новичок, поэтому я не совсем знаком с синтаксисом VBA.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

напрямую использовать t = t_value(theta) , вместо t = Application.WorksheetFunction.t_value(theta)

0 голосов
/ 25 августа 2018

Application.WorksheetFunction - это класс, определенный в библиотеке Excel; Вы можете найти его в Обозревателе объектов (F2):

object browser showing WorksheetFunction class

Публичный Function в стандартном модуле - это просто функция, которую можно вызывать из ячейки рабочего листа (при условии, что у нее нет побочных эффектов ), так же как и из любого места в Проект VBA рабочей книги: вы не можете написать код VBA, который "становится членом" класса, определенного в библиотеке, на которую вы ссылаетесь.

Так что если у вас есть функция с именем MyFunction в модуле с именем Module1, вы можете вызвать ее так:

foo = MyFunction(args)

Или вот так:

foo = Module1.MyFunction(args)

Так что в этом случае:

t = t_value(theta)

Не проще ли поместить формулу в Sub?

Нет, потому что Sub не будет возвращать значение (однако вы можете передавать переменные ByRef):

Sub t_value(theta as variant, ByRef t as Variant)

Dim theta_1 As Integer, theta_2 As Integer
Dim A As Variant, B As Variant, s As Variant

theta_1 = Application.WorksheetFunction.Floor(theta, 5)
theta_2 = Application.WorksheetFunction.Ceiling(theta, 5)
A = theta - theta_1
B = theta_2 - theta_1
s = A / B
t = s   '## Assign the value to the ByRef 't' variable and it should retain its value in the calling procedure
End Sub

Если вы решите разместить эту функцию в модуле (Public) или в модуле пользовательской формы, это решение по проекту, которое зависит от того, хотите ли вы, чтобы эта функция была общедоступной вне экземпляра (ов) формы. Если вы решите сделать эту функцию sub немного другой - я, вероятно, рекомендовал бы против нее, следуя общепринятой практике, что функции должны возвращать значения, а подпрограммы должны просто выполнять действия и / или манипулировать объекты.

...