Application.WorksheetFunction
- это класс, определенный в библиотеке Excel
; Вы можете найти его в Обозревателе объектов (F2):
![object browser showing WorksheetFunction class](https://i.stack.imgur.com/R5hE0.png)
Публичный 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
немного другой - я, вероятно, рекомендовал бы против нее, следуя общепринятой практике, что функции должны возвращать значения, а подпрограммы должны просто выполнять действия и / или манипулировать объекты.