TextBox ClassModule - Изменение цвета фона только при изменении реального значения - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть пользовательская форма с несколькими элементами управления (текстовое поле).Эти текстовые поля будут заполнены путем выбора элемента ListBox.При инициализации пользовательской формы эти текстовые поля будут назначены определенному классу, который их обрабатывает.

Я хочу, чтобы VBA изменил цвет фона этих текстовых полей только тогда, когда было выполнено реальное изменение значения.У меня есть то, что BackgroundColor всегда изменяется, как только изменение было выполнено, но это не то, что я хочу.

Пример # 1: Значение текстового поля перед изменением:"test" Значение текстового поля после изменения:"test2" -> BackgroundColor должно быть изменено

Пример # 2: Значение текстового поля до изменения:"тест" Значение текстового поля послеизменить:"test bla", но потом я снова набираю "test".-> BackgroundColor не должен быть изменен, потому что начальное значение снова находится в TextBox снова.

Что у меня есть:

' **************************************************************
'  Module:  clsTextbox  Typ = Class Module
' **************************************************************

Public WithEvents mTextBoxs As MSForms.TextBox

Private Sub mTextBoxs_Change()

If mTextBoxs.Text = strInitialVal Then
Reset_BackColor
Else
    mTextBoxs.BackColor = RGB(255, 255, 153)
End If
End Sub

Public Sub Reset_BackColor()
    mTextBoxs.BackColor = RGB(255, 255, 255)
End Sub

' **************************************************************
'  Module:  frmEmployee  Type = Userform
' **************************************************************
Dim arrLabels() As New clsLabel, UBoundarrLabels As Integer
Dim arrTextBoxs() As New clsTextbox, UBoundarrTextBoxs As Integer

Private Sub UserForm_Initialize()
    Dim Ctrl As Control, obLabel As MSForms.Label, obTextbox As MSForms.TextBox
    tblName = "tblMitarbeiter"
    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Mitarbeiter")

    i = 0
    For Each Ctrl In Me.Controls
        If Left(Ctrl.Name, 7) = "TextBox" Then
            i = i + 1
            ReDim Preserve arrTextBoxs(i)
            Set obTextbox = Me.Controls("TextBox" & i)
            Set arrTextBoxs(i).mTextBoxs = obTextbox
        End If
    Next Ctrl

    ' Fill Listbox1 with values (Vorname & Nachname) from Table [tblMitarbeiter]
    Dim lngLastRow As Long: lngLastRow = getListLastRow(ws, tblName)
    Dim vArrListBox1() As Variant
    ReDim vArrListBox1(0 To lngLastRow - 1, 0 To 2)
    For j = 1 To lngLastRow
        vArrListBox1(j - 1, 0) = ws.ListObjects("tblMitarbeiter").DataBodyRange(j, 1).Value
        vArrListBox1(j - 1, 1) = ws.ListObjects("tblMitarbeiter").DataBodyRange(j, 2).Value
        vArrListBox1(j - 1, 2) = ws.ListObjects("tblMitarbeiter").DataBodyRange(j, 3).Value
    Next j

    For t = 1 To 4
        Me.Controls("TextBox" & t) = vArrEmployee(t - 1)
    Next t

    strInitialVal = Me.Controls("TextBox2")

End Sub

Мои мыслиявляются: Как вы можете видеть, я пытался объявить открытую переменную (strInitialVal) в модуле, который получает начальное значение текстового поля (например, TextBox2), и при выполнении события mTextBoxs_Change () он проверяет, является ли strInitialVal тем жев качестве значения в текстовом поле и так далее.-> это работает, но только для отношения 1: 1 переменной и текстового поля.

Как мне удается загрузить все значения текстового поля в массив?и проверьте значения в классе TextBox впоследствии.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Надеюсь, я не нарушил никаких SO-правил.

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете использовать коллекции для хранения ваших текстовых полей.После явной опции объявите эти коллекции Private ColTxtBox As New Collection

Затем при динамическом создании текстовых полей вот один пример:

`'Create Unit size; textbox
Set TxtBox = New DynamicTxtbox
TxtBox.Row = FormRows
TxtBox.Column = A_Deliv.F_UnitSize
Call TxtBox.InitText(frm_delivery.Frame1, "txtbox" & TxtBox.Row) 'this is the 
constructor
ColTxtBox.Add TxtBox`

Однако, если вы уже создали все текстовые поля в своей форме, и ониисправлено, достаточно пройти через все элементы управления и добавить их в свою коллекцию (если это текстовое поле!).Затем в своем классе текстового поля вы можете легко перебрать все ваши текстовые поля - и получить доступ к их текущим значениям с помощью чего-то вроде

`Private Sub mTextBoxs_Change()
    For Each TxtBox In ColTxtBox
      If InStr(Me.Value,TxtBox.Value) > 0 Then
        Reset_BackColor
      Else 
        mTextBoxs.BackColor = RGB(255, 255, 153)
      End If
    Next TxtBox
 EndS Sub`
...