Vba ExecuteExcel4Macro方法在Mac上的Excel 2011中失败,出现1004错误

Vba ExecuteExcel4Macro方法在Mac上的Excel 2011中失败,出现1004错误,vba,excel,excel-2011,Vba,Excel,Excel 2011,因此,我是另一个希望使用ExecuteExcel4Macro方法调用从封闭工作簿中的特定单元格和查找范围检索数据的人。我在这里和其他地方看到了许多例子和问题的答案。我正在(或将要)使用John Walkenbach的一个程序变体,并在这里和其他论坛上引用。(参见9311188的螺纹。) 调用ExecuteExcel4Macro失败,错误为“1004-对象的方法“ExecuteExcel4Macro”\u Global“失败”。对我来说,这不算什么。我仔细检查了目录路径、文件名和工作表名等等。函数

因此,我是另一个希望使用ExecuteExcel4Macro方法调用从封闭工作簿中的特定单元格和查找范围检索数据的人。我在这里和其他地方看到了许多例子和问题的答案。我正在(或将要)使用John Walkenbach的一个程序变体,并在这里和其他论坛上引用。(参见9311188的螺纹。)

调用ExecuteExcel4Macro失败,错误为“1004-对象的方法“ExecuteExcel4Macro”\u Global“失败”。对我来说,这不算什么。我仔细检查了目录路径、文件名和工作表名等等。函数的作用是:找到正确的文件。我甚至将文件放在根目录中,以消除路径复杂性或该方法的参数过长。一个复杂的问题是,我使用的是Mac操作系统10.8和Excel 2011。Mac OS使用“:”而不是“\”作为目录分隔符

但我真的不需要讨论这些,因为问题似乎是关于单元格引用寻址的一些基本问题。我无法让ExecuteExcel4Macro在同一个工作表中使用Excel函数成功执行,该函数可以处理任何单元格或区域,更不用说远程、关闭的工作表引用了。因此,我将我的示例代码浓缩为要点–没有远程引用,只有一个工作表中单元格上的函数

在下面的示例中,我有一个简单的例程,它执行一些示例Excel函数,并显示一个带有成功结果或错误消息的MessageBox,以及方法调用的参数。还有一个函数可以在需要时将A1样式的引用转换为R1C1。函数列表在例程中,只需根据需要注释/取消注释即可执行要测试的函数

Function MakeR1C1(A1Formula As String) As String

MakeR1C1 = Application.ConvertFormula( _
    Formula:=A1Formula, _
    fromReferenceStyle:=xlA1, _
    toReferenceStyle:=xlR1C1, _
    ToAbsolute:=xlAbsolute)

End Function

Sub TestExcel4Macro()
    On Error GoTo ErrorTrap
    Dim arg As String

'    arg = "GET.CELL(42)"
'    arg = "CHAR(65)"
'    arg = "LEN(""ABCDE"")"
'    arg = "SUM(2,5,8)"
'    arg = "INFO(""directory"")"
'    arg = "INFO(""numfile"")"

'    arg = "SUM(A32:A34)"
'    arg = "SUM(ValList)"
'    arg = MakeR1C1("SUM(A32:A34)")
'    arg = "SUM(R32C1:R34C1)"

    Rtn = ExecuteExcel4Macro(arg)

        MsgBox "COMPLETED" & Chr(13) & _
                    "arg: " & arg & Chr(13) & _
                    "Return Value: " & Rtn
Exit Sub

ErrorTrap:
    Beep
    MsgBox "FAILED" & Chr(13) & _
                    "arg: " & arg & Chr(13) & _
                    "Error number: " & Err & Chr(13) & _
                    Error(Err)
End Sub
前六个都可以正常工作,返回您期望的值:

arg=“GET.CELL(42)”
这将返回左边距或其他任何值
arg=“CHAR(65)”
很好,你会得到一个“A”
arg=“LEN”(“ABCDE”)”
Nice,这是一个5
arg=“SUM(2,5,8)”
ok,15
arg=“INFO”(“directory”)”
Yep,带有宏的活动工作簿的目录路径
arg=“INFO”(“numfile”)”
和工作簿中的页数(加上1?任意值)

