Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-形状文本框OnChange事件_Excel_Vba_Events_Textbox_Onchange - Fatal编程技术网

Excel VBA-形状文本框OnChange事件

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实现

是否有人可以确认VBA中是否存在从Excel 2010的“插入”菜单中绘制的文本框发生更改的事件?我尝试了
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直接使用计时器进行轮询。