为什么ExecuteExcel4Macro的返回结果总是为假?

时间:2011-10-16 05:19:55

标签: python vba

使用ExecuteExcel4Macro在Python中运行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

MSDN上搜索ExecuteExcel4Macro的使用情况后,我收到以下信息: “ExecuteExcel4Macro - 运行Microsoft Excel 4.0宏函数,然后返回函数的结果。返回类型取决于函数。

然后我感到困惑:由于Excel中的marco始终是“Sub过程”而VBA中的“Sub过程”没有返回结果,Excel宏如何返回结果?那么上面例子中的False结果代表什么呢?

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

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

和MsgBox中显示的“res”字符串相同:False

1.为什么ExecuteExcel4Macro的重新结果总是为假?

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”信息的对话框 (作为新用户,我很抱歉我现在无法提供截图)

感谢您的关注,Tim Williams和Joël!

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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") & ")")

答案 2 :(得分:0)

一些到2020年的信息。 N.B .:我使用的是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的问题可能很明显,但是我不知道,也无法在网上找到任何东西让我知道问题/限制。希望这对以后的人有帮助

相关问题