Как я могу экспортировать код VBA в текст из модулей de? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь отобразить все коды VBA, которые у меня есть в Excel, в офисе.

В моей работе у нас более двухсот файлов Excel с большим количеством макросов в каждом. Как я могу извлечь кодовый код какого-то модуля?

Я вижу что-то вроде

workbook = excel.Workbooks.Open("{}{}.xlsm".format(path, file), True, True)
for i in workbook.VBProject.VBComponents:
    print(i.Name)

Return

Plan1
Plan2
Main
Plan5
Plan3
Plan4
Sheet1

Как я могу получить код VBA вэти модули?

Решение может быть в VBA или в Python

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Я нашел решение:

import win32com.client
import pandas as pd

excel = win32com.client.Dispatch("Excel.Application")
workbook = excel.Workbooks.Open("{}{}.xlsm".format(path, file), True, True)

dict_modules = {}
for i in workbook.VBProject.VBComponents:
    name = i.name
    lines = workbook.VBProject.VBComponents(name).CodeModule.CountOfLines

    # To jump empty modules
    if lines == 0:
        pass
    else:
        text = workbook.VBProject.VBComponents(name).CodeModule.Lines(1,lines)
        dict_modules[name] = [text]

df = pd.DataFrame(dict_modules)

DataFrame возвращаются с именем модуля, таким как заголовок таблицы. Чтобы просмотреть каждый текст, который я нашел

# To get the full text
module_name = df["module_name"][0]
#To get by line
module_text_by_line = module_name.splitlines()

Спасибо, кто пытался помочь мне.

0 голосов
/ 21 октября 2019

Возможно, это близко к тому, что вы ищете?

Sub GEN_USE_Export_all_modules_from_Project()
' https://www.ozgrid.com/forum/forum/help-forums/excel-general/60787-export-all-modules-in-current-project
     ' reference to extensibility library
Dim tday As String
tday = Date
Dim objMyProj As VBProject
Dim objVBComp As VBComponent
Dim destFolder as String

destFolder = "C:\Users\WHATEVER\Documents\Business\EXCEL NOTES\"
Set objMyProj = Application.VBE.ActiveVBProject

tday = WorksheetFunction.Substitute(tday, "/", "-")

For Each objVBComp In objMyProj.VBComponents
    If objVBComp.Type = vbext_ct_StdModule Then
        objVBComp.Export destFolder & tday & " - " & objVBComp.name & ".bas"
    End If
Next
MsgBox ("Saved to " & destFolder)
End Sub

Это зациклит ваш VBAProject (где хранится сам этот макрос) и сохранит модули в файле .bas, которыйВы можете открыть и пройти.

Редактировать: Вы можете заменить .bas на .txt, и это работает, FYI.

...