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

如何避免Split数组添加前导零?VBA查找匹配失败问题

VBA条码查找匹配问题解决

问题描述

我有一串条码字符串(如817513015311, 787734332439),使用Split拆分后,通过以下代码在另一工作表中查找PCodeToChk:

Set UpdateRow = Sheets("MASTER - Supplier Price File").Range("f2:f" & LastRow_MSF).Find(PCodeToChk)

目标工作表中的值无前置零,但Split后的数据被添加了前导零,导致查找无法匹配。怀疑空格可能是问题所在,同时想了解其他可靠的查找方法。

完整VBA代码如下:

Option Explicit
Sub ReverseSearch()
Dim WS_MSF As Worksheet
Dim WS_ADF As Worksheet
Dim WS_RES As Worksheet
Dim TBL_MSF  As ListObject
Dim TBL_ADF  As ListObject
Set WS_MSF = Sheets("MASTER - Supplier Price File")
Set WS_ADF = Sheets("IMPORT - Amazon Data")
Set WS_RES = Sheets("Sheet2")

Set TBL_MSF = WS_MSF.ListObjects("MSPF_Table")
Set TBL_ADF = WS_ADF.ListObjects("IMPORT_Table")


Dim c As Long
Dim LastRow_MSF As Long
Dim LastRow_ADF As Long
Dim EANToChk As String
Dim EAN_Split() As String
Dim PCodeToChk As String

Dim PCode_Split() As String

Dim I As Long
Dim UpdateRow As Range
Dim nextUpdateRow As Long
Dim foundrow As Long
Dim MatchedEAN As String
Dim Supplier As String
Dim Item As String
Dim ItemDesc As String
Dim NettUnitCost As Double
Dim Match As String
Dim Asin As String

'
'Get Last Row of Master Supplier File & Amazon Data File
'
LastRow_MSF = TBL_MSF.Range.Rows(TBL_MSF.Range.Rows.Count).Row
LastRow_ADF = TBL_ADF.Range.Rows(TBL_ADF.Range.Rows.Count).Row

nextUpdateRow = 1
For c = 2 To LastRow_ADF
Asin = WS_ADF.Range("d" & c)
EAN_Split = Split(WS_ADF.Range("a" & c), ",")
PCode_Split = Split(WS_ADF.Range("b" & c), ",")
WS_MSF.Activate

Debug.Print Asin
'
'Check EAN field
'
For I = LBound(EAN_Split()) To UBound(EAN_Split())
Match = ""
EANToChk = EAN_Split(I)


Set UpdateRow = Sheets("MASTER - Supplier Price File").Range("f2:f" & LastRow_MSF).Find(EANToChk)
    
             If Not UpdateRow Is Nothing Then
                    Match = "Match"
                    foundrow = UpdateRow.Row
                    MatchedEAN = WS_MSF.Range("f" & foundrow).Value
                    Supplier = WS_MSF.Range("c" & foundrow).Value
                    Item = WS_MSF.Range("g" & foundrow).Value
                    ItemDesc = WS_MSF.Range("h" & foundrow).Value
                    NettUnitCost = WS_MSF.Range("m" & foundrow).Value
                    nextUpdateRow = nextUpdateRow + 1
                    WS_RES.Range("a" & nextUpdateRow) = MatchedEAN
                    WS_RES.Range("b" & nextUpdateRow) = Supplier
                    WS_RES.Range("c" & nextUpdateRow) = NettUnitCost
                    WS_RES.Range("d" & nextUpdateRow) = Item
                    WS_RES.Range("e" & nextUpdateRow) = ItemDesc
                    WS_RES.Range("f" & nextUpdateRow) = "EAN"
                    If Match = "Match" Then Exit For
              End If
Next I
'
'Check Part code field
'
If Match = "" Then
For I = LBound(PCode_Split()) To UBound(PCode_Split())
PCodeToChk = PCode_Split(I)

Debug.Print PCodeToChk

