Python Programmati c доступ к VBA в Excel - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь написать сценарий python, который будет вставлять код VBA в рабочие книги, которые выводятся другой программой, чтобы упростить анализ данных. Прямо сейчас у меня есть пользователь go в Excel, откройте редактор VBA и добавьте модуль из файла, затем запустите макрос. У меня есть скрипт python, разработанный для того, что я хочу, но я все еще обеспокоен настройкой доверия Excel. Идея состоит в том, чтобы извлечь как можно больше пользовательской «работы» из процесса, и согласно этому посту: Programmati c Доступ к Visual Basi c Проект не является доверенным , мой код должен работать разрешить доступ, но я все еще получаю com_error. Конечно, я не могу оставить комментарий по этому вопросу о моей проблеме, поэтому здесь я пишу совершенно новый вопрос. Моя компания очень серьезно относится к кибербезопасности, поэтому я также подумал, что, возможно, это просто как-то не разрешено, но я не уверен, действительно ли это возможно. Любая помощь или совет с благодарностью.

Необходимые части моего кода:

import win32com
import win32com.client
import pythoncom
import tkinter as tk
from tkinter import filedialog
import ctypes
import win32api
import win32con

excel = win32com.client.Dispatch("Excel.Application")
workbook = excel.Workbooks.Open(Filename=fs)

key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,
                                    "Software\\Microsoft\\Office\\16.0\\Excel"
                                    + "\\Security", 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(key, "AccessVBOM", 0, win32con.REG_DWORD, 1)

excelModule=workbook.VBProject.VBComponents.Add(1)
excelModule.CodeModule.AddFromString(macro)

Я также пытался поставить модификацию ключа перед открытием файла, и это ничего не изменило.

1 Ответ

0 голосов
/ 13 января 2020

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

import win32com
import win32com.client
import pythoncom
import tkinter as tk
from tkinter import filedialog
import ctypes
import win32api
import win32con

key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,
                            "Software\\Microsoft\\Office\\16.0\\Excel"
                            + "\\Security", 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(key, "AccessVBOM", 0, win32con.REG_DWORD, 1)

excel = win32com.client.Dispatch("Excel.Application")
workbook = excel.Workbooks.Open(Filename=fs)
excelModule=workbook.VBProject.VBComponents.Add(1)
excelModule.CodeModule.AddFromString(macro)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...