Excel VBA-形状文本框OnChange事件
是否有人可以确认VBA中是否存在从Excel 2010的“插入”菜单中绘制的文本框发生更改的事件?我尝试了Excel VBA-形状文本框OnChange事件,excel,vba,events,textbox,onchange,Excel,Vba,Events,Textbox,Onchange,是否有人可以确认VBA中是否存在从Excel 2010的“插入”菜单中绘制的文本框发生更改的事件?我尝试了RelevantTextBoxName\u Change(),但即使文本框的内容发生了更改,也没有调用该子项 它是一个“形状”文本框 谢谢。excel对象模型没有任何事件来控制形状的操作。您需要VisualStudio来实现这一点。见此: excel对象模型没有任何事件来控制形状的操作。您需要VisualStudio来实现这一点。见此: 我建议您使用 上面的库使用了@lbo建议的VBA实现
RelevantTextBoxName\u Change()
,但即使文本框的内容发生了更改,也没有调用该子项
它是一个“形状”文本框
谢谢。excel对象模型没有任何事件来控制形状的操作。您需要VisualStudio来实现这一点。见此:
excel对象模型没有任何事件来控制形状的操作。您需要VisualStudio来实现这一点。见此: 我建议您使用
上面的库使用了@lbo建议的VBA实现。它本质上是一种从现有事件中创建“假事件”的方法,这些事件已经捕获了您想要的功能。在这种情况下,我们使用
commandbar\u OnUpdate
事件(每当形状被更改/删除/选中/取消选中/创建时,该事件都会触发。然后,我们会根据excel工作簿的当前状态筛选事件,以尝试了解实际发生的情况。通过检测所选对象是否是形状,我们可以充分确定此事件是否发生在形状上
Public WithEvents bars As commandBars
Public old_selection As Object
Private Sub InitialiseEvents()
Set bars = Application.commandBars
End Sub
Private Sub bars_OnUpdate()
'This will call on each user action, here we can check our shapes:
If DetectShape Then
'Shape selected and changed event:
If GetName(old_selection) = GetName(Selection) Then
Debug.Print "Shape Changed"
Else
Debug.Print "Shape Selected"
End If
End If
Set old_selection = Selection
End Sub
Private Function GetName(ByVal obj As Object) As String
On Error Resume Next
GetName = obj.Name
End Function
Private Function DetectShape() As Boolean
On Error GoTo endDetect
DetectShape = Selection.ShapeRange.Count > 0
endDetect:
End Function
运行InitialiseEvents()
将在选择形状时打印“已选择形状”
,并在形状可能已更改时打印“已更改形状”
。请注意,我将检测形状是否确实已更改留给您。我建议您使用
上面的库使用了@lbo建议的VBA实现。它本质上是一种从现有事件创建“假事件”的方法,这些事件已经捕获了您想要的功能。在这种情况下,我们使用
commandbar\u OnUpdate
event(每当形状被更改/删除/选中/取消选中/创建时,该事件都会触发。然后,我们会根据excel工作簿的当前状态筛选事件,以尝试了解实际发生的情况。通过检测所选对象是否是形状,我们可以充分确定此事件是否发生在形状上
Public WithEvents bars As commandBars
Public old_selection As Object
Private Sub InitialiseEvents()
Set bars = Application.commandBars
End Sub
Private Sub bars_OnUpdate()
'This will call on each user action, here we can check our shapes:
If DetectShape Then
'Shape selected and changed event:
If GetName(old_selection) = GetName(Selection) Then
Debug.Print "Shape Changed"
Else
Debug.Print "Shape Selected"
End If
End If
Set old_selection = Selection
End Sub
Private Function GetName(ByVal obj As Object) As String
On Error Resume Next
GetName = obj.Name
End Function
Private Function DetectShape() As Boolean
On Error GoTo endDetect
DetectShape = Selection.ShapeRange.Count > 0
endDetect:
End Function
运行
InitialiseEvents()
将在选择形状和更改形状时打印“选择的形状”
当一个形状可能已经更改时。请注意,我将检测该形状是否确实已更改留给您。对于其他人的信息,此“事件”只是挂接commandBar\u OnUpdate
事件。这类似于使用VBA直接使用计时器进行轮询。对于其他人的信息,此“事件”只是挂接commandBar_OnUpdate
事件。这类似于使用VBA直接使用计时器进行轮询。