Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2023, 17:56   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Запуск макроса документа ворд из питона

здравствуйте, для начала код валится на строках
Код:
import os.path
import pythoncom
import win32com.client
print('Готово')
продолжение имеется))
ошибка
C:\Users\q8902\AppData\Local\Progra ms\Python\Python311\python.exe C:/pythonProject/sudrf.ru1.py
Traceback (most recent call last):
File "C:\pythonProject\sudrf.ru1.py" , line 4, in <module>
import pythoncom
File "C:\Users\q8902\AppData\Roaming\Pyt hon\Python311\site-packages\pythoncom.py", line 2, in <module>
import pywintypes
File "C:\Users\q8902\AppData\Roaming\Pyt hon\Python311\site-packages\win32\lib\pywintypes.py", line 128, in <module>
__import_pywin32_system_module__("p ywintypes", globals())
File "C:\Users\q8902\AppData\Roaming\Pyt hon\Python311\site-packages\win32\lib\pywintypes.py", line 49, in __import_pywin32_system_module__
import _win32sysloader
ImportError: DLL load failed while importing _win32sysloader: Не найден указанный модуль.
Ципихович Эндрю на форуме Ответить с цитированием
Старый 31.12.2023, 19:15   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

уладил эту проблему-честно сказать так и не понял как-ну то есть всё те же грабли
наличие множества питонов на ПК, окружений и тому подобного))
посему крик души
если бы в коде была проверка вида:
1 а установлен ли нужный модуль
2 а установлен ли правильно нужный модуль - имеется всякого рода засады с окружением и т.д и т.п.
pass
else
код берёт и сам ставит - то, что нужно и будет работать
Ципихович Эндрю на форуме Ответить с цитированием
Старый 31.12.2023, 19:47   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

полный код:
Код:
import pythoncom
import os.path
import pythoncom
import win32com.client

def get_macros_list(file_path):
    if not os.path.exists(file_path):
        print(f'Отсутсвует необходимый файл, файл: {file_path}')
        return
    word = win32com.client.Dispatch('Word.Application')
    doc = word.Documents.Open(file_path)
    macros_list = []
    for element in doc.VBProject.VBComponents:
        if element.Type == 100: # Type 100 means the VBComponent is a Module
            macros_list.append(element.Name)
    doc.Close()
    word.Quit()
    return macros_list

patch_js = 'i:/replaces/'
patch_Macros = patch_js + 'Macros.docm'
macros_list = get_macros_list(patch_Macros)

if macros_list:
    print("Список макросов:")
    for macro in macros_list:
        print(macro)
else:
    print("Макросы не найдены")

macro_name = "Macros" # имя макроса, который нужно запустить
argument_list = ['sParam1', 'sParam2'] # список аргументов, которые нужно передать макросу

# если макрос существует
if macro_name in macros_list:
    # запуск макроса с аргументами
    word.Run(macro_name, ArgumentList=argument_list)
else:
    print(f"Макрос '{macro_name}' не найден")
вывод:
Список макросов:
ThisDocument
Макрос 'Macros' не найден
с кодом спорить трудно, но то, что в этом нет документа нет макроса ThisDocument - это точно, такие дела.....
Ципихович Эндрю на форуме Ответить с цитированием
Старый 01.01.2024, 07:58   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
с кодом спорить трудно, но то, что в этом нет документа нет макроса ThisDocument - это точно
вот в чём была ошибка
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
if element.Type == 100: # Type 100 means the VBComponent is a Module
исправил:
Код:
import pythoncom
import os.path
import pythoncom
import win32com.client

def get_module_macros_list(file_path):
    if not os.path.exists(file_path):
        print(f'Отсутсвует необходимый файл, файл: {file_path}')
        return
    word = win32com.client.Dispatch('Word.Application')
    doc = word.Documents.Open(file_path)
    macros_list = []
    module_list = []
    for element in doc.VBProject.VBComponents:
        if element.Type == 100: # Type 100 means the VBComponent is a Module
            module_list.append(element.Name)
        if element.Type == 4:  # Type 4 means the VBComponent is a Document
            macros_list.append(element.Name)
    doc.Close()
    word.Quit()
    return macros_list, module_list

patch_js = 'i:/replaces/'
patch_Macros = patch_js + 'Macros.doc' # docm
macros_list = get_module_macros_list(patch_Macros)
module_list = get_module_macros_list(patch_Macros)

if macros_list:
    print("Список модулей:")
    for module in module_list:
        print(module)
else:
    print("Модули не найдены")

if macros_list:
    print("Список макросов:")
    for macro in macros_list:
        print(macro)
else:
    print("Макросы не найдены")
теперь получаю ответ:
Список модулей:
[]
['ThisDocument']
Список макросов:
[]
['ThisDocument']
никто не в курсе как поправить, чтобы было:
Список модулей:
'ThisDocument'
Список макросов:
'ThisDocument'
Ципихович Эндрю на форуме Ответить с цитированием
Старый 01.01.2024, 08:02   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

