Текстовое поле VBA отключено - PullRequest
1 голос
/ 25 апреля 2020

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


Me.CSockett.Enabled = Not IsNull(Me.CSocketl)


'If CSocketl.Value = "" Then
'    Me.CSockett.Enabled = False
'    Else
'    Me.CSockett.Enabled = True
'End If

Если у кого-нибудь есть какие-либо советы, было бы здорово.

Приветствия

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Чтобы сделать его более гибким (это означает, что вы можете использовать его для большого количества текстовых полей), я создал три класса, которые обрабатывают событие текстового поля, а также определяют собственное событие для включения соотв. отключить текстовые поля.

Чтение для этой топи c при MS

Класс cTextboxes

   Option Explicit

    Private mcolTextboxes As Collection

    Private Sub Class_Initialize()
        Set mcolTextboxes = New Collection
    End Sub

    Public Sub Add(ByRef nTextbox As MSForms.Textbox, index As Long)
        Dim mTextbox As cTextbox
        Set mTextbox = New cTextbox
        mTextbox.index = index
        Set mTextbox.Parent = Me
        Set mTextbox.Textbox = nTextbox
        mcolTextboxes.Add mTextbox
    End Sub

    Public Function InitBoxes()
        Dim i As Long
        For i = 2 To mcolTextboxes.Count
            mcolTextboxes.Item(i).Enabled = False
            mcolTextboxes.Item(i).Backcolor = &H80000016
        Next i
    End Function
Public Function enableBox(index As Long)
    If index <= mcolTextboxes.Count Then
        mcolTextboxes.Item(index).Enabled = True
        mcolTextboxes.Item(index).Backcolor = &H80000005
    End If
End Function
Public Function disableBox(index As Long)
    If index <= mcolTextboxes.Count Then
        mcolTextboxes.Item(index).Enabled = False
        mcolTextboxes.Item(index).Backcolor = &H80000016
    End If
End Function

Класс cTextbox

Option Explicit

Private WithEvents mTextbox As MSForms.Textbox
Private WithEvents mTextChange As cTextboxChange


Dim mParent As Object
Dim mIndex As Long

Public Property Set Textbox(tb As MSForms.Textbox)
    Set mTextbox = tb
    Set mTextChange = New cTextboxChange
End Property
Property Let index(nIndex As Long)
    mIndex = nIndex
End Property
Property Get index() As Long
    index = mIndex
End Property
Public Property Set Parent(nParent As Object)
    Set mParent = nParent
End Property
Public Property Get Parent()
    Set Parent = mParent
End Property
Property Let Enabled(nEnabled As Boolean)
    mTextbox.Enabled = nEnabled
End Property
Property Let Backcolor(color As Long)
    mTextbox.Backcolor = color
End Property

Private Sub mTextBox_Change()
    mTextChange.ChangeIt
End Sub

Private Sub mTextChange_EnableBox()

    If mTextbox.TextLength > 0 Then
        mParent.enableBox index + 1
    Else
        mParent.disableBox index + 1
    End If

End Sub

Класс cTextboxChange

Option Explicit

Public Event enableBox()

Public Sub ChangeIt()
    RaiseEvent enableBox
End Sub

Сама пользовательская форма содержит в качестве примера четыре текстовых поля и содержит следующий код

Option Explicit

Dim colTextboxes As cTextboxes

Private Sub UserForm_Initialize()

Set colTextboxes = New cTextboxes

    colTextboxes.Add Me.TextBox1, 1
    colTextboxes.Add Me.TextBox2, 2
    colTextboxes.Add Me.TextBox3, 3
    colTextboxes.Add Me.TextBox4, 4
    colTextboxes.InitBoxes

End Sub
1 голос
/ 25 апреля 2020

Я создал новый UserForm с 2 TextBox с именами по умолчанию. Вы можете применить эту концепцию к каждому текстовому полю.

Private Sub TextBox1_Change()

If Not Me.TextBox1.Text = "" Then
    Me.TextBox2.Enabled = True
    Me.TextBox2.BackColor = &H80000005
Else
    Me.TextBox2.Enabled = False
    Me.TextBox2.BackColor = &H80000016
End If

End Sub

Private Sub UserForm_Initialize()

Me.TextBox2.Enabled = False
Me.TextBox2.BackColor = &H80000016

End Sub

Код Initialize отключает 2-е текстовое поле и устанавливает цвет фона (см. Ниже), чтобы визуально показать, что он отключен при первом открытии формы.

Код Change оценивает при каждом изменении свойство TextBox.Text, если следующее текстовое поле должно быть включено или нет.

Примечание: С небольшим поиском Вы найдете миллион других способов проверить наличие пустого текстового поля, отличного от ...Text = "".

UserForm при первом открытии (Initialize Код):

Initialized userform with no input to textbox1

После ввода символа в текстовое поле1:

Form after entering

Свойство .Enabled, если установлено значение False, не позволит пользователь нажимает или вкладывает Control (в данном случае TextBox). Я добавляю изменение BackColor, чтобы иметь визуального помощника, показывающего пользователю, что он «серого цвета» - в противном случае он выглядит так же, как включенный textbox и может вызвать разочарование у пользователя.

Естественно, цвет после включения возвращается к значению по умолчанию.

...