Python win32com Show VBA UserForm - PullRequest
       31

Python win32com Show VBA UserForm

0 голосов
/ 09 октября 2018

Я пытаюсь управлять Word, используя скрипт Python3, используя win32com.Я импортировал VBA UserForm и пытаюсь показать его, но получаю сообщение об ошибке.Некоторый код:

from win32com.client.dynamic import Dispatch
from win32com.client.dynamic import ERRORS_BAD_CONTEXT
import win32com.client as win32

app = win32.gencache.EnsureDispatch('Word.Application')

app.Visible = True        
app.Documents.Open('.../'+current_doc+'.docx')                

try:
    app.VBE.VBProjects(1).VBComponents \
        .Import('.../UserForm1.frm')
    app.Run('UserForm_Initialize()')

Сценарий успешно импортирует пользовательскую форму, но при попытке инициализации выдает эту ошибку:

com_error: (-2147352567, 'Exception occurred.', (0, 'Forms.Form.1', "Can't move focus to the control because it is invisible, not enabled, or of a type that does not accept the focus.", 'fm20.hlp', 0, -2147352573), None)

Кто-нибудь знает способ успешной инициализации пользовательской формы?К сожалению, я не могу использовать альтернативу использованию пользовательской формы VBA, так как эта часть уже полностью написана.

Спасибо !!!

Примечание: я проверил app.Run ()Команда верна, если также отдельно импортировать модуль для вызова пользовательской формы и запустить его.Та же ошибка.Однако если я затем открою консоль VBA и запуском того же модуля, он успешно откроет пользовательскую форму.

1 Ответ

0 голосов
/ 15 октября 2018

У меня есть рабочее решение сейчас.После импорта пользовательской формы, как и раньше, я импортирую модуль инициализации:

Sub init()
    UserForm1.UserForm_Initialize
End Sub

После этого я использую app.Run () для вызова этого скрипта, который, в свою очередь, вызывает пользовательскую форму:

app.VBE.VBProjects(1).VBComponents.Import('.../UserForm1.frm')
app.VBE.VBProjects(1).VBComponents.Import('.../init.bas')
app.Run('init')

Важным отличием от того, что я пробовал раньше, является исключение '()' из ссылки .Run на модуль init ().Спасибо Стивену Лэйкоку выше за ссылку и напоминание.

В качестве альтернативы я также попытался вызвать пользовательскую форму непосредственно из программы, используя приведенную выше ссылку, что-то вроде:

app.VBE.VBProjects(1).VBComponents.UserForms('UserForm1').UserForm_Initialize

, но безуспешно.Поскольку у меня есть рабочее решение, я больше не буду исследовать прямой вызов.

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