то есть в итоговый список я добавляю
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
append(element.Name)
списки, а нужно просто элементы
Ципихович Эндрю на форуме Ответить с цитированием
Старый 01.01.2024, 08:41   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
# вместо
macros_list = get_module_macros_list(patch_Macros)
module_list = get_module_macros_list(patch_Macros)
# делать
macros_list, module_list = get_module_macros_list(patch_Macros)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.01.2024, 08:55   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

BDA, спасибо, то что нужно, выложу, чтобы НЕ потерять
Код:
import pythoncom
import os.path
import pythoncom
import win32com.client

def get_module_macros_list(file_path):
    if not os.path.exists(file_path):
        print(f'Отсутсвует необходимый файл, файл: {file_path}')
        return
    word = win32com.client.Dispatch('Word.Application')
    doc = word.Documents.Open(file_path)
    macros_list = []
    module_list = []
    for element in doc.VBProject.VBComponents:
        if element.Type == 100: # Type 100 means the VBComponent is a Module
            module_list.append(element.Name)
        if element.Type == 4:  # Type 4 means the VBComponent is a Document
            macros_list.append(element.Name)
    doc.Close()
    word.Quit()
    return macros_list, module_list

patch_js = 'i:/replaces/'
patch_Macros = patch_js + 'Macros.doc' # docm
macros_list, module_list = get_module_macros_list(patch_Macros)

if module_list:
    print("Список модулей:")
    for module in module_list:
        print(module)
else:
    print("Модули не найдены")

if macros_list:
    print("Список макросов:")
    for macro in macros_list:
        print(macro)
else:
    print("Макросы не найдены")

macro_name = "Macros" # имя макроса, который нужно запустить
argument_list = ['sParam1', 'sParam2'] # список аргументов, которые нужно передать макросу

# если макрос существует
if macro_name in macros_list:
    # запуск макроса с аргументами
    word.Run(macro_name, ArgumentList=argument_list)
else:
    print(f"Макрос '{macro_name}' не найден")
теперь правда указана:
Список модулей:
ThisDocument
Макросы не найдены
Ципихович Эндрю на форуме Ответить с цитированием
Старый 01.01.2024, 09:33   #8
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

как оказалось не всё так просто.......
код:
Код:
import pythoncom
import os.path
import pythoncom
import win32com.client

def get_module_macros_list(file_path):
    if not os.path.exists(file_path):
        print(f'Отсутсвует необходимый файл, файл: {file_path}')
        return
    word = win32com.client.Dispatch('Word.Application')
    doc = word.Documents.Open(file_path)
    macros_list = []
    module_list = []
    for element in doc.VBProject.VBComponents:
        print(f'Тип компонента: {element.Type}, имя компонента: {element.Name}')
        if element.Type == 100: # Type 100 means the VBComponent is a Module
            module_list.append(element.Name)
        if element.Type == 4:  # Type 4 means the VBComponent is a Document
            macros_list.append(element.Name)
    doc.Close()
    word.Quit()
    return macros_list, module_list

patch_js = 'i:/replaces/'
patch_Macros = patch_js + 'Macros.doc' # docm
macros_list, module_list = get_module_macros_list(patch_Macros)

if module_list:
    print("Список модулей:")
    for module in module_list:
        print(module)
else:
    print("Модули не найдены")

if macros_list:
    print("Список макросов:")
    for macro in macros_list:
        print(macro)
else:
    print("Макросы не найдены")
сообщает мне:
Тип компонента: 100, имя компонента: ThisDocument
Тип компонента: 1, имя компонента: NewMacros
значит мне нужно поставить условие:
1
if element.Type == 1:
пройти по этому элементу
2
if element.Type == 100:
пройти по этому элементу
узнать, что у них внутри, так как именно в
модулях ThisDocument и NewMacros находятся макросы и тогда уже можно узнать правду о наличии макросов в документе
подскажите как это сделать, спасибо

Последний раз редактировалось Ципихович Эндрю; 01.01.2024 в 09:54.
Ципихович Эндрю на форуме Ответить с цитированием
Старый 01.01.2024, 15:29   #9
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

одним словом внятного=верного ответа на наличие макроса в нужном мне файле ворда не нашёл
Ципихович Эндрю на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование определенных частей документа ворд с помощью DocxTemplate Stelmakh Python 1 08.07.2019 14:45
Запуск макроса в VBA (который в Escel) c документа Word sasha_prof Microsoft Office Word 2 16.01.2013 23:05
Нумерация листов ворд-документа, запущенного из экселя?? wolf05632 Microsoft Office Excel 3 23.04.2011 13:27
Запуск макроса с параметрами из другого макроса Saladin Microsoft Office Excel 2 19.01.2009 09:43
Как запретить форматирование ворд документа в делфи kate4ka Общие вопросы Delphi 6 22.02.2008 09:07