2016-03-02 268 views
2

在此先感谢。使用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中复制到其他。

请帮我实现这一点。

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 
+0

到底在哪'testfunc'位于:它是从不同的工作簿你发布的代码? –

+0

我打开了2个工作簿。我拥有Book1中的所有代码并试图从Book2中复制数据。 “testfunc”是同一工作簿中的另一个功能。 – Venkat

+0

在你的'VBAProject'中,确保你把你的函数(如'testfunc')放到一个模块中(在Project Explorer中的Modules下面),而不是作为工作表或工作簿中的VBA代码(在' Microsoft Excel对象“)。 – rskar

回答

1

如果你正在调用的函数在与调用者相同的工作簿,打开多少工作簿并不重要。

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

模块1(主叫)

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

单词数(被叫)

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

调用的函数在整个项目中是唯一的。当我从表中动态读取值时,sFuncName返回差异值。 sFuncName返回差异值testfunc1,testfunc2 .... – Venkat

+0

然后问题出现在其他地方,可能是您在单元格中读取的值 - 您完全完全确定您正在阅读的内容是否与现有过程的名称相匹配?没有前导/尾随空白? –

+0

我已经检查过,它明显返回错误的函数名称,没有任何前导/尾随空格。我使用的是Excel 2003,如果这不会导致任何问题。 – Venkat

1

您可以使用字符串变量来存放子的名字。以下是相同的模块作为呼叫者在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 

我通常声明称为子Public,但我不知道如果这是必要的。

EDIT#2

要使用其他工作簿的UDF()在工作表单元格,则:

enter image description here

其中qwerty()PublicUDF()

+0

我刚刚添加了我的脚本的某些部分...我从中获取函数名(sFuncName)工作簿。 – Venkat

相关问题