VBA 宏处理排重问题
背景:很久没有接触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
评论已关闭