Найдите значение внутри столбца, затем измените значение в другом месте в той же строке

В настоящее время я работаю над проектом, в котором я работаю с базой данных Excel. Он будет использоваться для отслеживания производства определенных предметов и время от времени, человеческие ошибки могут произойти, и были случаи, когда люди просматривали один и тот же элемент более одного раза, что впоследствии вызывает проблемы, когда пришло время его упаковать и отправить клиенту.

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

Моя основная проблема прямо сейчас заключается в том, чтобы выяснить, как изменить значение ячейки, всякий раз, когда происходит обман или этот предмет перерабатывается.

Если элемент сканируется и он уже присутствует в «базе данных», есть MsgBox с кнопками vbYesNo. Если люди нажимают «Да», это переделка. Если люди нажимают «Нет», это ошибка, и они выходят из под.

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

Может ли кто-нибудь помочь мне или указать мне в правильном направлении? Я читал некоторые подобные вопросы по этой теме, но до сих пор никто не имел четкого ответа.

Вот код, который у меня есть.

Private Sub gbatchd_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Check DB for duplicate value

Set depo = dbgrids.Sheets("Deposition")
Set found = depo.Columns("A").Find(what:=valuetofind, LookIn:=xlValues, lookat:=xlWhole)

valuetofind = gbatchd.Text
FR = depo.Range("A" & Rows.Count).End(xlUp).Row

If KeyCode = 13 Then
    For i = 1 To FR
        If gbatch.Cells(i, 1).Value = valuetofind Then
            MsgBox "This batch has already been deposited!" & vbCrLf & "Rework?", vbYesNo, "Rework?"
            If answer = vbNo Then
                Exit Sub
            Else
                depo.Cells(found.Row, 5).Value = "Rework"
            End If
        End If
    Next
End If
End Sub

Всего 1 ответ


Отмечая критику архитектуры решения, то, что отсутствует в вашем коде, является назначение переменной answer :

answer = MsgBox("This batch has already been deposited!" & vbCrLf & "Rework?", vbYesNo, "Rework?")

Используйте Option Explicit и объявите переменные с соответствующими типами ( ознакомьтесь с этой статьей ).

Очищенная версия вашего кода может выглядеть примерно так:

Option Explicit 'At the very top of your module.

'... Other code ...

Private Sub gbatchd_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Check DB for duplicate value
    Dim wsDepo As Excel.Worksheet
    Dim rngFound As Excel.Range
    Dim sValueToFind As String
    Dim answer As VbMsgBoxResult

    If KeyCode = KeyCodeConstants.vbKeyReturn Then
        'Barcode reader has sent the Enter (Return) key.
        'Attempt to find the value.
        sValueToFind = Trim(gbatchd.Text)
        Set wsDepo = dbgrids.Worksheets("Deposition")
        Set rngFound = wsDepo.Columns(1).Find(What:=sValueToFind, LookIn:=xlValues, LookAt:=xlWhole)

        If Not rngFound Is Nothing Then
            'Value was found. Ask whether it is a rework.
            answer = MsgBox("This batch has already been deposited!" & vbCrLf & "Rework?", vbYesNo, "Rework?")
            If answer = VbMsgBoxResult.vbYes Then
                wsDepo.Cells(rngFound.Row, 5).Value = "Rework"
            End If
        End If

        'Cleanup.
        Set rngFound = Nothing
        Set wsDepo = Nothing
    End If
End Sub