如何在 vba 代码中调用用户定义的函数
How to call a user defined function in vba code
我在模块二中创建了一个名为 "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 语法。
Application.WorksheetFunction
是 Excel
库中定义的 class;您可以在 对象浏览器 (F2):
中找到它
标准模块中的 public Function
只是一个可以从工作表单元格调用的函数(前提是它没有 副作用 ),就像工作簿的 VBA 项目中的任何地方一样:您不能编写库中定义的 class 的 "becomes a member" 的任何 VBA 代码你在引用。
因此,如果您在名为 Module1
的模块中有一个名为 MyFunction
的函数,您可以像这样调用它:
foo = MyFunction(args)
或者像这样:
foo = Module1.MyFunction(args)
所以在这种情况下:
t = t_value(theta)
Would it be easier to just put the formula into the Sub?
不,因为 Sub
不会 return 值(但是,您可以传递变量 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
有点不同——我可能会建议您不要这样做,因为遵循函数应该 return 值的一般最佳实践和子例程应该只执行操作 and/or 操纵对象。
直接使用
t = t_value(theta)
, 代替
t = Application.WorksheetFunction.t_value(theta)
我在模块二中创建了一个名为 "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 语法。
Application.WorksheetFunction
是 Excel
库中定义的 class;您可以在 对象浏览器 (F2):
标准模块中的 public Function
只是一个可以从工作表单元格调用的函数(前提是它没有 副作用 ),就像工作簿的 VBA 项目中的任何地方一样:您不能编写库中定义的 class 的 "becomes a member" 的任何 VBA 代码你在引用。
因此,如果您在名为 Module1
的模块中有一个名为 MyFunction
的函数,您可以像这样调用它:
foo = MyFunction(args)
或者像这样:
foo = Module1.MyFunction(args)
所以在这种情况下:
t = t_value(theta)
Would it be easier to just put the formula into the Sub?
不,因为 Sub
不会 return 值(但是,您可以传递变量 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
有点不同——我可能会建议您不要这样做,因为遵循函数应该 return 值的一般最佳实践和子例程应该只执行操作 and/or 操纵对象。
直接使用
t = t_value(theta)
, 代替
t = Application.WorksheetFunction.t_value(theta)