Найти функцию и, если еще, чтобы избежать дубликатов из ввода формы пользователя - PullRequest
0 голосов
/ 04 июля 2019

Я действительно новичок в 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.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Я думаю, вы ищете что-то вроде:

If FoundWO Is Nothing Then 'need to add a work order first
  MsgBox "Work Order does not exist. Please add Work Order before adding subcontractors."
Else
  If FoundSub Is Nothing Then 'No subcontractor found. OK to add.
    Cells(eRow, 1).Value = txtWONumber.Text
    Cells(eRow, 2).Value = ""
    Cells(eRow, 3).Value = txtSubName.Text
    Cells(eRow, 4).Value = txtsubLocation.Text
  Else
    MsgBox "SubContractor has already been added to Work Order." 'Someone already added the subcontractor
  End If
End if
0 голосов
/ 05 июля 2019

Пара наблюдений: во-первых, свойство .find возвращает объект Range.В операторе ElseIf вы сравниваете его со строковой переменной.

Попробуйте, если хотите сравнить значение объекта диапазона со строкой: ElseIf FoundWO.value = PsblWOMatch And FoundSub.value = PsblSubMatch

Далее, хотя вы проверяете существование FoundWO, вы никогда не проверяете существование FoundSub.Вы получите ошибку «Переменная объекта не установлена», если субподрядчик не найден.Проверьте это так же, как вы проверяли для FoundWO, прежде чем пытаться использовать этот объект.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...