Проверка на основе введенных пользователем данных

Я пытаюсь создать форму для ввода данных результатов лаборатории, которая проверяет ответ на основе спецификации тестируемого продукта. Пользователь вводит следующую информацию: Код продукта и результат SG и т. Д.

Мои исходные данные представляют собой таблицу с 4 столбцами, код продукта, описание, низкий уровень SG, высокий уровень SG

ИСТОЧНИК

Источник данных

Когда пользователь вводит Код продукта и SG в форме, которую я хотел бы проверить на основе определенного диапазона, разрешенного для этого продукта (из исходных данных), и у вас есть диалоговое окно с просьбой пересмотреть введенный результат (если это были вне диапазона).

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

РЕЗУЛЬТАТЫ

Результаты с пределами флага спецификации

Мне нужно обратиться к отдельному VLOOKUP диапазона, чтобы вернуть спецификации.

ФОРМА форма ввода пользователя

Заранее спасибо!

(Обновить)

Private Sub CommandButton1_Click() Dim i As Integer i = 2 While ThisWorkbook.Worksheets("Sheet2").Range("A" & i).Value <> "" i = i + 1 Wend Dim losg, loph, hisg, hiph As Double losg = Application.WorksheetFunction.VLookup(ProdCode.Text, Sheet1.Range("A1:F24"), 3, False) hisg = Application.WorksheetFunction.VLookup(ProdCode.Text, Sheet1.Range("A1:F24"), 4, False) loph = Application.WorksheetFunction.VLookup(ProdCode.Text, Sheet1.Range("A1:F24"), 5, False) hiph = Application.WorksheetFunction.VLookup(ProdCode.Text, Sheet1.Range("A1:F24"), 6, False) If SGresult.Text < losg Then MsgBox "SG result " & SGresult.Text & " too low" ElseIf SGresult.Text > hisg Then MsgBox "SG result " & SGresult.Text & " too high" Else: MsgBox "SG result " & SGresult.Text & " just right" End If If pHresult.Text < loph Then MsgBox "ph result " & pHresult.Text & " too low" ElseIf pHresult.Text > hiph Then MsgBox "ph result " & pHresult.Text & " too high" Else: MsgBox "ph result " & phresult.Text & " just right" End If ThisWorkbook.Worksheets("Sheet2").Range("A" & i).Value = ProdCode.Value 'Enter Code in Column A ThisWorkbook.Worksheets("Sheet2").Range("C" & i).Value = BNenter.Value 'Enter BN in Column C ThisWorkbook.Worksheets("Sheet2").Range("D" & i).Value = DOMenter.Value 'Enter DOM in Column D ThisWorkbook.Worksheets("Sheet2").Range("E" & i).Value = SGresult.Value 'Enter SG result in Column E ThisWorkbook.Worksheets("Sheet2").Range("F" & i).Value = pHresult.Value 'Enter pH result in Column F ThisWorkbook.Worksheets("Sheet2").Range("K" & i).Value = BatcherID.Value 'Enter Batcher ID in Column K End Sub 

Сохраните продукты в столбце «K» и действительный результат для соответствующего продукта в столбце «L». Ниже код даст желаемый результат

 Dim result, prod As String Dim rng As Range result = Val(resultText.Value) prod = prodText.Value ActiveSheet.Activate On Error GoTo step: Set rng = Range("K:K").Find(What:=prod, LookIn:=xlValues, LookAt:=xlWhole) If rng.Offset(0, 1).Value <> result Then MsgBox "The result entered is out of valid range!" End If Exit Sub step: MsgBox "Invalid Product" Exit Sub 

отредактированный после того, как ОП разъяснил, что «форма» была «UserFom»,

Вы можете проверить ввод пользователя во время редактирования / выхода из любого управления, а не ждать события CommandButton1_Click и проверить их все вместе

Такой «модульный» подход должен держать код более простым в управлении и обслуживании

Например, событие TextBox Exit может использоваться для проверки ввода пользователя, когда он / она покидает его, и вернуть его к нему в случае неправильного ввода

