Как запустить макрос Excel с помощью скрипта Python? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу запустить макрос в файле Excel, используя скрипт Python.

import os
import win32com.client

if os.path.exists(""C:\\Users\\siddharth.mungekar\\Desktop\\MemleakTest\\test.xlsm"):
    xl = win32com.client.Dispatch("Excel.Application")
    xl.Workbooks.Open(Filename="C:\\Users\\siddharth.mungekar\\Desktop\\MemleakTest\\test.xlsm")
    xl.Visible = True
    xl.Run('Mem_Leak')

Сценарий завершается ошибкой после открытия файла Excel и выдает следующую ошибку:

C: \ Users \ siddharth.mungekar \ AppData \ Local \ Programs \ Python \ Python36\ python.exe C: /Users/siddharth.mungekar/PycharmProjects/MacroViaPython/ExcelMacroEnabler.py Traceback (последний вызов был последним): файл "C: /Users/siddharth.mungekar/PycharmProjects/MacroViaPythonEMable.MyPlayEmp", в файле xl.Run ('Mem_Leak') "", строка 14, в файле запуска "C: \ Users \ siddharth.mungekar \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ win32com \ client \"dynamic.py ", строка 287, в ApplyTypes result = self. oleobj .InvokeTypes (* (dispid, LCID, wFlags, retType, argTypes) + args) pywintypes.com_error: (-2147352567, «Возникло исключение.», (0, «Microsoft Excel», «Невозможно запустить макрос« Mem_Leak ». Макрос может быть недоступен в этой книге или все макросы могут быть отключены.», «Xlmain11.chm»,0, -2146827284), Нет)

Я попытался изменить настройки Центра управления безопасностьюg.

Код работает, когда другой файл Excel уже был открыт вручную.

Я попытался открыть фиктивный файл Excel, а затем открыть целевой файл Excel и запустить макрос.Это не сработало.Фиктивный файл Excel должен быть открыт вручную.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я исправил эту проблему, поместив свой макрос в новый модуль вместо того, чтобы поместить его в «ThisWorkbook», и вызвав:

xl.Run("Module1.UpdateTable")

Полный код:

import os
import win32com.client

sXlFile = "C:\\Desktop\\test.xlsm"
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(os.path.abspath(sXlFile))
try:
  xl.Run("Module1.UpdateTable")
except Exception as e:
  print(e)

xl.Application.Quit() # Comment this out if your excel script closes
del xl
0 голосов
/ 11 мая 2018

Вы можете попробовать обновить настройки макросов в реестре, чтобы разрешить запуск всех макросов. Вам нужно будет либо запустить скрипт Python от имени администратора, либо убедиться, что у ключа реестра есть соответствующие разрешения:

import winreg
import os
import win32com.client


def registry_set_key(hive, regpath, key, type, value):
    try:
        hkey = winreg.OpenKey(hive, regpath, 0, winreg.KEY_ALL_ACCESS)
    except FileNotFountError as e:
        hkey = winreg.CreateKey(hive, regpath, 0, winreg.KEY_ALL_ACCESS)

    try:
        old = winreg.QueryValueEx(hkey, key)
    except:
        old = None

    winreg.SetValueEx(hkey, key, 0, type, value)
    winreg.CloseKey(hkey)    

    return old



if os.path.exists(r"C:\\Users\\siddharth.mungekar\\Desktop\\MemleakTest\\test.xlsm"):

    # Set macro settings to 1 to allow all macros    
    old = registry_set_key(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Office\14.0\Excel\Security', 'VBAWarnings', winreg.REG_DWORD, 1)

    xl = win32com.client.Dispatch("Excel.Application")
    xl.Workbooks.Open(Filename="C:\\Users\\siddharth.mungekar\\Desktop\\MemleakTest\\test.xlsm")
    xl.Visible = True
    xl.Run('Mem_Leak')

    # If there was an existing value, put it back
    if old:
        registry_set_key(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Office\14.0\Excel\Security', 'VBAWarnings', winreg.REG_DWORD, old[0])

Обратите внимание, что вам может потребоваться изменить путь к реестру в зависимости от установленной версии Office, используйте REGEDIT для проверки. т.е. убедитесь, что присутствует Office\14.0.

Также взгляните на Microsoft Project - как управлять настройками макросов с помощью ключей реестра для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...