首页 > 解决方案 > 来自扫描仪输入的增量计数

问题描述

我正在尝试通过扫描电池条形码来创建一个计算电池充电周期/次数的功能。这就是我认为应该这样做的方式:

  1. 每个扫描仪输入应集中在单个“输入数据”单元格或始终处于活动状态的文本框中
  2. 将数据与单独表格中的一系列电池序列号进行比较。
  3. 如果与输入正确匹配,则相应的产品计数器应加一(如果不匹配,则显示警报“无匹配序列)”
  4. 输入单元格/文本框应聚焦并清除以接收来自扫描仪输入的新数据。

我正在使用以下脚本,但是Call IncrementCycleCount(Target.Value)给出了堆栈空间错误。

Const SCANNER_INPUT_CELL As String = "A2"
Const PRODUCT_WORKSHEET As String = "Batteries"
Const PRODUCT_COUNT_COLUMN As Integer = 2
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target = Range(SCANNER_INPUT_CELL) Then
        Call IncrementCycleCount(Target.Value)
        Target.Value = ""
        Target.Select
    End If
End Sub

Sub IncrementCycleCount(productID As String)
    Dim productList As Variant
    productList = Sheets(PRODUCT_WORKSHEET).UsedRange.Columns(1)
    Dim i As Long
    For i = 1 To UBound(productList)
        If productList(i, 1) = productID Then
            Sheets(PRODUCT_WORKSHEET).Cells(i, 2) = Sheets(PRODUCT_WORKSHEET).Cells(i, 2) + 1
            Exit Sub
        End If
    Next i
End Sub     

标签: excelvba

解决方案


您在Worksheet_Change-Event 中调用增量例程。该例程更改工作表中的数据并再次触发Worksheet_Change-Event,该事件调用Increment例程等等(直到堆栈上没有更多空间)

将语句Application.EnableEvents = False放在事件例程的顶部以防止触发新事件,并Application.EnableEvents = True在例程结束时重新启用它们:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Goto Change_End   ' Ensure that events are enables in any case
    Application.EnableEvents = False
    If Target = Range(SCANNER_INPUT_CELL) Then
        Call IncrementCycleCount(Target.Value)
        Target.Value = ""
        Target.Select
    End If
Change_End:
    Application.EnableEvents = True
End Sub

推荐阅读