Код для TextBox1_Lostfocus начинает выполняться до того, как текстовое поле «потеряет фокус»

#excel #vba

#excel #vba

Вопрос:

У меня есть текстовое поле и поле со списком на листе Excel, которые зависят друг от друга. Иногда код для текстового поля запускается раньше, чем следовало бы, после ввода всего одного символа вместо ожидания, пока я не нажму на него, что приводит к ошибке. Результат. Смотрите приведенный ниже код и скриншот свойств текстового поля.

 Private Sub TextBox1_Lostfocus()

    Range("p5").Value = TextBox1.Value
    With Range("P5")
        .NumberFormat = "0"
        .Value = .Value
    End With
    Range("Q5").FormulaR1C1 = "=IFNA(VLOOKUP(RC[-1],[ShevgenII.xlsb]Sheet1!R1C1:R60C2,2,FALSE),""Error"")"


End Sub

Private Sub ComboBox1_Change()
 
 On Error Resume Next
    Sheets("Calculator").Range("q5").Copy
    Sheets("Calculator").Range("q5").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Application.CutCopyMode = False
    Sheets("Calculator").Range("P5").FormulaR1C1 = "=IF(RC[1]=""Fee Class"",""Enter"",LEFT(RC[1],3))"
    TextBox1.Value = Range("P5")
    
    Sheets("Calculator").Range("A1").Copy
    Sheets("Calculator").Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Application.CutCopyMode = False
    

End Sub
  

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

Проблема возникает, когда, например, я хочу ввести цифры «524», но мне нужно ввести только «5». Vlookup вернет ошибку, потому что нет совпадения с «5». Обратите внимание, что «q5» является связанной ячейкой для поля со списком, поэтому изменения в текстовом поле автоматически запускают код поля со списком. Свойства текстового поля

Комментарии:

1. Эта строчная буква «f» вызывает подозрение «Lostfocus». У вас есть еще какие-нибудь подводные лодки с таким названием?

2. это то, что vba дал мне из выпадающего меню событий текстового поля

3. В предыдущей версии этого файла Excel у меня также был этот код в той же таблице кодов: Private Sub TextBox1_Change() End Sub Я добавил его обратно, и теперь он не создает мне этой проблемы. Есть ли в этом смысл?

4. Я бы ожидал, что событие изменения вызовет поведение, упомянутое в вашем вопросе.

5. Правильно, вот почему я изначально удалил его, когда очищал весь дополнительный код перед публикацией этого документа от моих товарищей по команде. Это была просто пустая процедура….

Ответ №1:

В предыдущей версии этого файла Excel у меня также был этот код в той же таблице кодов:

 Private Sub TextBox1_Change() 
End Sub
  

Я добавил его обратно, и он работает нормально.

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