我正在尝试使用通过Win32com使用Python3脚本控制Word。我已经导入了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)
有人知道成功初始化UserForm的方法吗?不幸的是,我不能使用替代方法来使用VBA UserForm,因为该部分已经完全编写。
谢谢!
注意:通过单独导入一个模块以调用UserForm并运行它,我已经验证了app.Run()命令是正确的。同样的错误。但是,如果我随后打开VBA控制台并运行相同的模块,它将成功打开UserForm。
答案 0 :(得分:0)
我现在有一个可行的解决方案。与以前一样导入UserForm之后,我导入一个初始化模块:
Sub init()
UserForm1.UserForm_Initialize
End Sub
之后,我使用app.Run()调用此脚本,该脚本又调用UserForm:
app.VBE.VBProjects(1).VBComponents.Import('.../UserForm1.frm')
app.VBE.VBProjects(1).VBComponents.Import('.../init.bas')
app.Run('init')
与我之前尝试的重要区别在于,将'()'保留了对init()模块的.Run引用。感谢上面的Steven Laycock提供参考和提醒。
作为替代方案,我还尝试使用上面的引用从程序直接调用UserForm,例如:
app.VBE.VBProjects(1).VBComponents.UserForms('UserForm1').UserForm_Initialize
但是没有运气。由于我有一个可行的解决方案,因此我将不再研究直接呼叫。