如何使用Python列出所有Excel宏名称
我正在开发这个应用程序,它可以加载excel工作表,并允许用户运行宏和标记单元格。我在试图从Excel工作表中读取宏时遇到了一个问题。我使用Win32 COM模块访问所有excel。到目前为止,这对我很好。但是我正在努力创建代码,为我提供所有的宏。我有相应的VBA代码,它确实为我提供了宏,但到目前为止,我还没有成功地将其翻译成python。我想使用Python代码读取所有宏。 以下是VBA代码:如何使用Python列出所有Excel宏名称,python,excel,vba,win32com,Python,Excel,Vba,Win32com,我正在开发这个应用程序,它可以加载excel工作表,并允许用户运行宏和标记单元格。我在试图从Excel工作表中读取宏时遇到了一个问题。我使用Win32 COM模块访问所有excel。到目前为止,这对我很好。但是我正在努力创建代码,为我提供所有的宏。我有相应的VBA代码,它确实为我提供了宏,但到目前为止,我还没有成功地将其翻译成python。我想使用Python代码读取所有宏。 以下是VBA代码: Sub ListMacros() Const vbext_pk_Proc = 0 Dim VBCo
Sub ListMacros()
Const vbext_pk_Proc = 0
Dim VBComp As Object
Dim VBCodeMod As Object
Dim oListsheet As Object
Dim StartLine As Long
Dim ProcName As String
Dim iCount As Integer
Application.ScreenUpdating = False
On Error Resume Next
Set oListsheet = ActiveWorkbook.Worksheets.Add
iCount = 1
oListsheet.Range("A1").Value = "Macro"
For Each VBComp In ThisWorkbook.VBProject.VBComponents
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(VBComp.Name).CodeModule
With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
oListsheet.[a1].Offset(iCount, 0).Value = _
.ProcOfLine(StartLine, vbext_pk_Proc)
iCount = iCount + 1
StartLine = StartLine + _
.ProcCountLines(.ProcOfLine(StartLine, _
vbext_pk_Proc), vbext_pk_Proc)
Loop
End With
Set VBCodeMod = Nothing
Next VBComp
Application.ScreenUpdating = True
End Sub
我在VBA方面没有任何经验。我正在努力解决这个问题。任何关于如何解决这个问题的建议都将不胜感激。谢谢
编辑:这是我到目前为止得到的
# RunInExcel.py - opens named Excel file fName, returns the sheets, modules
import os, os.path, win32com.client
def run_macro(fName, path=os.getcwd()):
print(path)
fName = os.path.join(path, fName)
print(fName)
xlApp = win32com.client.Dispatch("Excel.Application")
fTest = xlApp.Workbooks.Open(fName)
for i in fTest.VBProject.VBComponents:
print i.Name
if __name__ == "__main__":
run_macro("Testing1.xlsm")
但我需要宏的名字。谢谢你的帮助 不幸的是,我认为不能直接使用VBA获取宏名称。而是扫描代码模块,查找子模块xxx等
def run_macro(fName, path=os.getcwd()):
print(path)
fName = os.path.join(path, fName)
print(fName)
xlApp = win32com.client.Dispatch("Excel.Application")
fTest = xlApp.Workbooks.Open(fName)
for i in fTest.VBProject.VBComponents:
print i.Name
num_lines = i.CodeModule.CountOfLines
for j in range(1, num_lines+1):
if 'Sub' in i.CodeModule.Lines(j, 1) and not 'End Sub' in i.CodeModule.Lines(j, 1):
print i.CodeModule.Lines(j, 1)
xlApp.Application.Quit()
del xlApp
if __name__ == "__main__":
run_macro("Testing1.xlsm")
请注意,您需要确保正确退出脚本,否则Excel将继续运行(请检查taskmgr)。谢谢。最近没有时间,我会试试看。