1

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

对 ExecuteExcel4Macro 的调用失败并出现错误“1004 - 对象 '_Global' 的方法 'ExecuteExcel4Macro' 失败”。对我来说,这不是很多事情要做。我已经仔细检查了目录路径、文件和工作表名称,所有这些。DIR() 函数发现文件正常。我什至将文件放在根目录中以消除路径复杂性或方法参数过长。一个复杂的问题是我在一台装有 OS 10.8 并使用 Excel 2011 的 Mac 上。Mac OS 使用“:”而不是“”作为目录分隔符。

但我真的不需要深入了解所有这些,因为问题似乎是关于单元格引用寻址的基本问题。我无法让 ExecuteExcel4Macro 在同一个工作表中成功执行,并使用一个 Excel 函数来处理任何单元格或范围,更不用说远程、封闭的工作表引用了。因此,我将示例代码浓缩为基本要素——没有远程引用,仅在一个工作表中的单元格上运行。

在下面的示例中,我有一个简单的例程,它执行一些示例 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() 函数告诉我它能够访问有关此工作簿的信息;即它不需要明确的完整目录路径来找到它自己。

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

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

arg = "SUM(ValList)"           13 - 类型不匹配
好吧,这并不奇怪,所以它不适用于命名范围。太糟糕了,我指望着那个。

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

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

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

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

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

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

4

3 回答 3

1

引用:

Microsoft Excel 4.0 宏不在当前工作簿或工作表的上下文中进行评估。这意味着任何引用都应该是外部的,并且应该指定一个明确的工作簿名称。例如,要在 Book1 中运行 Microsoft Excel 4.0 宏“My_Macro”,您必须使用“Book1!My_Macro()”。如果不指定工作簿名称,此
方法将失败。

于 2014-10-15T19:00:49.810 回答
0

这对我有用(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
于 2016-03-18T09:02:43.160 回答
-1

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

于 2015-01-23T14:55:19.527 回答