более того

  • так как «Код продукта» должен быть выбран между теми, которые указаны в столбце «Источник» таблицы «А»,

    вы можете использовать ComboBox управления ComboBox и выбрать пользователя из списка

  • так как «Название продукта» должно соответствовать тому, которое соответствует выбранному «Код продукта»,

    вы можете использовать элемент управления Label и попросить пользователя просто посмотреть, какое имя соответствует коду продукта, который он только что выбрал

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

 Option Explicit Private Sub UserForm_Initialize() Me.ProdCodeCB.List = GetSourceData(1) '<--| fill Product Name combobox list with "Source" worksheet column 1 data End Sub Private Sub ProdCodeCB_Change() '<--| fires when the user change the combobox selection Me.ProdNameLbl.Caption = Worksheets("Source").Cells(Me.ProdCodeCB.ListIndex + 2, 2) '<--| update Product Name label with the name corresponding to the chosen Product Code End Sub Private Sub SGresultTB_Exit(ByVal Cancel As MSForms.ReturnBoolean) '<--| fires upon exiting the SGresult textbox Dim msgErr As String With Me '<--| reference the Userform If .ProdCodeCB.ListIndex <> -1 Then '<--| if a valid selection has been made in 'ProductCode' combobox If Not IsValueInRange(.SGresultTB, GetProdCodeRange(.ProdCodeCB.ListIndex + 1), msgErr) Then '<-- if value out of range then... With .SGresultTB MsgBox "SG value " & .Value & msgErr _ & vbCrLf & vbCrLf & "Please reconsider the value you input in 'SG' texbox" Cancel = True .SetFocus '<--| get the user back to the textbox ' following two lines select the textbox text so that the user can delete it .SelStart = 0 .SelLength = Len(.Text) End With End If End If End With End Sub '------------------------------------------------- ' helper functions '--------------------------- Function GetSourceData(colIndex As Long) ' this function returns an array with "Source" worksheets data in passed column from its row 2 to last not empty one With Worksheets("Source") '<--| reference "Source" worksheet GetSourceData = Application.Transpose(.Range(.Cells(2, colIndex), .Cells(.Rows.Count, colIndex).End(xlUp)).Value) End With End Function Function IsValueInRange(tb As MSForms.TextBox, rangeArr As Variant, msgErr As String) As Boolean ' this function returns a boolean (true/false) with the result of the checking whether the passed texbox (tb) text exceeds the passed range (rangeArr) ' msgErr is also set to some text if the range is exceeded With tb Select Case CDbl(.Value) '<-- prepare to act accordingly to its value Case Is < rangeArr(1) '<--| if it's smaller than "SG Low" value msgErr = " is lower than 'SG Low' = " & rangeArr(1) '<-- build the final part of the error message correspondingly Case Is > rangeArr(2) '<--| while if it's greater than "SG High" value msgErr = " is greater than 'SG High' = " & rangeArr(2) '<-- build the final part of the error message correspondingly End Select End With IsValueInRange = msgErr = "" End Function Function GetProdCodeRange(iProd As Long) ' this function returns an array of the SG minimum and maximum values in "Source" worksheet corresponding to the chosen product With Worksheets("Source") '<--| reference "Source" worksheet With .Range("A2", .Cells(.Rows.Count, "A").End(xlUp)) '<--| reference its column "A" cels from row 2 down to last not empty one GetProdCodeRange = Application.Transpose(Application.Transpose(.Cells(iProd, 1).Offset(, 2).Resize(, 2).Value)) '<--| return an array with "SG low" and "SG high" values corresponding to the product index passed End With End With End Function '------------------------------------------------- 

как вы можете видеть, я назвал элементы управления после имен, которые вы выбрали для них, за исключением добавления суффикса, чтобы определить, какой контроль они:

  • ProdCodeCB: «CB» -> это управляющее имя ComboBox

  • SGresultTB: «TB» -> это имя TextBox управления TextBox

  • ProdNameLbl: «Lbl» -> это имя управления меткой

  • vlookup для самой общей строки
  • Как сделать vlookup и заполнить (например, в Excel) в R?
  • Поиск с использованием таблицы с отдельными столбцами
  • Как заменить относительный адрес на абсолютный адрес в VLOOKUP?
  • Существует ли такая вещь, как VLOOKUP, которая распознает повторяющиеся числа?
  • Ошибка VLOOKUP в Excel #NA
  • Vba Vlookup с переменным именем листа
  • Excel 2010: VLOOKUP с несколькими результатами
  • Excel VBA - заполняющая таблица из различных woorkbooks через vlookup
  • Невидимое пространство (Char) в Excel Sheet вызывает 0 (N / A) в результате, как его удалить?
  • Excel - рекурсивный VLookup
  • Interesting Posts

    Скользящий средний расчет для пустых точек в excel

    как мы считываем данные из двух столбцов в файле csv / xls в 2 переменные и используем их для программы, используя python

    Выбор нескольких файлов в FileDialog для отправки по электронной почте

    Excel VBA: передача аргументов

    Свяжите мою базу данных excel с вопросами и ответами на мои кнопки и текстовые представления в приложении

    Excel Find Replace Source в запросе рабочей книги

    Использование R для управления данными электронной таблицы Excel и возвратом вывода на отдельный лист

    Экспорт результатов запроса базы данных для Excel с использованием apache poi

    Excel – базовая копия-вставка между листами макроса

    Ошибка проверки SSIS Excel

    DrillDown to Array

    Импортировать файл excel, который находится на локальном компьютере, на SQL Server 2005

    Ограничение количества данных для отправки из пользовательской формы на листе excel

    Фильтры DataValidation Таблица

    Spreadsheetgear установить флаги данных для определенного столбца?

    Давайте будем гением компьютера.