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

时间:2014-10-15 18:41:07

标签: excel vba excel-vba excel-2011

所以我是另一个想要使用ExecuteExcel4Macro方法调用来从特定单元格中查找数据和查找已关闭工作簿中的范围的人。我在这里和其他地方看到过很多关于问题的例子和答案。我(或将会)使用约翰沃肯巴赫记入的例行程序的变体,并在此处和其他论坛引用。 (参见9311188的主题。)

对ExecuteExcel4Macro的调用失败并显示错误" 1004 - Method' ExecuteExcel4Macro'对象' _Global'失败&#34 ;.对我而言,这并不是很重要。我仔细检查了目录路径,文件和工作表名称,所有这些。 DIR()函数可以找到文件。我甚至将文件放在根目录中以消除方法的路径复杂性或太长的参数。一个复杂因素是我在使用OS 10.8并使用Excel 2011的Mac上.Mac OS使用":"而不是" \"用于目录分隔符。

但我并不是真的需要深入研究这一切,因为问题似乎是细胞参考寻址的基础。我无法使用Excel函数在同一工作表中成功执行ExecuteExcel4Macro,该函数可以处理任何单元格或范围,更别关注远程,已关闭的工作表参考。所以我将我的示例代码压缩到基本要素 - 没有远程引用,只是在一个工作表中的单元格上的函数。

在下面的示例中,我有一个简单的例程,它执行一些示例Excel函数,并显示带有成功结果或错误消息的MessageBox,以及Method调用的参数。还有一个函数可以在需要时将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"")"      很好,那是5;
arg = "SUM(2,5,8)"          好的,15;
arg = "INFO(""directory"")" 是的,带有宏的活动工作簿的目录路径;
arg = "INFO(""numfile"")"   和工作簿中的工作表数量(加1?无论如何)。

因此,我知道我正确地访问了方法;它确实有效;你没有使用" ="在论证中;两个INFO()函数告诉我它能够访问有关此工作簿的信息;即它不需要明确的完整目录路径来找到自己。

现在有一些函数可以引用工作表中的单元格。这些都可以作为工作表中单元格中的公式正常工作。 但它们作为对Method的调用失败,并带有相应的错误代码:

arg = "SUM(A32:A34)"            13 - 类型不匹配
正如所料,该方法需要R1C1样式引用。

arg = "SUM(ValList)"            13 - 类型不匹配
好吧,并不太令人惊讶,所以它不会使用命名范围。太糟糕了,我指望那个。

arg = MakeR1C1("SUM(A32:A34)")  1004 - 方法' ExecuteExcel4Macro'对象' _Global'失败
现在困惑。 MakeR1C1()将A1寻址转换为" SUM(R32C1:R34C1)"。

arg = "SUM(R32C1:R34C1)"        1004 - 方法' ExecuteExcel4Macro'对象' _Global'失败
使用R1C1样式显式设置参数失败也是如此。

如果这是由于简单而明显的原因,我会感到很尴尬。但我会冒险,因为我很难过 如果它不那么简单,那么,大师,就有它。如果我弄清楚这个简单的引用寻址问题,那么远程文件引用也应该到位。

我特别感谢能够在Windows版本中测试这些内容的任何人,让我知道你得到了什么。这就是我最担心的问题 - 我无法解决的Mac不兼容问题。

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

编辑:也许我应该提到要运行我的TestExcel4Macro()子程序,我只是在VBA编辑器中混搭F5键。

3 个答案:

答案 0 :(得分:1)

引用:

  

Microsoft Excel 4.0宏未在上下文中进行评估   当前的工作簿或工作表。这意味着任何引用都应该是   外部并应指定显式工作簿名称。例如,到   运行Microsoft Excel 4.0宏" My_Macro"在Book1中你必须使用   "!第一册My_Macro()&#34 ;.如果您没有指定工作簿名称,那么这个   方法失败。

答案 1 :(得分:0)

这对我有用(Windows smthg下的MS Excel 2010):在引用Cells之前必须指定工作簿+ Sheet;并进行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

答案 2 :(得分:-1)

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