2016-12-22 1 views
0

Я хочу сделать что-то вроде этого. Не знаю, возможно ли это в Excel VBA. В форме пользователя у меня есть флажок и текстовое поле.VBA disable Событие выбора флажка от запуска внутри события изменения текстового поля

Когда я устанавливаю флажок, заголовок флажка будет вставлен в текстовое поле, когда снимите флажок, надпись в блоке будет удалена из того же текстового поля.

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

код события нажмите CheckBox в:

Private Sub cbSelect_Click() 
    With TextBox1 
     .Value = IIf(cbSelect.Value, _ 
     .Value & cbSelect.Caption, _ 
     Replace(.Value, cbSelect.Caption, vbNullString)) 
    End With 
End Sub 

Текст Код изменения событий бокса:

Private Sub TextBox1_Change() 
    If InStr(TextBox1.Value, cbSelect.Caption) Then 
     cbSelect.Value = 1 
    Else 
     cbSelect.Value = 0 
    End If 
End Sub 

Любая идея?

+0

Вы протестировали какой-либо ответ? любая обратная связь? –

ответ

0

Когда я тестировал код, статус флажок не изменился, который я считаю, связано с использованием двоичных значений (1/0) вместо Boolean (True/False)

Я изменил свой Textbox1_Change код следующий, и как только я удалить часть флажка с

Private Sub TextBox1_Change() 
    If InStr(TextBox1.Value, cbSelect.Caption) Then 
     cbSelect.Value = True 
    Else 
     cbSelect.Value = False 
    End If 
End Sub 
0

Я добавил Public TextBoxFlag As Boolean на уровне User_Form модуля, и этот «флаг» в настоящее время доработан и проверяется события как элемент управления.

После того, как код попадает в TextBox1_Change событие флаг получает значение True, и когда код достигает cbSelect_Click события, он не работает код внутри, если значения TextBoxFlag = True, только если это False (не пришел от события TextBox1_Change, но непосредственно из события CheckBox1).

Код

Option Explicit 

Public TextBoxFlag As Boolean 

Private Sub cbSelect_Click() 

    ' check if event came from the value being modified in the TextBox1_Change event 
    If TextBoxFlag = False Then 
     With TextBox1 
      .Value = IIf(cbSelect.Value, _ 
      .Value & cbSelect.Caption, _ 
      Replace(.Value, cbSelect.Caption, vbNullString)) 
     End With 
    End If 

End Sub 


Private Sub TextBox1_Change() 

    ' raise the flag >> came from TextBox change event 
    TextBoxFlag = True 

    If InStr(TextBox1.Value, cbSelect.Caption) > 0 Then 
     cbSelect.Value = True 
    Else 
     cbSelect.Value = False 
    End If 
    ' reset the flag 
    TextBoxFlag = False 

End Sub 
0

ваш код на самом деле работал на меня без вопроса вы описали только заменяющего:

InStr(Me.TextBox1.Value, Me.cbSelect.Caption) 

с:

InStr(Me.TextBox1.Value, Me.cbSelect.Caption) > 0 

BTW вот некоторые, возможно, полезным кодирование советы:

  • Я всегда использую Me ключевое слово и обратитесь к Userform управления.

    это также будет иметь Intellisense вам помочь в поиске UserForm элементов управления именами

  • код cbSelect.Value установка может быть сокращена до одной линии

в результате все, что выше:

Private Sub TextBox1_Change() 
    Me.cbSelect= InStr(Me.TextBox1.Value, Me.cbSelect.Caption) > 0 
End Sub 

Private Sub cbSelect_Click() 
    With Me.TextBox1 
     .Value = IIf(Me.cbSelect, _ 
        .Value & Me.cbSelect.Caption, _ 
        Replace(.Value, Me.cbSelect.Caption, vbNullString)) 
    End With 
End Sub 
+0

@ ĐứcThanhNguyễn, вы прошли через это? – user3598756

+0

@ ĐứcThanhNguyễn, Было бы неплохо, если бы вы дали правильную обратную связь людям, которые пытались помочь вам. спасибо – user3598756