在VBA中使用变量名调用函数

时间:2016-03-02 21:27:41

标签: excel vba excel-vba

提前致谢。

我正在尝试使用变量名调用函数。它正在抛出错误

无法找到宏'testfunc'。 无错误地恢复

我的代码:我尝试了以下3条语句,但都犯了同样的错误。

sFuncName = "testfunc"

ExtractData = Application.Run("Sheet.xls" & sFuncName, s1, s2)

ExtractData = Application.Run(sFuncName, s1, s2)

ExtractData = CallByName("Sheet.xls", sFuncName, VbMethod, s1, s2)

请注意,sFuncName会返回一个值&我当时打开了2个Excel,我正在尝试将数据从一个Excel复制到另一个。

请帮助我实现这一目标。

Private Function ABC
  sFuncName = oMapWksht.Cells(sMapRowItr, 3).Value
  'sFuncName = "testfunc"
  ExtractData = Application.Run("Sheet.xls" & sFuncName, s1, s2)
  'ExtractData = Application.Run(sFuncName, s1, s2)
  'ExtractData = CallByName("Sheet.xls", sFuncName, VbMethod, s1, s2)
End Function
Public Function testfunc(ByVal s1 As String, ByVal s2 As String) As    Boolean
--
---
----
End Function

2 个答案:

答案 0 :(得分:1)

您可以使用字符串变量来保存Sub的名称。以下是与调用者在同一模块中的Sub的示例:

Sub MAIN()
    Dim st As String
    st = "whatever"
    Application.Run st
End Sub

Public Sub whatever()
    MsgBox "whatever"
End Sub

如果调用者和被叫子属于不同的模块,则语法可能略有不同。

修改#1:

如果我们想在同一工作簿中的另一个模块中调用Sub,语法将是相同的。

如果我们想在另一个工作簿中调用一个Sub ,并且两个工作簿都已打开,那么调用者将会是这样的:

Sub MAIN()
    Dim st As String
    st = "Book2.xlsm!whatever"
    Application.Run st
End Sub

我通常会声明名为Sub Public,但我不知道这是否有必要。

修改#2

要在工作表单元格中使用其他工作簿的 UDF(),请执行以下操作:

enter image description here

其中qwerty()Public UDF()

答案 1 :(得分:1)

如果您调用的函数与调用者位于同一工作簿中,则打开的工作簿数量并不重要。

如果调用的过程在整个项目中没有唯一的名称,则需要至少使用模块的名称来限定函数名称。这应该让你去:

Module1 (来电者)

Sub DoSomething()
    Debug.Print Application.Run("Module2.Test", "Test")
End Sub

Module2 (被调用者)

Public Function Test(ByVal title As String) As VbMsgBoxResult
    Test = MsgBox("Works?", vbQuestion + vbYesNo, title)
End Function