【问题标题】:Python win32com Show VBA UserFormPython win32com 显示 VBA 用户窗体
【发布时间】:2019-03-13 18:52:00
【问题描述】:

我正在尝试使用 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_Initialize() 子是唯一命名的,但你是对的,我在调用它时没有使用完整的上下文。从一些 Excel 示例中,我尝试了以下操作:UserForm1.UserForm.Initialize() ..没有任何成功。
  • 我在另一个问题上发现了一条评论,指出“无法移动焦点”错误实际上更像是“超出范围”错误,所以我认为你可能是对的没有以正确的方式调用脚本。
  • 试试 UserForms(Name).Userform_Initialize。我在这里找到了这个 sn-p stackoverflow.com/questions/13964780/…
  • 这是一个很好的参考。我已经用基于它的答案和我能够排除的其他一些选项更新了我的问题。谢谢!

标签: python excel vba ms-word userform


【解决方案1】:

我现在有一个可行的解决方案。像之前一样导入 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 的参考和提醒。

作为替代方案,我还尝试使用上面的参考直接从程序中调用用户窗体,例如:

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

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

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 2019-07-23
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2020-10-09
    相关资源
    最近更新 更多