改变格式"部件号"排序问题

时间:2015-08-29 13:45:46

标签: excel vba excel-vba sorting worksheet-function

(当前排序样本:)

2-1203-4
2-1206-3
2CM-
3-1610-1
3-999
…
AR3021-A-7802
AR3021-A-7802-1
B43570-
B43570-3

我正在制作8000多个记录零件清单。我遇到的挑战是,不同的零件制造商正在使用许多不同的格式作为零件编号。 “部件号”是我希望对整个工作表进行排序的字段。 (此工作表中有大约10列数据。)

我攻击此挑战的方法是计算任何“ - ”左侧的字符数,并计算字段中数字字符的总数。 (对于两个计数计算,我还将以非数字字符开头的“部件号”设置为计数值99,这样那些将在数值之后排序。)从这里,我能够对左边的值进行排序“ - ”使用。两个MIN的MIN。 (我的“部件号”在B栏中,我有一个标题行,这意味着我的第一个“部件号”在单元格B2中。)

这种方法达到了一定程度。我的挑战是我需要随后在“ - ”字符后对值进行排序,如错误的“3-1610-1”后面跟着“3-999”所示

我看到的一个限制是使用数据排序排序只提供三列进行排序。要仅对“ - ”左边的字符进行排序,就要花费这三列。因此,我无法重复在“ - ”字符后计算值的整个过程,然后在运行主要排序后使用数据排序进行排序。

是否已经解决了许多不同格式的字段,例如“部件号”?是否有可应用于此挑战的宏?如果是这样,我将非常感谢你的意见。

此数据会使用新的部件号不断更新,因此此处的目标是能够将这些附加部件号添加到工作表的底部,并使用宏来正确使用附加列表。

为了记录,我与我的方法没有结婚。毕竟,它并没有解决我的挑战!

谢谢你, 达雷尔

3 个答案:

答案 0 :(得分:1)

将此程序放在标准代码中:

Public Sub PartNumberSortFormat()
    Dim i&, j&, f, vIn, vOut
    vIn = [b2:index(b:b,match("*",b:b,-1))]
    vOut = vIn
    For i = 1 To UBound(vIn)
        f = Split(Replace(vIn(i, 1), " ", ""), "-")
        For j = 0 To UBound(f)
            If IsNumeric(f(j)) Then
                f(j) = Format$(f(j), "000000")
            Else
                f(j) = String$(6 - Len(f(j)), "0") & f(j)
            End If
        Next
        vOut(i, 1) = Join(f, "-")
    Next
    Columns(1).Insert xlToRight
    [a1] = "SORT COLUMN"
    [a2].Resize(UBound(vOut)) = vOut
    Columns(1).EntireColumn.AutoFit
End Sub

运行此程序后,您会注意到它已在工作表中插入了新的A列,并且您的数据已经向右移动了一列。

此新列A将包含您的部件号的副本,并以这种方式重新格式化以允许正常排序。

现在选择包含此新A列的所有数据,并在A列上对A-Z进行排序。

排序后,您可以删除新列A.

这可以通过将破折号周围的所有字符填充为六个零来实现。

答案 1 :(得分:0)

我的想法:

  1. Excel 2010以后版本允许您使用任意数量的列进行排序。 (不确定2007年)。不知道你有哪个版本!

  2. 您可以使用公式SUBSTITUTE删除所有" - "从零件编号中对剩余的编号进行排序,这样可以为您提供更像您想要的订单。

  3. 例如

    Value = SUBSTITUTE(B2," - ","") 3-15 315 3-888 3888 3-999 3999 3-1610 31610 3-2610 32610 3-1610-1 316101 3-2610-3 326103

    这不完全是你所需要的!

    将此与其他公式(或VBA函数)结合使用,可以操作零件编号,使其更具分类性。

    1. 您可以使用FIND查找第一个" - "的位置。并将之前的数字提取到一列中。

    2. 同样使用FIND,MID和LEN,您可以在第二部分之间提取数字" - "。

    3. 我怀疑是否最好编写一个VBA函数将零件号转换为"可排序值"。这可能会将部件号拆分为它的组件位(即每个位是" - "之间的文本)

      (VBA函数拆分可能对此有用。它会创建一个数组。

      如果您知道可以交付的所有部件号的格式,您可以相应地进行编码。

      我怀疑你的代码会采用类似数字并将其转换为显示

      AB123-456-78 AB12300456007800 AB12-45-7 AB12000450007000 AB12-45 AB12000450000000

      即使用零件填充零件号的每个组件

      将TEXTUAL值排序为您想要的顺序的关键是理解文本值的排序方式!做一些实验。然后创建零(或" 9")填充数字,根据需要对数字进行排序。

      我希望这会有所帮助。

答案 2 :(得分:0)

虽然不是Excel问题的技术答案,但我是一名后勤人员,负责使用非常大的零件号数据集 - 格式各不相同。在我的领域中使用的标准方法是"忽略" (删除)P / N中的特殊字符,并将(干净的)P / N附加到5位CAGE(制造商)代码,以创建一个"唯一的"用于排序,查找等的CAGE +(干净)P / N代码。为该构造创建一列。