Excel VBA - обработчик событий GotFocus / LostFocus для динамически добавляемого объекта ActiveX - PullRequest
0 голосов
/ 20 сентября 2018

Я создал инструмент, использующий 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 только для проверки модуля класса, но не вижу, как он срабатывает.

Любые предложения о том, как я могу решить проблему или альтернативные решения?

...