как перечислить все имена макросов Excel с помощью Python

Я разрабатываю это приложение, которое загружает лист 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")

Но мне нужно имя макроса. Спасибо вам за помощь!


person iLovePython    schedule 03.09.2013    source источник


Ответы (1)


К сожалению, я не думаю, что вы можете получить имена макросов напрямую с помощью 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).

person RunDeep    schedule 27.09.2013
comment
Спасибо. Не было времени в последнее время даст этому пробегу. - person iLovePython; 01.10.2013