excel - 通过控件的类触发输入字段行为

标签 excel vba

我筹集了query现在按照 David Zemens 的指示和 BrakNicku 的指导工作。

问题是我想使用的事件之一是Enter。在类里面,我没有获得此事件的选项。有没有办法将其添加到类中或以某种方式触发控件的 Enter 事件?

我尝试了类中提供的大部分事件,但没有一个按照我需要的方式运行。

快速背景:我使用 Enter 事件来设置焦点中字段的帮助文本。因此,每次用户输入字段时,我都会有一个帮助文本框,其中会填充帮助文本。

我无法共享工作簿。

最佳答案

这是另一个解决方案,(不适用于 MAC)

打开记事本并复制下面的代码并将其粘贴到新的 txt 文件中 将其另存为 CatchEvents.cls

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "CatchEvents"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Private Type GUID
      Data1 As Long
      Data2 As Integer
      Data3 As Integer
      Data4(0 To 7) As Byte
End Type

#If VBA7 And Win64 Then
      Private Declare PtrSafe Function ConnectToConnectionPoint Lib "shlwapi" Alias "#168" (ByVal punk As stdole.IUnknown, _
              ByRef riidEvent As GUID, ByVal fConnect As Long, ByVal punkTarget As stdole.IUnknown, ByRef pdwCookie As Long, _
              Optional ByVal ppcpOut As LongPtr) As Long
#Else
     Private Declare Function ConnectToConnectionPoint Lib "shlwapi" Alias "#168" (ByVal punk As stdole.IUnknown, ByRef riidEvent As GUID, _
              ByVal fConnect As Long, ByVal punkTarget As stdole.IUnknown, ByRef pdwCookie As Long, Optional ByVal ppcpOut As Long) As Long
#End If

Private EventGuide As GUID
Private Ck As Long
Private ctl As Object
'All Other Control-Events also possible
Public Sub MyEnter()
Attribute MyEnter.VB_UserMemId = -2147384830
  Select Case TypeName(ctl)
  Case "TextBox": MsgBox "Your code for " & ctl.Name & " here!"
  Case Else: MsgBox "You entered no TextBox but another control (" & ctl.Name & ")!"
  End Select
End Sub

Public Sub ConnectAllEvents(ByVal Connect As Boolean)
      With EventGuide
          .Data1 = &H20400
          .Data4(0) = &HC0
          .Data4(7) = &H46
      End With
      ConnectToConnectionPoint Me, EventGuide, Connect, ctl, Ck, 0&
End Sub

Public Property Let Item(Ctrl As Object)
      Set ctl = Ctrl
      Call ConnectAllEvents(True)
End Property

Public Sub Clear()
      If (Ck <> 0) Then Call ConnectAllEvents(False)
      Set ctl = Nothing
End Sub

在您的 VBA 编辑器中导入此文件

在您的用户表单代码中添加:(当您已经有一个初始化事件时,您可以将它们组合起来)

Private AllControls() As New CatchEvents 'on top

Private Sub UserForm_Initialize()
ReDim AllControls(Controls.Count - 1)
    For j = 0 To Controls.Count - 1
        AllControls(j).Item = Controls(j)
    Next
End Sub

现在任何控件的每个 Enter 事件都会被捕获,因此您必须采取相应的操作。 用户表单上的每个事件都可以通过这种方式捕获。

关于excel - 通过控件的类触发输入字段行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51930517/

相关文章:

excel - 周数和年份组合

excel - 运行时错误 : 13 showing while looking through #N/A string

c# - 如何使用 OpenXML 从 Excel 工作表中检索选项卡名称

excel - 查找多列中的值交集

html - 使用 VBA 解析 HTML

excel - 如何在vba中的字符串中加上双引号?

vba - 如果相应的单元格具有给定值,则不固定数量的单元格的总和

excel - 搜索查找值对(在列的 D、E 中)是否存在于查找数组(在列的 A、B 中)的脚本/宏

excel - VBA代码运行时的“excel has stopped working”

vba - Range.Find 在隐藏且属于过滤器的范围上失败