Set UpdateRow = Sheets("MASTER - Supplier Price File").Range("f2:f" & LastRow_MSF).Find(PCodeToChk)
    
             If Not UpdateRow Is Nothing Then
                    Match = "Match"
                    foundrow = UpdateRow.Row
                    MatchedEAN = WS_MSF.Range("f" & foundrow).Value
                    Supplier = WS_MSF.Range("c" & foundrow).Value
                    Item = WS_MSF.Range("g" & foundrow).Value
                    ItemDesc = WS_MSF.Range("h" & foundrow).Value
                    NettUnitCost = WS_MSF.Range("m" & foundrow).Value
                    nextUpdateRow = nextUpdateRow + 1
                    WS_RES.Range("a" & nextUpdateRow) = MatchedEAN
                    WS_RES.Range("b" & nextUpdateRow) = Supplier
                    WS_RES.Range("c" & nextUpdateRow) = NettUnitCost
                    WS_RES.Range("d" & nextUpdateRow) = Item
                    WS_RES.Range("e" & nextUpdateRow) = ItemDesc
                    WS_RES.Range("f" & nextUpdateRow) = "PartCode"
                    
                    If Match = "Match" Then Exit For
              End If
              If Match = "" Then
              WS_RES.Range("a" & nextUpdateRow) = MatchedEAN
              WS_RES.Range("g" & nextUpdateRow) = Asin
              WS_RES.Range("f" & nextUpdateRow) = "No Match"
              WS_RES.Range("h" & nextUpdateRow) = WS_ADF.Range("a" & c)
              WS_RES.Range("i" & nextUpdateRow) = WS_ADF.Range("b" & c)
              End If
Next I
End If



Next c
End Sub

相关截图说明

  • 返回值截图:显示Split拆分后,待查找的条码字符串被添加了前导零
  • 待查找值截图:显示目标工作表中存储的原始条码值,无前置零

解决方案

1. 清理拆分后的数据

Split拆分后的元素常带有前后空格,且Excel可能自动为数字补前导零,需先清洗数据:

纯数字条码处理

' 处理EANToChk
EANToChk = Trim(EAN_Split(I)) ' 去除前后空格
EANToChk = CStr(CLng(EANToChk)) ' 转数字再转回字符串,自动去除前导零

' 处理PCodeToChk同理
PCodeToChk = Trim(PCode_Split(I))
PCodeToChk = CStr(CLng(PCodeToChk))

含字母的条码处理(用正则表达式)

需先添加引用:工具 -> 引用 -> Microsoft VBScript Regular Expressions 5.5

Dim regEx As New RegExp
regEx.Pattern = "^0+" ' 匹配开头的所有前导零
PCodeToChk = regEx.Replace(Trim(PCode_Split(I)), "")

2. 优化Find方法参数

默认Find方法易受格式影响,指定参数确保精准匹配:

Set UpdateRow = Sheets("MASTER - Supplier Price File").Range("f2:f" & LastRow_MSF).Find( _
    What:=PCodeToChk, _
    LookIn:=xlValues, _ ' 查找单元格实际值而非格式
    LookAt:=xlWhole, _ ' 完全匹配,避免部分匹配
    MatchCase:=False _
)

3. 替代方案:使用Match函数

Match函数在精准匹配上更稳定,适合数据查找场景:

Dim matchRow As Variant
' 从F2开始查找,匹配类型0表示完全匹配
matchRow = Application.Match(PCodeToChk, Sheets("MASTER - Supplier Price File").Range("f2:f" & LastRow_MSF), 0)
If Not IsError(matchRow) Then
    ' 因为从F2开始,所以实际行号是matchRow+1
    Set UpdateRow = Sheets("MASTER - Supplier Price File").Range("f" & (matchRow + 1))
    ' 后续匹配成功的处理逻辑...
End If

4. 统一单元格格式

确保目标工作表F列设置为文本格式,避免Excel自动转换数字格式,保证查找值与目标值数据类型一致。


内容的提问来源于stack exchange,提问作者craig crowhurst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:19:51