如何在VBA代码中调用用户定义的函数

时间:2018-08-25 15:49:06

标签: excel vba userform

我在第二个模块中创建了一个名为"t_value"的Public函数。现在,我想在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 :(得分:3)

Application.WorksheetFunctionExcel库中定义的类;您可以在对象浏览器(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有点不同-我可能会建议您遵循一般的最佳实践,即函数应该返回值,而子例程应该执行操作, /或操作对象。

答案 1 :(得分:2)

直接使用 t = t_value(theta) , 代替 t = Application.WorksheetFunction.t_value(theta)