【发布时间】:2017-02-24 15:54:06
【问题描述】:
当从 Excel 2010 中的插入菜单中提取的文本框发生更改时,有人可以确认 VBA 中是否存在事件?我尝试了RelevantTextBoxName_Change(),但即使文本框的内容已更改,也不会调用 sub。
它是一个“形状”文本框。
谢谢。
【问题讨论】:
标签: excel vba events textbox onchange
当从 Excel 2010 中的插入菜单中提取的文本框发生更改时,有人可以确认 VBA 中是否存在事件?我尝试了RelevantTextBoxName_Change(),但即使文本框的内容已更改,也不会调用 sub。
它是一个“形状”文本框。
谢谢。
【问题讨论】:
标签: excel vba events textbox onchange
我建议你使用this implementation
上述库使用@lbo 建议的VBA 实现。它本质上是一种从已经捕获您想要的功能的现有事件中创建“假事件”的方法。在这种情况下,我们使用CommandBars_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() 就会输出"Shape Selected",只要一个形状可能已经改变,就会输出"Shape Changed"。请注意,我将检测形状是否确实已更改给您。
【讨论】:
excel 对象模型没有任何事件来控制对形状的操作。你需要视觉工作室来实现它。看到这个:
【讨论】:
commandBar_OnUpdate事件。这类似于使用 Timer 直接轮询 VBA。