2

ExecuteExcel4MacroPython 中运行 Excel 宏时,我总是得到 False 结果,这是执行的代码:

import win32com.client

filename = r'E:\excel.xls'
xlApp = win32com.client.Dispatch('Excel.Application')
xlApp.visible = 1
xlBook = xlApp.Workbooks.Open(filename)

strPara = xlBook.Name + '!Macro1()'
res = xlApp.ExecuteExcel4Macro(strPara)
print res

xlBook.Close(SaveChanges=0)

“print res”语句的输出是:False

在我搜索MSDNExecuteExcel4Macro上的用法后,我得到以下信息:

ExecuteExcel4Macro -- 运行 Microsoft Excel 4.0 宏函数,然后返回函数的结果。返回类型取决于函数。

然后我就糊涂了:既然Excel中的宏总是一个“子程序”,而VBA中的“子程序”没有返回结果,那么Excel宏怎么能返回结果呢?那么上例中的 False 结果代表什么?

之后,我ExecuteExcel4Macro在 Excel(2003) 中尝试使用 VBA 而非 Python 进行编码:

Sub RunMacro()
    res = ExecuteExcel4Macro("excel.xls!Macro1()")
    MsgBox CStr(res)
End Sub
Sub Macro1()
    MsgBox "in Macro1"
End Sub

并且显示的“res”字符串MsgBox是相同的:False

1.为什么返回结果ExecuteExcel4Macro总是False?

2.如果我想在Python中运行Excel宏并获取Excel宏函数的退出状态怎么办?


2011.10.28 更新:

Sub TEST()
    res = Application.Run(MacroToRun)
    MsgBox CStr(res)
End Sub

Function MacroToRun()
    MacroToRun = True
End Function

在 Excel 2003 中运行 TEST Macro 后,我得到以下信息:

包含“错误 2015”信息的对话框。

4

3 回答 3

0

您可以定义 Excel 函数,而不是从以下sub开始function

Function Area(Length As Double, Optional Width As Variant)
    If IsMissing(Width) Then
        Area = Length * Length
    Else
        Area = Length * Width
    End If
End Function

这应该返回一些东西。这东西是以函数命名的变量的内容(这里Area)。

于 2011-10-17T15:32:40.520 回答
0

您可以使用此 Excel 4 宏和 ExecuteExcel4Macro 方法调用 VBA UDF:

retval = Application.ExecuteExcel4Macro("EVALUATE(""Book1!some_UDF()"")") 

使用 Excel 4 宏函数 EVALUATE() 将不允许您在 VBE 调试模式下进入名为“some_UDF”的 UDF,就像您从 Excel 4 宏调用 UDF 一样(参见示例)。

我还注意到在 UDF 中根本不能提到 Application.Caller,否则 Excel 会崩溃。

例子

具有以下内容的 Excel 4 宏表(单元格 $A$1 通过名称管理器命名为“Macro1”):

$A$1: Macro1
$A$2: =RETURN(Book1!some_UDF())

单元格中的 Excel 工作表

$A$1: =Macro1()

作为一个结论,我怀疑这个示例只能正常工作,因为 Excel 使用它自己的 Application.Evaluate 来获取 VBA UDF 的结果(比如说整数 10),然后运行 ​​Excel 4 宏,就好像它在哪里:

$A$1: Macro1
$A$2: =RETURN(10)

确实,在 VBA 时代之前,1992 年,当时只有 Excel 4.0 宏函数,=RETURN(Book1!some_UDF())不可能工作,不可思议(未验证但我看不出它是如何工作的......)

因此,仅在 VBA 中具有完全相同的行为,调用将是:

retval = Application.ExecuteExcel4Macro("EVALUATE(" & Application.Run("Book_XL4M!test_10") & ")")
于 2017-09-19T10:47:06.700 回答
0

2020 年的一些附加信息。注意:我正在使用 Excel Pro plus 2016 此评论只是为了节省其他人我经历的痛苦和失去的时间。这对一些程序员来说可能很明显,但我不知道也找不到任何在互联网上向我提供问题/限制的建议。

经过大量痛苦的工作,我发现您无法在函数(UDF)中运行 ExecuteExcel4Macro。还发现您不能在函数(UDF)中调用运行 ExecuteExcel4Macro 表单的子程序。它刚刚结束了 ExecuteExcel4Macro 的函数并返回了#Value!在细胞中。我没有运行错误捕获系统。这可能是上述问题的问题,但我不确定旧 excel 上是否有不同的结果。背景信息:我有一个单元格,我想测试用户是否更改了颜色或条件格式是否更改了颜色。我想知道屏幕上显示的是什么颜色。我尝试了一个函数(UDF),但.displayformat 有问题。您不能在函数中使用 .displayformat。所以我想我可以使用 Get.Cell(63,cell)。为此,我需要使用 ExecuteExcel4Macro,但它在函数(UDF)中不起作用。它会使用 Error2015 使函数崩溃。然而,它本身确实在宏中工作。我使用带有 =GET.CELL(63,INDIRECT("rc",FALSE)) 公式的命名范围进行条件格式设置,这可以正常工作。

我用来测试函数(UDF)的一些代码。定义 TempA 后,我会跳转到 Temp = ...

TempA = Application.ExecuteExcel4Macro("Sqrt(4)")

TempA = Application.ExecuteExcel4Macro("GET.CELL(42)")

TempA = "GET.CELL(63,HistorySheet!" & MyCell.Address(ReferenceStyle:=xlR1C1) & ")"

Temp = ExecuteExcel4Macro(TempA)

函数(UDF)中的 ExecuteExcel4Macro 问题对某些程序员来说可能很明显,但我不知道也无法在互联网上找到任何让我知道问题/限制的东西。希望这对将来的人有所帮助

于 2020-05-17T04:37:10.137 回答