Обновите значение TextBox после обновления других TextBox - PullRequest
0 голосов
/ 29 июня 2019

Я учусь на VBA и работаю над менеджером лиги для моего местного бильярдного зала (парню нравится Excel). Я создал пользовательскую форму для ввода баллов и ищу более простой способ кодирования в ней своих элементов управления. У меня есть TextBox, который должен отображать сумму значений, содержащихся в других TextBox в пользовательской форме. Вместо написания подпрограммы AfterUpdate, содержащей один и тот же код для каждого TextBox, можно просто сказать

-Обновить эту сумму, если какой-либо из текстовых полей изменяется или обновляется

Мое исследование указало мне в направлении использования класса для TextBoxes, но я прочитал, что модификатор WithEvents не поддерживает Change или Before / After Update, и я не смог найти пример, который решает мою проблему. Или, скорее, пример, который работает только для текстовых блоков, которые я хочу сгруппировать, а не для всех текстовых блоков. Как уже упоминалось, я могу легко написать дублирующую подпрограмму (как показано ниже) для каждого из текстовых полей, но я чувствую, что есть более эффективный способ.

Private Sub txtPlayer1_1_Score6_AfterUpdate()
    txtPlayer1_1_Total.Value = CInt(txtPlayer1_1_Score1.Value) + _
                               CInt(txtPlayer1_1_Score2.Value) + _
                               CInt(txtPlayer1_1_Score3.Value) + _
                               CInt(txtPlayer1_1_Score4.Value) + _
                               CInt(txtPlayer1_1_Score5.Value) + _
                               CInt(txtPlayer1_1_Score6.Value)

End Sub

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 30 июня 2019

Вот пример, который использует событие Change в модуле класса. Предполагается, что пользовательская форма называется UserForm1, поэтому измените имя соответствующим образом. Кроме того, вы можете изменить поведение кода в зависимости от ваших предпочтений, но, по крайней мере, это только начало.

Сначала в редакторе Visual Basic вставьте модуль класса (Редактор Visual Basic >> Вставить >> Модуль класса). Затем в окне свойств (F4) назовите свой класс clsTextBox. Затем поместите следующий код в модуль кода для класса ...

Option Explicit

Public WithEvents tb As MSForms.textBox

Private Sub tb_Change()
    Dim textboxCollection As Collection
    Dim textBox As clsTextBox
    Dim total As Long
    Set textboxCollection = UserForm1.getTextBoxCollection()
    total = 0
    For Each textBox In textboxCollection
        If Len(textBox.tb.Value) > 0 Then
            If IsNumeric(textBox.tb.Value) Then
                total = total + textBox.tb.Value
            Else
                With textBox.tb
                    .SetFocus
                    .SelStart = 0
                    .SelLength = Len(.Value)
                End With
            End If
        End If
    Next textBox
    UserForm1.txtPlayer1_1_Total.Value = total
End Sub

Затем поместите следующий код в модуль кода для пользовательской формы ...

Option Explicit

Dim m_textboxCollection As New Collection

Private Sub UserForm_Initialize()
    Dim ctrl As MSForms.Control
    Dim textBox As clsTextBox
    For Each ctrl In Me.Controls
        If InStr(1, ctrl.Name, "Score", vbTextCompare) > 0 Then
            Set textBox = New clsTextBox
            Set textBox.tb = ctrl
            m_textboxCollection.Add textBox
        End If
    Next ctrl
End Sub

Public Property Get getTextBoxCollection()
    Set getTextBoxCollection = m_textboxCollection
End Property

Я хотел бы предложить, однако, чтобы вы использовали метку вместо текстового поля для итога, чтобы пользователь не смог изменить его значение.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...