MS Access VBA 带有多个 If 的表单字段代码根据输入的值阻止/允许输入

MS Access VBA Code on Form Field with Multiple If's to Prevent / Allow Entry Depending on Value Entered

您好,请协助解决以下问题:

我试图阻止最终用户在 txtPlantUsedGrams (PlantAmountUsed) 字段中输入的值大于 txtExtractionAmountAvailable (ExtractionAvailable) 字段中的值,但允许在 txtPlantUsedGrams 值小于txtExtractionAmountAvailable 字段中的金额。

代码在 PlantAmountUsed 大于 ExtractionAvailable 的情况下工作,因为它触发了消息框,然后将 txtPlantAmountUsed 字段设置为零。在 PlantAmountUsed 小于 ExtractionAvailable 的情况下,它允许输入的值保留(不会将其更改为 0),但只有在触发 msgbox 并且我单击确定之后。我在第一个 If 之后插入的“exit sub”代码不起作用。请帮助我,以便在 PlantAmountUsed 小于 ExtractionAvailable 的情况下,以下代码不会触发 msgbox,而是退出 sub。我愿意接受任何/所有方法来实现这一目标。感谢您的帮助:)

VBA代码的位置:

事件在表单 (frmMedMaking) 中作为 txtPlantUsedGrams 字段中的 AfterUpdate 事件运行。

**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

您的问题似乎是因为您在检查条件 If PlantAmountUsed < ExtractionAvailable Then 之前调用了 MsgBox。

因此必须对代码进行一些重构。

结果代码

根据您提供的信息,这将是生成的代码:

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