我正在 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
Run Code Online (Sandbox Code Playgroud)
动态添加事件处理程序有点棘手。
您可以将代码动态添加到 ThisDocument。这是微软描述的方式:http://support.microsoft.com/? scid=kb%3Ben-us%3B246299&x=14&y =10。但是,当我尝试此操作时,Word 2007 崩溃了。
另一种方法是添加一个用于事件处理的类,并为每个控件创建该类的一个实例。将以下代码放入模块中:
Option Explicit
Public objControls() As clsComboBox
Private Sub CommandButton11_Click()
Dim objShape As InlineShape
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect
End If
Selection.MoveRight
Selection.MoveDown
Selection.TypeParagraph
' keep the reference to this control and set the OnChange event handler
Set objShape = Selection.InlineShapes.AddOLEControl(ClassType:="Forms.ComboBox.1")
With objShape.OLEFormat.Object
.AddItem "Item 1"
.AddItem "Item 2"
End With
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=vbTab
Selection.TypeText Text:=vbTab
' keep the reference to this control and set text
Set objShape = Selection.InlineShapes.AddOLEControl(ClassType:="Forms.OptionButton.1")
With objShape.OLEFormat.Object
.Caption = "My great option"
End With
Selection.MoveRight Unit:=wdCharacter, Count:=1
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
' we have to execute the creation of the event handlers with a delay
' to make it work (seems Word needs some time for object creation)
Application.OnTime When:=Now + TimeValue("00:00:01"), Name:="prcCreateReference"
End Sub
Public Sub prcCreateReference()
Dim objShape As InlineShape
Dim intCount As Integer
On Error Resume Next
For Each objShape In ThisDocument.InlineShapes
intCount = intCount + 1
ReDim Preserve objControls(1 To intCount)
If TypeOf objShape.OLEFormat.Object Is ComboBox Then
Set objControls(intCount) = New clsComboBox
Set objControls(intCount).ComboBox = objShape.OLEFormat.Object
ElseIf TypeOf objShape.OLEFormat.Object Is OptionButton Then
' add event handlers for option buttons
End If
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
此代码应进入名为 clsComboBox 的类模块:
Option Explicit
Private WithEvents mobjComboBox As MSForms.ComboBox
Friend Property Set ComboBox(objComboBox As MSForms.ComboBox)
Set mobjComboBox = objComboBox
End Property
Private Sub mobjComboBox_Change()
MsgBox "Selection changed."
End Sub
Private Sub mobjComboBox_Click()
MsgBox "Clicked."
End Sub
Run Code Online (Sandbox Code Playgroud)
请注意,变量 objControls 必须是 clsComboBox 类型。将此变量声明为 Object 或 Variant 对我来说不起作用(有人能解释为什么吗???)。