Код MS Access VBA в поле формы с несколькими символами If для предотвращения / разрешения ввода в зависимости от введенного значения - PullRequest
0 голосов
/ 01 ноября 2018

Здравствуйте, пожалуйста, помогите со следующим:

Я пытаюсь запретить конечным пользователям возможность ввода значения в поле txtPlantUsedGrams (PlantAmountUsed), которое больше суммы в поле txtExtractionAmountAvailable (ExtractionAvailable), но разрешает ввод, когда значение txtPlantUsedGrams меньше суммы в поле txtExtractionAmountAvailable.

Код работает в случае, когда PlantAmountUsed больше, чем ExtractionAvailable, так как он вызывает msgbox, а затем устанавливает поле txtPlantAmountUsed в ноль. В случае, когда PlantAmountUsed меньше чем ExtractionAvailable, это позволяет введенному значению закрепиться (не меняет его на 0), но только после того, как будет запущен msgbox, и я нажму ok. Код "sub sub", который я вставил после первого If, не работает. Помогите мне, чтобы следующий код не вызывал msgbox и вместо этого выходил из подпрограммы в случае, когда значение PlantAmountUsed меньше значения ExtractionAvailable. Я открыт для любых / всех способов сделать это. Спасибо за любую помощь:)

Расположение кода VBA:

Событие запускается в форме (frmMedMaking) как событие AfterUpdate в поле txtPlantUsedGrams.

**VBA Code:**

Private Sub txtPlantUsedGrams_AfterUpdate()

Dim PlantAmountUsed As Integer
Dim ExtractionAvailable As Integer
Dim LResponse As Integer

PlantAmountUsed = Me.txtPlantUsedGrams
ExtractionAvailable = Me.txtExtractAmountAvailable.Value
LResponse = MsgBox("Plant Amount Used must be less than Extraction 
Available", vbOKOnly + vbCritical, "Available Extraction Amount Exceeded")

If PlantAmountUsed < ExtractionAvailable Then Exit Sub
    If PlantAmountUsed > ExtractionAvailable Then
    If LResponse = vbOK Then Me.PlantAmountUsed.Value = 0
End If

End Sub

1 Ответ

0 голосов
/ 01 ноября 2018

Похоже, ваша проблема связана с тем, что вы вызываете MsgBox до того, как будет проверено условие If PlantAmountUsed < ExtractionAvailable Then.

Таким образом, код должен быть немного реструктурирован.

Результирующий код

Это будет результирующий код, основанный на ваших данных:

Private Sub txtPlantUsedGrams_AfterUpdate()
    Dim plantAmountUsed As Integer
    plantAmountUsed = Me.txtPlantUsedGrams.Value

    Dim extractionAvailable As Integer
    extractionAvailable = Me.txtExtractAmountAvailable.Value

    If plantAmountUsed < extractionAvailable Then Exit Sub

    'What if plantAmountUsed = extractionAvailable (see below)?

    If plantAmountUsed > extractionAvailable Then
        ' Why checking the result of the MsgBox when only one button (Ok) can be pressed (see below)?
        If MsgBox("Plant Amount Used must be less than Extraction Available", vbOKOnly + vbCritical, "Available Extraction Amount Exceeded") = vbOK Then
            Me.txtPlantUsedGrams.Value = 0
        End IF
    End If
End Sub

Примечания

  • Я изменил Me.PlantAmountUsed.Value = 0 на Me.txtPlantUsedGrams.Value = 0. Я ожидаю, что это было твоим намерением, верно?

Вопросы / предложения

  • Что если plantAmountUsed равно extractionAvailable? Это явно не обрабатывается. Вы можете использовать If plantAmountUsed <= extractionAvailable Then Exit Sub например.

  • В вашем MsgBox вы используете vbOKOnly, поэтому результат всегда равен vbOK, что будет означать, что вам не нужно будет проверять результат MsgBox. Так что этого может быть достаточно:

    If plantAmountUsed > extractionAvailable Then
        MsgBox "Plant Amount Used must be less than Extraction Available", vbOKOnly + vbCritical, "Available Extraction Amount Exceeded"
        Me.txtPlantUsedGrams.Value = 0
    End If
    
...