Python win32com Show VBA UserForm



我正在尝试使用win32com使用Python3脚本控制Word。我已经导入了一个VBA用户表单,并试图显示它,但收到错误。一些代码:

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用户表单的替代方法,因为该部分已经完全编写。

谢谢!!!

注意:我已经验证了该应用程序。Run(( 命令是正确的,也可以单独导入一个模块来调用 UserForm,并运行它。同样的错误。但是,如果我随后打开 VBA 控制台并运行相同的模块,它将成功打开用户窗体。

我现在有一个可行的解决方案。像以前一样导入用户窗体后,我导入了一个初始化模块:

Sub init()
UserForm1.UserForm_Initialize
End Sub

之后,我使用该应用程序。Run(( 调用此脚本,该脚本又调用 UserForm:

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

与我之前尝试的重要区别是将"(("从.运行对 init(( 模块的引用。感谢上面的Steven Laycock的参考和提醒。

作为替代方案,我还尝试使用上面的引用直接从程序调用用户窗体,如下所示:

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

但没有运气。由于我有一个可行的解决方案,我不会进一步研究直接呼叫。

最新更新