Как вызвать определенную пользователем функцию в коде vba

Я создал публичную функцию t_value 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 . Рабочий лист . Этаж ( тета , 5 ) theta_2 = Приложение . Рабочий лист . Потолок ( тета , 5 ) = тета - theta_1 B = theta_2 - theta_1 S = / B T_value = S End Function в модуле два называется . Теперь я хочу использовать эту функцию в коде VBA для пользовательской формы, которая использует входные данные пользовательской формы. 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]"

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

Application.WorksheetFunction

Обычно Excelработает, но в этой ситуации это не сработает - я думал, это может быть связано с тем, что я создал формулу. Было бы проще просто ввести формулу в функцию? Я беспокоился о времени выполнения. Я довольно новый, поэтому я не полностью знаком с синтаксисом VBA.

excel,vba,userform,

3

Ответов: 2


3 принят

MyFunction- класс, определенный в Module1библиотеке; вы можете найти его в обозревателе объектов (F2):

браузер объектов, показывающий класс WorksheetFunction

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

Поэтому, если у вас есть функция, вызываемая в вызываемом модуле , вы можете вызвать ее следующим образом:foo = MyFunction(args)foo = Module1.MyFunction(args)

t = t_value(theta)

Или вот так:

Sub

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

ByRef

Было бы проще просто поместить формулу в Sub t_value ( theta как вариант , ByRef t как Variant ) Dim theta_1 As Integer , theta_2 As Integer Dim A As Variant , B As Variant , s As Variant theta_1 = Application . Рабочий лист . Этаж ( тета , 5 ) theta_2 = Приложение . Рабочий лист . Потолок ( тета , 5 ) = тета - theta_1 B = theta_2 - theta_1 S = / B T = S «## Присвоить значение к ByRef 'т' переменная и она должна сохранять свое значение в вызывающей процедуре End Sub ?

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

sub

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


2

Непосредственно используйте t = t_value(theta) вместо t = Application.WorksheetFunction.t_value(theta)

первенствует, VBA UserForm,
Похожие вопросы
Яндекс.Метрика