python - Python win32com 显示 VBA 用户窗体
问题描述
我正在尝试使用使用 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 UserForm 的替代方法,因为该部分已经完全编写好了。
谢谢!!!
注意:我已经通过单独导入一个模块来调用用户窗体并运行它来验证 app.Run() 命令是正确的。同样的错误。但是,如果我随后打开 VBA 控制台并运行相同的模块,它会成功打开用户窗体。
解决方案
我现在有一个可行的解决方案。像以前一样导入 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')
与我之前尝试的重要区别是将 '()' 从 .Run 对 init() 模块的引用中删除。感谢上面的 Steven Laycock 的参考和提醒。
作为替代方案,我还尝试使用上面的参考直接从程序中调用 UserForm,例如:
app.VBE.VBProjects(1).VBComponents.UserForms('UserForm1').UserForm_Initialize
但没有运气。由于我有一个可行的解决方案,因此我不会进一步研究直接调用。
推荐阅读
- snowflake-cloud-data-platform - 使用阶段失败的文件创建 Snowpipe 副本
- c - Mingw 在编译代码时给了我一个 libwinpthread-1.dll was not found 错误
- angular - Angular - 材料表,更新单行而不是整个表(Angular v10)
- jquery - jQuery 媒体查询(3 种尺寸)
- android - 在 View 上调用 OnRequestFocus() 后,OnClickListener 未触发
- jinja2 - PackageLoader 是否随 Jinja2 (3.0.1) 和 Python3 (3.9.5) 发生了变化?
- c# - 如何使用 C# 从 Amazon S3 获取对象,其中键名设置为变量
- debugging - React 的 VStudioCode 调试无法启动
- javascript - Three.js Camera - 如何从后面跟随一个物体,并与它一起旋转?
- javascript - 将整个表单复制到剪贴板