背景:很久没有接触VBA的需求了,今天有个需求出现,客户那边的二维码激光打印可能出现重复,需要在操作完之后,进行扫码排重,
并且现场提示工作人员进行处理(不能交到购买终端客户手上才发现);

细节过程:
1、打开Excel就直接进行提示扫码录入,不要让操作工点键盘什么的,可以触屏即可;
2、扫码枪扫描完毕,直接就时间和二维码内容;
3、判断内容是否重复,弹框提示,并且中断进程;
4、增加弹框轮询的退出机制,录入Q/q字母即可退出;

5、初次接触宏的快捷键操作


Dim isrun As Boolean

Sub autoinput()
'
' autoinput 宏
'
' 快捷键: Ctrl+Shift+I
    isrun = True

    Dim I As Long

    Do While (isrun)
    I = Application.WorksheetFunction.Max(2, Range("B" & Rows.Count).End(xlUp).Row + 1)
    
    Dim str As String
    str = InputBox("请扫码录入")
    If (str = "q" Or str = "Q") Then
       isrun = False
       Exit Sub
    End If
    
    If str <> "" Then
        If CheckIsRepeat(str) Then
            isrun = False
            Exit Sub
        End If
    
        Range("B" & I).Value = str
        Range("A" & I).Value = DateTime.Date & " " & DateTime.Time
    End If
    

    ActiveWorkbook.Save
    Loop
End Sub

Private Sub Workbook_Open()
    Call VBAProject.mainmodel.autoinput
End Sub

'排重方法1,通过系统的CountIf来进行重复计数,比较靠谱
Private Function CheckIsRepeat(inv) As Boolean
    If Application.WorksheetFunction.CountIf(ActiveSheet.Columns(2), inv) >= 1 Then
        msg = MsgBox(inv & Chr(10) & "数据重复!!!!" & "数据重复!!!!" & Chr(10) & "数据重复!!!!", vbOKOnly, "重复提示")
 
      'If msg = vbOKOnly Then '选择不保留则该单元格赋空值
        CheckIsRepeat = True
      'End If
    Else
        CheckIsRepeat = False
    End If
End Function

'方法2 通过字典进行排重判断,有bug
Private Function CheckIsRepeat2(inv) As Boolean
    Set Db = CreateObject("Scripting.Dictionary")
    Dim isrepeat As Boolean
    isrepeat = False
    
    For I = 0 To ActiveSheet.UsedRange.Rows.Count
        Dim tv As String
        tv = Trim(Range("B" & I + 2).Value)
        
        If tv <> "" Then
            If Db(tv) Then
                MsgBox "第" & I & "行数据【" & tv & "】重复!"
                isrepeat = True
                Exit For
            Else
                Db(tv) = True
            End If
        End If
    Next I
    
    CheckIsRepeat = isrepeat
End Function


标签: none

评论已关闭