Я создал инструмент, использующий Excel для сбора входных данных от пользователя и использования его для некоторой обработки данных.Я создал пользовательский интерфейс на листе с кучей элементов управления ActiveX (TextBox, ListBox, ComboBox).Часть элементов управления ActiveX являются динамическими - они добавляются во время выполнения на основе «метаданных», которые администратор инструмента создает на втором рабочем листе.Метаданные содержат имя поля, тип элемента управления ActiveX, положение элемента управления, ListRange для заполнения значений, флаг Multi-Text / Multi-Select и т. Д.
Я могу успешно добавить элементы управления ActiveX в пользовательский интерфейсРабочий лист.Однако теперь я хочу добавить функциональность для элементов управления ActiveX TextBox для отображения текста по умолчанию, когда элемент управления получает фокус - текст по умолчанию удаляется, когда элемент управления теряет фокус - если пользователь ввел какие-либо данные, он остается, в противном случае текст по умолчанию снова появляется.
Public Sub df_segment_GotFocus()
Dim wb As Workbook
Set wb = ThisWorkbook
Set form_sheet = Worksheets(Sheet1.Name)
If form_sheet.OLEObjects("df_segment") Is Nothing Then
Else
'When user begins to type, remove the help text and remove Italics
Dim seg_val As String
seg_val = form_sheet.OLEObjects("df_segment").Object.Value
If seg_val = "e.g. Desktop-Mac,Desktop-Win,Mobile-OSX" Then
form_sheet.OLEObjects("df_segment").Object.Font.Italic = False
form_sheet.OLEObjects("df_segment").Object.Value = ""
Else
form_sheet.OLEObjects("df_segment").Object.Value = seg_val
End If
End If
End Sub
Public Sub df_segment_LostFocus()
Dim wb As Workbook
Set wb = ThisWorkbook
Set form_sheet = Worksheets(Sheet1.Name)
If form_sheet.OLEObjects("df_segment") Is Nothing Then
Else
'Incase user doesn't enter any values, show the help text again
Dim seg_val As String
seg_val = form_sheet.OLEObjects("df_segment").Object.Value
If seg_val = "" Then
form_sheet.OLEObjects("df_segment").Object.Font.Italic = True
form_sheet.OLEObjects("df_segment").Object.Value = "e.g. Desktop-Mac,Desktop-Win,Mobile-OSX"
Else
form_sheet.OLEObjects("df_segment").Object.Value = seg_val
End If
End If
End Sub
В приведенном выше примере кода вы видите, что я использую точное имя элемента управления для настройки обработчиков событий GotFocus и LostFocus.Однако, поскольку мой пользовательский интерфейс управляется метаданными, элементы управления будут добавляться / удаляться динамически, и я не знаю названия элементов управления для явного добавления обработчиков событий.
Я просмотрел форумы и реализовал это:a.) Реализован модуль класса
Public WithEvents df_TextBox As MSForms.TextBox
Public df_TextBox_Name As String
Private Sub df_TextBox_Change()
Dim wb As Workbook
Set wb = ThisWorkbook
Set form_sheet = Worksheets(Sheet1.Name)
Set metadata_sheet = Worksheets(Sheet2.Name)
Dim obj_name As String
obj_name = df_TextBox_Name
obj_val = form_sheet.OLEObjects(obj_name).Object.Value
MsgBox "Change in TextBox" & obj_val
End Sub
b.) Созданы объекты для класса, в которых я создаю экземпляры управляющих объектов
ElseIf d_Type = "TextBox" Then
df_obj.Object.Value = d_def_val
df_obj.Object.Font.Italic = True
If d_Multi = 1 Then
df_obj.Object.MultiLine = True
End If
'--------------------------------------------------------------
'part where we add the custom events for GotFocus and LostFocus
'--------------------------------------------------------------
ReDim Preserve TextBox_Event_Array(1 To i)
Set TextBox_Event_Array(i).df_TextBox = df_obj.Object
TextBox_Event_Array(i).df_TextBox_Name = df_obj.Name
Заявления о проблемах
1.) Когда я создаю модуль класса, я не вижу доступных событий GotFocus и LostFocus.Только изменение, KeyDown / Press / Up, MouseDown / Move / Up
2.) Я создал обработчик события Change только для проверки модуля класса, но не вижу, как он срабатывает.
Любые предложения о том, как я могу решить проблему или альтернативные решения?