使用对 Word VBA 中动态创建的控件的引用
我正在 Word 2003 中编写一个表单,以收集对单个问题的多个答复。 我在按钮上有一个宏,它复制了各种输入字段(下拉框、单选按钮等),准备新的响应。
但是,我需要更改单选按钮的文本,并在组合框上设置 OnChange
事件,但我找不到正确的语法来执行此操作。 这两个控件都来自“控件工具箱”工具栏。
我必须复制控件的宏代码如下。
Private Sub CommandButton11_Click()
Set Doc = ActiveDocument
Response = MsgBox("Add another response?", vbYesNo, "Confirm action")
If Response = vbYes Then
If Doc.ProtectionType <> wdNoProtection Then
Doc.Unprotect
End If
Selection.MoveRight
Selection.MoveDown
Selection.TypeParagraph
''# keep the reference to this control and set the OnChange event handler
Selection.InlineShapes.AddOLEControl ClassType:="Forms.ComboBox.1"
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=vbTab
Selection.TypeText Text:=vbTab
''# keep the reference to this control and set text
Selection.InlineShapes.AddOLEControl ClassType:="Forms.OptionButton.1"
Selection.MoveRight Unit:=wdCharacter, Count:=1
Doc.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
End If
End Sub
I am writing a form in Word 2003 to collect multiple responses to a single question. I have a macro on a button press which duplicates the various input fields (drop-down boxes, radio buttons etc.) ready for a new response.
However, I need to change the text of the radio buttons, and set the OnChange
event on a combobox, and I can't find the correct syntax to do so. Both the controls are from the 'Control Toolbox' toolbar.
The macro code I have to duplicate the controls is below.
Private Sub CommandButton11_Click()
Set Doc = ActiveDocument
Response = MsgBox("Add another response?", vbYesNo, "Confirm action")
If Response = vbYes Then
If Doc.ProtectionType <> wdNoProtection Then
Doc.Unprotect
End If
Selection.MoveRight
Selection.MoveDown
Selection.TypeParagraph
''# keep the reference to this control and set the OnChange event handler
Selection.InlineShapes.AddOLEControl ClassType:="Forms.ComboBox.1"
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=vbTab
Selection.TypeText Text:=vbTab
''# keep the reference to this control and set text
Selection.InlineShapes.AddOLEControl ClassType:="Forms.OptionButton.1"
Selection.MoveRight Unit:=wdCharacter, Count:=1
Doc.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
End If
End Sub
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
动态添加事件处理程序有点棘手。
您可以将代码动态添加到 ThisDocument。 这是微软描述的方式: http ://support.microsoft.com/?scid=kb%3Ben-us%3B246299&x=14&y=10。 但是,当我尝试此操作时,Word 2007 崩溃了。
另一种方法是添加一个用于事件处理的类,并为每个控件创建该类的一个实例。 将以下代码放入模块中:
该代码应放入名为 clsComboBox 的类模块中:
请注意,变量 objControls 的类型必须为 clsComboBox。 将此变量声明为 Object 或 Variant 对我来说不起作用(有人能解释为什么吗???)。
adding the event handlers dynamically is a bit tricky.
You could add the code dynamically to ThisDocument. This is the way described by Microsoft: http://support.microsoft.com/?scid=kb%3Ben-us%3B246299&x=14&y=10. However, when I tried this Word 2007 crashed.
Another way is to add a class for event handling and create an instance of this class for each control. Place the following code into a module:
This code should go into a class module named clsComboBox:
Note that the variable objControls must be of type clsComboBox. Declaring this variable as Object or Variant didn't work for me (could anyone explain why???).