我筹集了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/