因此,我知道我正在正确地访问该方法;它确实有效;在参数中不使用“=”;两个INFO()函数告诉我它可以访问有关此工作簿的信息;i、 它不需要显式的完整目录路径来找到自己

现在,一些函数引用工作表中的单元格。这些都可以作为工作表单元格中的公式正常工作。 但调用该方法失败,错误代码如下:

arg=“SUM(A32:A34)”
13-类型不匹配
正如预期的那样,该方法需要R1C1样式的引用

arg=“SUM(ValList)”
13-类型不匹配
好吧,不太奇怪,所以它对命名范围不起作用。太糟糕了,我正指望着呢

arg=MakeR1C1(“SUM(A32:A34)”)
1004-对象“\u Global”的方法“ExecuteExcel4Macro”失败
现在是困惑。MakeR1C1()将A1地址转换为“SUM(R32C1:R34C1)”

arg=“SUM(R32C1:R34C1)”
1004-对象\u Global的方法“ExecuteExcel4Macro”失败
而使用R1C1样式显式设置参数也会失败

如果这是因为一些简单而明显的事情,我会非常尴尬。但我会冒这个险,因为我被难住了。
如果它不是那么简单,那么,大师,去做吧。如果我解决了这个简单的引用寻址问题,那么远程文件引用也应该到位

我将特别感谢任何人谁可以测试这些在Windows版本,让我知道你得到什么。这就是我最担心的——我无法修复的Mac不兼容

提前感谢大家。
PS:我希望我已经正确地标记了以上所有内容,我试过了

编辑:也许我应该提到,要运行TestExcel4Macro()子例程,我只需在VBA编辑器中捣碎F5键。

Quote: Microsoft Excel 4.0宏未在 当前工作簿或工作表。这意味着任何引用都应该是 外部,并应指定显式工作簿名称。比如说 运行必须使用的Book1中的Microsoft Excel 4.0宏“My_宏” “Book1!My_宏()。如果未指定工作簿名称,则会显示此名称
方法失败


您是否尝试过将arg定义为
Variant
而不是
String

以下是对我有效的方法(Windows smthg下的MS Excel 2010):您必须在引用单元格之前指定工作簿+工作表;并对R1C1进行了转换

Sub TestExcel4Macro()
    On Error GoTo ErrorTrap
    Dim arg As String
    Dim this_workbook As String
    ' workbook named "myBook" having a sheet called "mySheet" where my data is
    this_workbook = "[myBook.xlsm]mySheet!"

    arg = "SUM(" & this_workbook & "A32:A34)"
    arg = MakeR1C1("SUM(A32:A34)")

    Rtn = ExecuteExcel4Macro(arg)
    MsgBox "COMPLETED" & Chr(13) & _
                 "arg: " & arg & Chr(13) & _
                 "Return Value: " & Rtn
Exit Sub

ErrorTrap:
    Beep
    MsgBox "FAILED" & Chr(13) & _
                    "arg: " & arg & Chr(13) & _
                    "Error number: " & Err & Chr(13) & _
                    Error(Err)
End Sub

嗨,J·巴克。谢谢你的快速回复。如果我理解你的意思,那么我将恭敬地表示不同意。存储在工作簿代码模块中的宏可以在该工作簿中调用,而无需显式的名称前缀或说明符。工作表中的按钮或其他控件似乎不需要它,用户定义的功能也不需要它。如果它是存储在调用方之外的另一个工作簿中的宏,那么,是的。无论如何,我不认为这是我的问题。我的问题是调用内置的ExecuteExcel4Macro VBA方法。但也许我误解了。我直接从MS帮助中粘贴了该方法的文本。如果你认为你比微软懂得更多,我和其他任何人都帮不了你。对不起,伙计。我真的不是想惹你生气。不,我想我知道的不比史密斯女士多,我想你或其他人可以帮助我。是的,我在页面上看到了关于方法的那一段,但我不是