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
您好,请协助解决以下问题:
我试图阻止最终用户在 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