在 Access 2016 VBA 中,OnChange 事件是否最适合读取条形码?

In Access 2016 VBA, is the OnChange event the best for reading a barcode?

我有一个访问数据库。我想调出一个带有文本框的表单,然后让用户将条形码扫描到该文本框(15 到 20 个字符)中。将代码扫描到文本框中非常适合我的 USB HID 扫描仪,但一旦代码被扫描,访问就在那里。 OnChange 事件似乎是正确的方向。这是我的示例代码。

Private Sub Text0_Change()

    Debug.Print Me.Text0.Value
    Debug.Print Len(Me.Text0.Value)

End Sub 

我扫描条形码后,这是输出。

00000000000000000
17
00000000000000000
17
00000000000000000
17
.
.
.
<repeated a total of 17 times>

我假设代码中的每个字符都会触发 OnCurrent 吗?使用这种方法,我必须编写代码来忽略除一个事件之外的所有事件。我应该捕获哪个事件?第一个更改事件是否始终包含整个代码?这听起来像是很多错误的地方。

我的目标是 运行 扫描条形码后无需用户再输入任何代码(即无需用户在扫描代码后按回车键或按钮)。这个功能有没有比 OnChange 更好的东西?我的方法全错了吗?

在此先感谢您的帮助。

您确实可以使用 On Change 事件。我的实施会因您的扫描仪的工作方式而异。如果您的扫描器在扫描条形码后只是输入固定行数,您可以计算行数以查看它是否在您的 On Change 事件中完成,如果已经完成则执行一些操作。

另一种方法是将 On Change 事件中的 Form.Timer 属性 设置为较小的数字,然后将计时器设置为 0 并在表单 On Timer 事件中进行实际工作。这样你就不必检测整个条形码被扫描的事实,它只会在改变它的内容后触发一次,而且只会触发一次(只要 Form.Timer 数字足够大)。

另一种选择是更新前后事件,但它们要求用户离开文本框。

我使用 onchange 事件并设置案例语句来检查我们扫描的条形码的特定部分(我们有特定的前缀和长度,因此很容易设置业务规则)。关键是使用 onchnage 事件允许它在不采取任何操作的情况下触发,直到整个扫描结果在输出文本框控件中完成......因此案例语句在条形码类型的前缀(例如位置、资产标签或序列号)和条形码的长度(以帮助确定整个扫描是否完成)。我设置了一个包含四个文本字段(未绑定)的表单。字段为 'location/container'、'date/time'、'item_ID' 和 'current_scan'。 current_scan 文本框具有焦点,因此扫描仪输出将转储到那里,并且 VBA 代码位于该控件的 onchange 事件中。我在扫描仪上使用了 3 或 9 个代码。我的规则集检查扫描结果的长度,查看前缀的前三个字符,对于给定的前缀,然后检查条形码的长度,并根据我的规则采取行动更新表单上的其他三个文本框已建立(如果它是具有正确长度的位置前缀,则更新位置文本框等)。填写位置和项目后,我可以扫描或单击屏幕,命令接受或拒绝最后扫描的项目。如果被接受,代码将向基础 table 添加一条新记录并将表单上已填写(未绑定)的文本框项目分配给新记录的正确字段并保存新记录。所以它很好用。我的下一步是让它对库存数据库进行查找以显示有关扫描项目的信息。不幸的是,我这里没有我的代码,但希望这个措辞有所帮助。