【问题标题】:Document_Open() does not work in other filesDocument_Open() 在其他文件中不起作用
【发布时间】:2019-07-29 21:29:42
【问题描述】:

我正在编写一个包含 1 个模块 (m1) 和 1 个用户表单 (uf) 的 VBA 项目。 在“ThisDocument”中,我从“m1”调用了一个公共子,它初始化了一个集合,然后我在用户表单中引用。在我将此项目部署到其他文件之前,这工作得很好。

我将文件作为 .dotm 保存在 %Appdata%/Microsoft/word/startup 文件夹中,这样我就可以在我的所有 word 文件中使用该项目。但是一旦我尝试在其他文件中使用我的项目,用户表单就会按设计自行打开,但集合是空的。

这可能是什么问题?

从用户窗体手动调用初始化方法可以正常工作。

'----------------------------------------------ThisDocument
Private Sub Document_Open()
    initBetaCollection
End Sub

'----------------------------------------------m1
Option Explicit

Public beta As Collection

Sub initBetaCollection()

    Set beta = New Collection

    beta.Add Array("0041", "A"), Key:="0041"
    '...

End Sub

'----------------------------------------------uf
Option Explicit
Private Sub txtSearch_Change()
    Dim arr As Variant
    Dim search As String

    'Defining the textinput as "search"
    search = txtSearch.Value

    For Each arr In beta
        If search <> "" Then 'No empty search field
            If arr(1) Like "*" & search & "*" Then 'Match found
                lbResults.AddItem arr(0)
            End If
        End If
    Next

End Sub

我得到:需要运行时错误“424”对象

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    ThisDocument 类中使用Document_Open 或在常规模块中使用名为AutoOpen 的宏的问题在于,它们都专门为此文档(或从模板创建的文档)执行, em>。

    为了让所有打开的文档都触发一个应用程序级事件,有必要使用应用程序级事件。

    为此,首先需要一个类模块。在类模块中,需要如下代码:

    'Class module named: Class1
    Public WithEvents app As Word.Application
    
    Private Sub app_DocumentOpen(ByVal Doc As Document)
        'MsgBox Doc.FullName & ": on Open"
        'Code here that should fire when a document is opened
        'If something needs to be done with this document, use 
        'the Doc parameter passed to the event, don't try to use ActiveDocument
    End Sub
    

    然后,在常规模块中,可以使用AutoExec 宏来初始化具有事件处理的类。 (AutoExec:在 Word 启动并加载具有此名称的宏的模板时触发。)

    Option Explicit
    
    Dim theApp As New Class1
    
    Sub AutoExec()
        'MsgBox "AutoExec"
        Set theApp.app = Word.Application        
    End Sub
    
    'Sub AutoOpen()
    '    MsgBox "Open in AutoOpen" - fires only for this document
    'End Sub
    

    【讨论】:

    • @schefflaa 因为它被注释掉了?我确实对此进行了彻底的测试(今天它仍在工作,因为我忘记“关闭它”)。带有代码的模板需要在 Startup 文件夹中。代码不应被注释掉。 Document_Open 只会在另一个文档打开时触发,而不是在创建新文档时触发。确保 Document_Open 位于 class 模块中,并且类模块名称与“plain”模块中 Dim theApp As... 行中的名称匹配。
    • 是的,我注意到它适用于现有文件,所以我只是添加了 app_NewDocument 方法,它工作得非常好。然而,我通常响应 ctrl+space 快捷方式的表单似乎无法正常工作。我的 m1 模块中有这段代码:link
    • 当我尝试从 Document_Open 方法调用它时,我得到 运行时错误 5346 Word 无法更改函数...
    • @schefflaa 请注意,您的问题指定了Document_Open - 没有提及新文档。所以我想说这个答案确实回答了所提出的问题......如果您也有这种观点,请单击答案左侧的复选标记,以便人们认识到这个特定问题已得到解决。
    • @schefflaa 对于您在 cmets 中提出的新问题,我建议您针对每个问题发布一个新问题。请务必在问题本身中包含所有用于重现的相关信息。不要试图链接到外部文件 - 这对其他人来说是一个安全风险,并且在以后寻求帮助的其他人可能无法获得该信息。 Stack Overflow 不是一个“论坛”,而是一个问答库。 (您可能需要查看help center 中的信息。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2014-04-01
    相关资源
    最近更新 更多