Я действительно новичок в VBA и боролся с кодом для пользовательской формы, которая должна проверять входные значения перед добавлением таблицы, чтобы избежать дублирования и дать указания в окне сообщения.
Когда пользователь нажимает командную кнопку «передача», я бы хотел, чтобы код сначала посмотрел на WONumber, который пользователь пытается ввести, чтобы увидеть, есть ли уже таблица. Если номер WONumber отсутствует в таблице, появляется сообщение, сообщающее пользователю, что номер WONumber не существует.
Если WONumber находится в таблице, я хочу, чтобы код затем просматривал SubName для всех случаев, когда WONumber соответствует их вводу, и проверял, существует ли уже SubName, который они пытаются ввести, в таблице со связанным WONumber. Если SubName уже находится в таблице с WONumber, появится сообщение, сообщающее пользователю, что SubName уже находится в WONumber. Если SubName находится в таблице, но не с тем же пользовательским вводом WONumber, SubName с соответствующим WONumber добавляется в таблицу. По сути, WONumber уникален для таблицы, а SubName уникален для WONumber, но не уникален для таблицы. (Пользователь ДОЛЖЕН иметь возможность добавлять SubName = "Smith" с WONumber = "5" и SubName = "Smith" с WONumber = "500", но НЕ ДОЛЖЕН иметь возможность добавлять SubName = "Smith" с WONumber = "5" дважды. )
Я пробовал несколько комбинаций «Если не ничего», так как я прочитал, что иногда легче работать в этом направлении.
У меня очень мало опыта работы с VBA в целом, поэтому я не знаю, возвращает ли .Find значение или местоположение, поэтому написанные мной условия ElseIf могут вообще не иметь смысла, так как код может находить местоположение и Я прошу это соответствовать тексту.
Я пробовал FoundWO.Value = PsblWOMatch.Value и FoundSub.Value = FoundSubName.Value в качестве условий Elseif, а также .text.
Я не уверен насчет dim FoundWO как Range, FoundSub как Range, так как это, кажется, подразумевает, что FoundWO будет набором значений и приравнивать набор чисел к одному PsblWOMatch действительно не имеет смысла.
Я также нашел несколько видео на YouTube о том, что конкретный код ошибки 91 связан с моим кодом, не включая dim ws как рабочий лист, что является проблемой, но когда я попытался исправить его, чтобы соответствовать примеру, я получаю то же самое код ошибки просто в другой строке.
Private Sub cmdTransfer_Click()
Dim FoundWO As Range
Dim PsblWOMatch As String
PsblWOMatch = txtWONumber.Text
Dim FoundSub As Range
Dim PsblSubMatch As String
PsblSubMatch = txtSubName.Text
Dim eRow As Long
eRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
Set FoundWO = ActiveSheet.ListObjects("TableWO").ListColumns(1).DataBodyRange.Find(What:=PsblWOMatch, LookIn:=xlValues, Lookat:=xlWhole)
Set FoundSub = ActiveSheet.ListObjects("TableWO").ListColumns(2).DataBodyRange.Find(What:=PsblSubMatch, LookIn:=xlValues, Lookat:=xlWhole)
'If Condition 1 then
If FoundWO Is Nothing Then
'Code to execute
MsgBox "Work Order does not exist. Please add Work Order before adding subcontractors."
'If Condition 2 then
ElseIf FoundWO = PsblWOMatch And FoundSub = PsblSubMatch Then
'Code to execute
MsgBox "SubContractor has already been added to Work Order."
Else
'Code to execute
Cells(eRow, 1).Value = txtWONumber.Text
Cells(eRow, 2).Value = ""
Cells(eRow, 3).Value = txtSubName.Text
Cells(eRow, 4).Value = txtsubLocation.Text
End If
txtWONumber.Text = ""
txtSubName.Text = ""
txtsubLocation = ""
txtWONumber.SetFocus
End Sub
Мне удалось отобразить msgbox, сообщая пользователю, что номер WONumber не существует. И я смог добавить SubName, когда WONumber существует. Но я получаю сообщение об ошибке «91»: переменная объекта или переменная блока не установлены. Подсветка отладки находится в строке ElseIf.