【问题标题】:VBA for Word: Add sub on eventVBA for Word:在事件中添加子
【发布时间】:2015-04-29 01:58:18
【问题描述】:

我想将此代码添加到我的 Word .docm 文件中的ThisDocument。

Sub AutoClose()
ActiveDocument.Saved = False
End Sub

代码阻止了“您要保存吗?”对话框从出现。但是,我只想在文档中的某个单击事件之后添加它,因为我还禁用了 Save As 和 Save,如果我将这三个都添加,那么我将无法自己保存文档。 (事实上​​,出于这个原因,我不能将这三个都添加。)

如果我添加上面的代码只是为了在文档中的最后一次点击事件之后激活它应该没问题,从那时起我仍然可以保存我所做的更改,只要我最后没有点击那个触发器然而。防止人们关闭并获得“您要保存吗?”最后的对话对我来说是最重要的。

当另一个点击事件触发时,有没有办法将上述代码写入ThisDocument?或者换一种说法,有没有办法让点击事件使上面的代码生效?

这是最后我想要触发上述代码的子(激活?被写入?被启用?被取消注释?)

Private Sub formatSaveB_Click()
ActiveDocument.Bookmarks("mark3").Select
    Selection.Delete
ActiveDocument.InlineShapes(1).Delete

With Dialogs(wdDialogFileSaveAs)
        .Format = wdFormatFilteredHTML
        .Show
End With

End Sub

所以在那件事发生后,我想要

Sub AutoClose()
    ActiveDocument.Saved = False
    End Sub

在 ThisDocument 中处于活动状态 -- 但在该事件之前。

【问题讨论】:

  • 使用公共布尔变量并使用它来设置文档保存状态。
  • 请写一个答案而不是编辑你的问题
  • 嗯,我没有答案,只是对我问题中的一个词稍作更正。在下面的 cmets 中进行了解释,我想我会留在那里。

标签: vba ms-word


【解决方案1】:

如果尚未启用对 VBA 项目的编程访问,则需要启用它。但是,要在其他代码运行后添加您描述的子,请将此代码添加到您的子中:

ThisDocument.VBProject.VBComponents("ThisDocument").CodeModule.AddFromString "Sub AutoClose(): ActiveDocument.Saved = False: End Sub"

这应该可以解决问题。您可能需要稍微修改一下,我无法完全测试,因为我处于禁用对 VBA 项目的编程访问的环境中,但这应该可以满足您的要求。

轻微编辑:如果您想在关闭单词时阻止“是否要保存所做的更改...”消息,您需要这样做:

ThisDocument.VBProject.VBComponents("ThisDocument").CodeModule.AddFromString "Private Sub Document_Close(): ActiveDocument.Saved = True: End Sub"

这将阻止在关闭文档时显示该消息。

【讨论】:

  • 谢谢,这似乎是写到ThisDocument,添加你的代码后,点击事件之后我现在看到Sub AutoClose(): ActiveDocument.Saved = False: End Sub。但是,这并不能阻止“您要保存吗?”对话框——也许是因为代码没有保存?我知道有时它会立即生效,而有时您必须关闭并打开文档才能正常工作。
  • 是否保存代码无关紧要 - 您确定此代码会抑制该消息吗?如果您想在关闭文档时阻止该消息,则需要使用Private Sub Document_Close(),然后使用ActiveDocument.Saved = True 来避免该消息。但是随后文档将在不保存或提示用户保存的情况下关闭,所以我希望这是您的意图。
  • 当我添加我在上面的帖子中包含的 AutoClose() 代码时,就像我在那里一样,然后当我单击关闭文档时,即使我进行了编辑,文档也只是关闭,更改未保存,没有“您要保存”提示。我认为你/SOofWXLS 的另一个想法也更好,只是还没有让它发挥作用。我现在必须去约会,但今天晚些时候会搞砸这个。谢谢
  • 我不确定您是如何关闭文档的,但应该抓住关闭事件。不过你可以同时申请。
  • 对不起,是的,有效的代码是ActiveDocument.Saved = True(不是 False)。我醒来时脖子扭伤了,这显然破坏了我的注意力。我仍然没有让变量版本工作,但会继续尝试。如果我逐字输入您的第二组建议,它仍然会提示保存。然而,如果我只将我的第一个代码示例放在页面顶部,文档中的任何位置,它会在没有提示(或保存)的情况下关闭。这是我想要的,但只有在最后一个子运行之后。
【解决方案2】:

我不能完全按照你的逻辑,但我认为你要问的是这样的:

ThisDocument 模块

Public event1 As Boolean
Public event2 As Boolean

Sub AutoOpen()

event1 = False
event2 = False

End Sub

事件过程

Private Sub formatSaveB_Click()
    '// Event code here...
    event1 = True
End Sub

Private Sub otherEvent_Click()
    '// Event code here...
    event2 = True
End Sub

然后在你的最后一个子

Sub AutoClose()
 '// Saved state only set to true if previous 2 events have been executed.   
    ActiveDocument.Saved = (event1 And event2)

End Sub

【讨论】:

  • 谢谢,试试这个,但我没有让它工作。我想你明白我的意思,除了我只需要一个事件过程,而不是两个。 formatSaveB_Click() 是我需要更改的时候。如果我在此处包含您所拥有的所有内容,除了 event1,而不是 event2 - 它似乎没有使 ActiveDocument.Saved = False 生效。会继续搞砸的。
【解决方案3】:

在要禁用对话框的事件处理程序中设置一个标志,然后在退出时对其进行测试。请注意,如果文档已保存,则必须检查标志 或,以避免在文档实际已保存但未触发 formatSaveB_Click( )。假设 formatSaveB_Click() 在 ThisDocument 中。

在本文档中:

Private clicked As Boolean

Sub AutoClose()
    ActiveDocument.Saved = clicked Or ActiveDocument.Saved
End Sub

Private Sub formatSaveB_Click()
    ActiveDocument.Bookmarks("mark3").Select
    Selection.Delete
    ActiveDocument.InlineShapes(1).Delete

    With Dialogs(wdDialogFileSaveAs)
            .Format = wdFormatFilteredHTML
            .Show
    End With
    'Set your flag here.
    clicked = True
End Sub

【讨论】:

    【解决方案4】:

    好吧,在我发现他的建议有错字之后,添加来自 MattB 的这一行就成功了,我删除了多余的字母 :)

    ThisDocument.VBProject.VBCompontents("ThisDocument").CodeModule.AddFromString "Private Sub Document_Close(): ActiveDocument.Saved = True: End Sub"
    

    我只是把它粘贴进去,像其他人一样尝试它,它有VBCompontents,直到刚才我才发现它再次检查,一旦我删除了额外的t,宾果游戏。

    正是我需要的。非常感谢。

    【讨论】:

    • 没问题。乐于助人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2020-02-19
    • 2014-11-10
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多