You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用VBA实现Excel扫描不同前缀员工条码自动提取人员信息

实现方案

完全可以通过VBA实现需求,下面提供两种落地方式,可根据使用习惯选择:

方式1:自定义工作表函数(和普通Excel公式用法一致,直接在单元格调用)

按Alt+F11打开VBA编辑器,插入新模块,粘贴以下代码:

' 自定义函数:提取Base32编码
Function GetBase32(barcode As String) As String
    If Len(barcode) = 0 Then
        GetBase32 = ""
        Exit Function
    End If
    Select Case UCase(Left(barcode, 1))
        Case "M"
            GetBase32 = Mid(barcode, 2, 7)
        Case "N"
            GetBase32 = Mid(barcode, 9, 7)
        Case "C"
            GetBase32 = Mid(barcode, 8, 7)
        Case Else
            GetBase32 = ""
    End Select
End Function

' 自定义函数:提取名字
Function GetFirstName(barcode As String) As String
    If Len(barcode) = 0 Then
        GetFirstName = ""
        Exit Function
    End If
    Select Case UCase(Left(barcode, 1))
        Case "M"
            GetFirstName = WorksheetFunction.Proper(Mid(barcode, 17, 20))
        Case "N"
            GetFirstName = WorksheetFunction.Proper(Mid(barcode, 16, 20))
        Case "C"
            GetFirstName = WorksheetFunction.Proper(Mid(barcode, 15, 20))
        Case Else
            GetFirstName = ""
    End Select
End Function

' 自定义函数:提取姓氏
Function GetLastName(barcode As String) As String
    If Len(barcode) = 0 Then
        GetLastName = ""
        Exit Function
    End If
    Select Case UCase(Left(barcode, 1))
        Case "M"
            GetLastName = WorksheetFunction.Proper(Mid(barcode, 38, 20))
        Case "N"
            GetLastName = WorksheetFunction.Proper(Mid(barcode, 36, 26))
        Case "C"
            GetLastName = WorksheetFunction.Proper(Mid(barcode, 35, 20))
        Case Else
            GetLastName = ""
    End Select
End Function

' 自定义函数:Base32转员工ID
Function Base32ToID(base32Str As String) As String
    If Len(base32Str) = 0 Then
        Base32ToID = "0"
        Exit Function
    End If
    Dim i As Long, char As String, charVal As Long, total As Double
    total = 0
    base32Str = UCase(base32Str)
    For i = 1 To Len(base32Str)
        char = Mid(base32Str, i, 1)
        If IsNumeric(char) Then
            charVal = Val(char)
        ElseIf Asc(char) >= 65 And Asc(char) <= 90 Then
            charVal = Asc(char) - 55
        Else
            Base32ToID = "0"
            Exit Function
        End If
        total = total + charVal * (32 ^ (Len(base32Str) - i))
    Next i
    Base32ToID = CStr(total)
End Function

将工作簿保存为**启用宏的工作簿(.xlsm格式)**后,即可在工作表直接调用函数:

  • Base32列输入:=GetBase32(A2)
  • 名字列输入:=GetFirstName(A2)
  • 姓氏列输入:=GetLastName(A2)
  • ID列输入:=Base32ToID(对应Base32单元格),也可合并调用=Base32ToID(GetBase32(A2))

方式2:自动触发填充(扫描条码后自动填充所有字段,无需手动输入公式)

如果需要扫描即出结果,可在当前工作表的代码窗口粘贴以下事件代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 仅监控A列的单单元格修改,匹配扫码枪逐行输入的使用场景
    If Target.Column <> 1 Or Target.CountLarge > 1 Then Exit Sub
    Dim barcode As String
    barcode = Trim(Target.Value)
    If Len(barcode) = 0 Then
        Range("B" & Target.Row & ":E" & Target.Row).ClearContents
        Exit Sub
    End If
    Range("B" & Target.Row) = GetBase32(barcode)
    Range("C" & Target.Row) = GetFirstName(barcode)
    Range("D" & Target.Row) = GetLastName(barcode)
    Range("E" & Target.Row) = Base32ToID(Range("B" & Target.Row).Value)
End Sub

注意:使用自动触发功能需要先将方式1中的4个自定义函数导入模块,否则会报错。

注意事项

  • 所有桌面版Excel均支持上述VBA功能,无需依赖Office 365专属函数
  • 工作簿必须保存为.xlsm格式,否则宏代码会失效
  • 使用前需要在Excel信任中心启用宏,避免代码被系统拦截

内容的提问来源于stack exchange,提问作者Chris Schaeuble

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:36:03