0

我正在开发这个应用程序,它加载一个 Excel 表并允许用户运行宏和标记单元格。我在尝试从 Excel 工作表中读取宏时遇到了问题。我正在使用 win32com 模块进行所有 excel 访问。到目前为止,这对我来说很好。但是我正在努力创建可以为我提供所有宏的代码。我有相应的 VBA 代码,它确实为我提供了宏,但到目前为止,我试图将它翻译成 python 是不成功的。我想使用 Python 代码读取所有宏。继承人的VBA代码:

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")

但我需要宏的名称。感谢您的帮助!

4

1 回答 1

2

不幸的是,我认为您不能直接使用 VBA 获取宏名称。相反,您扫描代码模块以查找 Sub 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)。

于 2013-09-27T17:21:46.233 回答