Я пытаюсь создать модуль класса, который будет действовать как глобальный обработчик, когда кто-либо щелкнет одно из шестидесяти текстовых полей, которые у меня есть в моей форме. Текстовые поля представляют собой временную таблицу для отображения информации в виде часов, часов, обеда, конца, продолжительности, общего ежедневного часа по каждой из семи дней недели. Когда кто-то нажимает на кого-либо из ящиков меньше дня, все блоки будут разблокированы и включены, чтобы пользователь мог редактировать информацию в них.global click event handler (WithEvents)
После очистки веб-сайта от глобального глобального события щелчка я обнаружил, что могу создать модуль класса, который обрабатывал бы событие без создания события click для каждого отдельного текстового поля, которое вызывает отдельную функцию для обработки события. Проблема, с которой я сталкиваюсь, заключается в том, что мой модуль классов, похоже, не обрабатывает мое событие, и мне было интересно, может ли кто-нибудь предложить решение моей проблемы. FYI, все мои текстовые поля и заблокированы и отключены, чтобы предотвратить повреждение данных. Ниже мой код:
''# Class module
Option Compare Database
Option Explicit
Public WithEvents TC_txtbox As TextBox
''# Set the textbox so that its events will be handled
Public Property Set TextBox(ByVal m_tcTxtBox As TextBox)
TC_txtbox = m_tcTxtBox
End Property
''# Handle and onClick event of the
Private Sub TC_txtbox_Click()
''# Find out the controls that where clikck
Debug.Print Form_TimeCard.ActiveControl.Name
Dim ctl As Control
For Each ctl In access.Forms.Controls
Debug.Print ctl.Name
Next ctl
End Sub
Форма Код
Option Compare Database
Option Explicit
''# Global Variables
Public clk_inout As Boolean
Public settings
Public weekDict
Public weekOf As Variant
Public curDay As Variant
Public txtBxCollection As Collection
''# Event Handler for when the form opens
Private Sub Form_Open(Cancel As Integer)
''# Configure varaibles
Me.TimerInterval = 60000 ''# 10 sec Interval
weekOf = getFirstDayofWeek(Date)
curDay = Date
Set weekDict = CreateObject("Scripting.Dictionary")
Set settings = CreateObject("Scripting.Dictionary")
Set txtBxCollection = New Collection
''# Load Time Card Data
Call initSettings
''# Debug.Print "Work Day Goal " & settings.Item("Work_day_goal_hrs")
Call initDict
Call initTextBoxEventHandler
Debug.Print "Collection count " & txtBxCollection.Count
Call loadDates(Date)
Call clearDay
Call selectDay(Date)
Call loadWeeksData(weekOf)
Dim ctl As Control
Set ctl = weekDict.Item(Weekday(curDay)).Item("In")
If IsDate(ctl.Value) And (Not ctl.Value = "") Then
Me.but_clk_inout.Caption = "Clock Out"
Me.but_lunch.Visible = True
clk_inout = False
Else
Me.but_clk_inout.Caption = "Clock In"
Me.but_lunch.Visible = False
clk_inout = True
End If
''# Debug.Print "Work Day Goal " & settings.Item("Salary")
End Sub
Public Sub initTextBoxEventHandler()
Dim eventHandler As TextBoxEventHandler
Set eventHandler = New TextBoxEventHandler
Debug.Print "Collection count " & txtBxCollection.Count
Set eventHandler.TextBox = Me.txt_F_in
txtBxCollection.Add eventHandler
Debug.Print "Collection count " & txtBxCollection.Count
End Sub
Я выясняю свою проблему в модуле класса, где я устанавливаю текстовое поле. Я забыл добавить «TC_txtbox.OnClick =» [Event Procedure] "" VBA не будет запускать пользовательский обработчик даже в расширенном текстовом поле, если [свойство события] не объявлено в свойстве события, которое вы хотели бы обрабатывать. – Talguy