После установки пустого значения в текстовом поле ActiveX предыдущий текст ненадолго появляется в поле, а затем снова исчезает. - PullRequest
0 голосов
/ 07 октября 2019

Я создал форму ввода данных в электронную таблицу, используя ActiveX TextBoxes, они связаны с кнопкой отправки сведений и кнопкой очистки данных, и в конце выполнения оба текстовых поля возвращаются пустыми, чтобы их можно было снова заполнитьследующим пользователем инструмента. Однако я заметил, что после того, как поля установлены на «», когда пользователь начинает заполнять форму заново каждый раз, когда пользователь выбирает одно из текстовых полей, предыдущие детали ввода очень быстро вспыхивают в текстовом поле, а затем снова исчезают. Это довольно неприятная проблема, так как я пытаюсь сделать так, чтобы детали предыдущих пользователей были скрыты.

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

Sub clearForm()


'    Worksheets("Student Data").userName.Text = ""
'    Worksheets("Student Data").emailAddr.Text = ""
'    Worksheets("Student Data").contactNum.Text = ""
'    Worksheets("Student Data").Course.Text = ""
'    Worksheets("Student Data").gradDate.Text = ""
'    Worksheets("Student Data").addComment.Text = ""

    textbox1clear

End Sub

Sub submitData()

    'Code here that takes users entered data and outputs to hidden and protected sheet    


    'After data copied text boxes are cleared of users information, same as above sub
    Worksheets("Student Data").userName.Text = ""
    Worksheets("Student Data").emailAddr.Text = ""
    Worksheets("Student Data").contactNum.Text = ""
    Worksheets("Student Data").Course.Text = ""
    Worksheets("Student Data").gradDate.Text = ""
    Worksheets("Student Data").addComment.Text = ""

End Sub
Sub textbox1clear()
    Dim sel
    sel = Selection.Address
    Sheet1.userName.Activate
    Application.SendKeys ("Test ")
    Sheet1.userName.Value = ""
    Range(sel).Activate
End Sub

Ожидается - в текстовых полях должно быть свободноготов к следующему пользователю.

Фактически - текстовые поля очищаются до тех пор, пока пользователь не выберет их, чтобы начать ввод данных, после чего предыдущая запись ненадолго появится в поле и снова исчезнет.

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

вы можете использовать довольно длинную строку из "пробелов", а затем заменить их одним "пробелом"

Public Sub clearForm()
    Worksheets("Student Data").userName.Text = "                                " 'vbNullString
    Worksheets("Student Data").userName.Text = vbNullString
End Sub

, чтобы убедиться, что довольно долго достаточно для покрытия вашего текстового поля

или

вы можете использовать «фиктивный / информативный» текст, который будет удален сразу после ввода текстового поля для последующего ввода

Public Sub clearForm()
    Worksheets("Student Data").userName.Text = "cleared"
    …. (rest of your code
End Sub

Private Sub userName_GotFocus()
    With Worksheets("Student Data").userName
        If .Text = "cleared" Then .Text = vbNullString
    End With
End Sub

Private Sub emailAddr_GotFocus()
    With Worksheets("Student Data").emailAddr
        If .Text = "cleared" Then .Text = vbNullString
    End With
End Sub

… (и так далее для всех ваших текстовых полей)

0 голосов
/ 07 октября 2019

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

Sub textbox1clear()
Dim sel
sel = Selection.Address
Sheet1.TextBox1.Activate
Application.Sendkeys(" ")
Sheet1.TextBox1.Value = ""
Range(sel).Activate
End Sub

Я встроилотзыв выбора, чтобы сделать его (немного) более плавным, если подпрограмма вызывается кнопкойОднако, если это пропущено, и после запуска этого подпрограммы выбор не сделан, текст будет мигать снова, когда текстовое поле отменено.

Также обратите внимание, что это всегда следует вызывать вручную, если оно вызывается из Textbox_LostFocus Как и я, он будет вводить непрерывный цикл до тех пор, пока текстовое поле не выделено.

Это не очень элегантное решение, но если защита данных является приоритетной, это поможет.

Если этого недостаточно, вы можете полностью скрыть ввод , если это вариант.

...