【问题标题】:Excel VBA - Shapes Textbox OnChange eventExcel VBA - 形状文本框 OnChange 事件
【发布时间】:2017-02-24 15:54:06
【问题描述】:

当从 Excel 2010 中的插入菜单中提取的文本框发生更改时,有人可以确认 VBA 中是否存在事件?我尝试了RelevantTextBoxName_Change(),但即使文本框的内容已更改,也不会调用 sub。

它是一个“形状”文本框。

谢谢。

【问题讨论】:

    标签: excel vba events textbox onchange


    【解决方案1】:

    我建议你使用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"。请注意,我将检测形状是否确实已更改给您。

    【讨论】:

      【解决方案2】:

      excel 对象模型没有任何事件来控制对形状的操作。你需要视觉工作室来实现它。看到这个:

      Create new events for shape in Excel

      【讨论】:

      • 为了其他人的信息,这个'事件'只是挂钩commandBar_OnUpdate事件。这类似于使用 Timer 直接轮询 VBA。
      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2014-12-17
      • 2020-08-08
      • 1970-01-01
      相关资源
      最近更新 更多