Как исправить код «Сравнение текстового поля формы пользователя с ячейкой» - PullRequest
0 голосов
/ 10 января 2019

Я добавляю запись в следующем ряду с sr.no и другими данными. Когда я ввожу число в текстовое поле пользовательской формы, оно должно проверить, не дублирует ли оно. Номера в последовательном порядке

Private Sub TextBox1_Change()

    Dim x As Long
    Dim y As Worksheet

    Set y = Sheets("Data")
    x = y.Range("A" & Rows.Count).End(xlUp).Row

    If CInt(TextBox1.Value) <= CInt((Sheets("Data").Range
    .Cells(x, "A").Value)) 
    Then
        MsgBox "Duplicate serial no. found. Increase it"
    End If

End Sub

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 января 2019

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

A серийный номер - это значение, которое должна вычислять система, а не вводить пользователь. Поэтому я предлагаю получить следующий серийный номер с функцией:

Private Function getNextSerial() As Long
    Dim x As Long
    Dim y As Worksheet

    Set y = Sheets("Data")
    x = y.Range("A" & Rows.Count).End(xlUp).Row

    getNextSerial = y.Cells(x, "A").Value + 1 
End Function

... и установить его прямо в TextBox1 при инициализации формы. Например, если ваша форма называется MyUserForm, в событии Initialize() этой формы вы должны указать что-то вроде этого:

Me.TextBox1.Text = getNextSerial() '<-- write next serial
Me.TextBox1.Locked = True '<-- forbid writing

Если вы действительно хотите использовать подход, в котором пользователь вводит серийный номер, тогда вы все равно можете использовать функцию getNextSerial() и написать:

If Me.TextBox1.Text <= getNextSerial() Then

... однако, обратите внимание, что вы делаете это на TextBox.Change мероприятии. Это означает, что если пользователь хочет ввести 1001 в качестве значения, с вашим текущим кодом он будет иметь:

  • Набрав «1» -> MsgBox всплывающее окно
  • Продолжаем с "10" -> MsgBox снова появляются
  • Продолжаем с "100" -> MsgBox снова появляются!
  • Завершить ввод "1001" -> Наконец!

... что вызвало бы сильное чувство ненависти со стороны пользователей по отношению к системе:)

0 голосов
/ 10 января 2019

Я согласен с @MatteoNNZ. Не нужно спрашивать пользователя для S.No. Как пользователь узнает, какой из них является точным номером пользователя?

Я рекомендую 2 варианта

[A] Автоматическая вставка S.No: На вашем изображении номер строки всегда будет (Lastrow - 5). Так что, если вы собираетесь заполнить строку 9, тогда ваш S.No будет 9-5=4. Например

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = Sheet1

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Insert Sno
        .Range("A" & lRow).Value = lRow - 5
    End With
End Sub

[B] Автопопуляция S.No в форме : найдите последнюю строку и вычтите 5 из нее, а затем покажите ее в пользовательской форме. Оставьте текстовое поле locked

Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = Sheet1

    lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

     '~~> Insert Sno
     TextBox1.Text = lRow - 5
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...