Проще говоря, моя таблица представляет собой базу данных с элементами в столбце A и серийными номерами в столбце B. Не может быть двух одинаковых серийных номеров. Одна пользовательская форма имеет текстовые поля с элементами и серийными номерами. Как для добавления, так и для редактирования элементов используется одна и та же пользовательская форма.
Чтобы проверить, является ли серийный номер уникальным для листа, я использовал следующий код:
If Application.WorksheetFunction.CountIf(WS.Range("b4:b100"), Me.Controls("serialnumber" & i)) > j Then
MsgBox "serial number " & Me.Controls("serialnumber" & i) & " already exists in database", vbCritical, "Error"
Me.Controls("serialnumber" & i).SetFocus
Exit sub
End If
перед добавлением j, я использовал 0, чтобы проверить, существует ли какое-либо вхождение, только если я использовал Add new. Тем не менее, я хотел проверить наличие дубликатов также при редактировании элемента. Это создает ошибку при редактировании, при этом в серийный номер не вносятся никакие изменения, но все равно происходит отключение счетчика и выход вспомогательного устройства.
Я пытался использовать следующий код, чтобы проверить, соответствует ли текущее значение элементу текстового поля.
IIf WS.Cells(a, 2) = Me.Controls("serialnumber" & i).Value, j = 1, j=0
«a» относится к строке, в которой находится отредактированный элемент. По сути, при редактировании список заполняется всеми элементами, и из этого listindex вызывается «a»
Проблема заключается в том, что даже если значение ячейки (a, 2) и значение текстового поля одинаковы, даже если показывая то же самое с debug.prints, оператор if, сравнивающий их, всегда оценивается как ложный. Я попытался оставить .value в обоих случаях, добавив .value к обеим сторонам уравнения, я даже объявил переменные для каждого из этих двух значений, сделал их целыми числами, сравнил их и по-прежнему отображаю false.
Может быть другой способ сделать это, но я хочу посмотреть, существует ли значение серийного номера в другом месте столбца, исключая целевую строку, из которой он произошел. Если я смогу это сделать, то даже добавление нового элемента будет использовать ту же проверку ошибок, поскольку целевая строка будет первой пустой строкой в конце списка. Есть ли способ сделать показ, исключая динамически изменяющуюся строку?
Редактировать: Вот как данные вводятся в лист.
With WS.Cells(a, "a")
.Offset(0, 1).Value = Me.Controls("serialnumber" & i).Value
end with
Это только числа, такие как «123456», введенные в текстовое поле серийного номера. (без кавычек)