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