使用开头的5位订单ID将15位订单号拉到新列

时间:2015-09-01 23:46:49

标签: excel vba excel-vba formula

我有两列(B& C)订单数据,其中包含多种字母和数字组合,可能包含也可能不包含以不同方式混合在单元格中的特定15位数订单号。订单号可以是单元格的左中间或右侧。所有订单号都有一个特定的5位数标识符(总共75个唯一的标识符),用于启动每个订单号。 5位数字标识符和完整15位订单ID的示例

  • 12018 12018 0000000852
  • 38003 38003 0000003456
  • C0009 C0009 0000087652
  • P0009 P0009 0000378464
  • A0010 A0010 0000456321

使PO编号难以获取的单元格值示例,某些单元格包含不可用的部分订单编号以及可能小于或短于15位的随机文本或数字字符串

  • 540501 /的 12018 0000000852
  • BO A0010 0000456321 8054960602
  • 86790865 / / 38003 0000003456
  • DSA1491799-000
  • 38003 0000056

我的最终目标是让一个列只列出从B和C中提取的15位数订单号,或多或少只是空白。使用所有75个唯一5位数订单ID的列有助于提取订单数据。

1 个答案:

答案 0 :(得分:1)

使用Z列中的“5位数字标识符”(从第2行开始)和A列中的“完整15位数订单ID”,从第2行开始,B列中未使用的列,打开VBE并粘贴以下链接到新的模块代码表。

Sub digit_identifiers()
    Dim r As Long, v As Long, vDIDs As Variant, vDOIDs As Variant

    With Worksheets("Sheet1")  '<~~set this worksheet properly!!
        vDIDs = .Range(.Cells(2, "Z"), .Cells(Rows.Count, "Z").End(xlUp)).Value2
        vDOIDs = .Range(.Cells(2, "A"), .Cells(Rows.Count, "A").End(xlUp)).Value2
        .Range(.Cells(2, "B"), .Cells(Rows.Count, "B").End(xlUp)).NumberFormat = "[color13]@"

        For r = LBound(vDOIDs, 1) To UBound(vDOIDs, 1)
            For v = LBound(vDIDs, 1) To UBound(vDIDs, 1)
                If CStr(vDOIDs(r, 1)) Like Chr(42) & CStr(vDIDs(v, 1)) & Chr(42) Then
                    'full 15 digit order ID
                    .Cells(1 + r, "B") = CStr(Mid(CStr(vDOIDs(r, 1)), InStr(1, CStr(vDOIDs(r, 1)), CStr(vDIDs(v, 1)), vbTextCompare), 15))
                    'alternate for just the 5 digit identifier
                    '.Cells(1 + r, "B") = CStr(vDIDs(v, 1))
                    Exit For
                End If
            Next v
        Next r
    End With
End Sub

点击 Alt + Q 返回工作表,然后 Alt + F8 运行宏。您的结果应类似于以下内容。

Pattern matching variant strings

将“5位数字标识符”放入Z列的顺序可能会对结果产生影响。如果'38003`在结果应为'C0009'时可能产生误报匹配,请确保'C0009'在订单中位于'38003'之前。