【问题标题】:How to call a user defined function in vba code如何在 vba 代码中调用用户定义的函数
【发布时间】:2019-01-31 18:50:40
【问题描述】:

我在模块二中创建了一个名为 "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 语法并不完全熟悉。

【问题讨论】:

  • 为什么您希望您的函数在预定义的Application.WorksheetFunction 下可用?如果你把它放在一个模块中,只需调用它t_value(theta)
  • 这就是我过去回忆(预定义)函数的方式。我不知道模块可能会有什么不同。感谢您的帮助!
  • ++ 高质量的第一个问题 :) 干杯并欢迎来到 StackOverflow。

标签: excel vba userform


【解决方案1】:

Application.WorksheetFunctionExcel库中定义的类;您可以在 对象浏览器 (F2) 中找到它:

标准模块中的公共Function 只是一个可以从工作表单元格调用的函数(前提是它没有副作用),也可以从任何地方调用工作簿的 VBA 项目:您不能编写任何“成为”在您引用的库中定义的类的成员的 VBA 代码。

因此,如果您在名为 Module1 的模块中有一个名为 MyFunction 的函数,则可以这样调用它:

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 有点不同——我可能会建议按照一般最佳实践反对它,即函数应该返回值,子例程应该只执行操作和/或操作对象。

【讨论】:

  • 感谢您的提示!我真的很感激!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-12-19
    • 2018-02-11
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多