Word vba-如果光标位于单元格/书签中-运行代码

Word vba-如果光标位于单元格/书签中-运行代码,vba,ms-word,Vba,Ms Word,我有一个模板文档,其中包含几个部分和几个表。 问题是,我正在尝试在表中的单元格中插入一个下拉列表。 要使下拉列表起作用,需要对文档进行保护。但是如果我保护表所在的整个部分,那么整个表都会受到保护 所以,我想知道如果用户单击下拉列表,是否有一种执行宏代码的方法?然后,代码将保护文档,使控件实际工作,然后选择一个选项,当用户在字段外单击时,文档将不受保护 这可能吗?您可以使用控件工具栏中的组合框,而不是使用表单工具栏中的下拉框。然后可以使用组合框单击事件。当用户在组合框外单击时,您还可以将代码附加到

我有一个模板文档,其中包含几个部分和几个表。 问题是,我正在尝试在表中的单元格中插入一个下拉列表。 要使下拉列表起作用,需要对文档进行保护。但是如果我保护表所在的整个部分,那么整个表都会受到保护

所以,我想知道如果用户单击下拉列表,是否有一种执行宏代码的方法?然后,代码将保护文档,使控件实际工作,然后选择一个选项,当用户在字段外单击时,文档将不受保护


这可能吗?

您可以使用控件工具栏中的组合框,而不是使用表单工具栏中的下拉框。然后可以使用组合框单击事件。当用户在组合框外单击时,您还可以将代码附加到GotFocus/LostFocus事件。

Word VBA中实际上有一个WindowSelectionChange事件,您可以使用它。它在Word VBA帮助文件中的“将事件与应用程序对象一起使用”下进行了描述

诀窍是使用WithEvents关键字将应用程序分配给我命名为mine EventClassModule的类模块中的变量:

Public WithEvents App As Word.Application
然后,在普通文档打开事件中,可以将变量初始化为当前应用程序:

Dim oEvents As New EventClassModule
Private Sub Document_Open()
    Set oEvents.App = Word.Application
End Sub
回到EventClassModule,您可以使用WindowsSelectionChange事件检查所选内容是否为表:

Private Sub App_WindowSelectionChange(ByVal Sel As Selection)
    If Sel.Information(wdWithInTable) And ThisDocument.ProtectionType = wdNoProtection Then
        ThisDocument.Protect wdAllowOnlyFormFields
    ElseIf ThisDocument.ProtectionType <> wdNoProtection Then
        ThisDocument.Unprotect
    End If
End Sub

只要光标改变位置,就会调用此代码。我对它进行了测试,有点挑剔oEvents对象由于某种原因有未初始化的倾向,但希望这将是您解决方案的一个开始。

不确定我是否理解正确。作为Word.Application的Events应用程序的公众应该在哪里?我已经在DoCuTuntOPEN事件中间插入了代码。我创建了一个EventClassModule,其底部代码如您所述。但是第一行呢?放在哪里?还有一件事,只有当光标选择一个特定的书签时,才可能触发代码吗?因为下拉字段实际上有一个书签名Dropdown1和Dropdown2。只有这些优先触发代码以保护文档:我很确定我做得对,但是WindowSelectionChange似乎根本没有启动。这真是一个耻辱。公众将events App作为Word.Application放在类模块EventClassModule的顶部-它是类的一个成员变量。因此,在Document_Open事件中,您将实例化该类并将成员变量设置为当前应用程序。我不知道他们为什么这么复杂,问题是,这是一个报告模板,下拉菜单应该让用户选择保密级别。无论用户选择什么,都应该在文档中以纯文本形式结束。而且下拉列表在打印时也不应该可见。