VBA脚本将重复数据合并为一行

时间:2016-05-31 11:42:07

标签: vba sorting row

我正在尝试编写一个脚本,给定一个部件列表及其使用过的数字,将所有重复部分的用过的值组合起来并对结果值进行排序。这听起来令人困惑,所以这里是我正在拍摄的照片:

Desired Result

它应该能够处理重复和空白。

通过研究和修补的组合,我得到了一个sortWithinCell函数,但是我的头痛来自编写脚本来迭代部分列表,结合使用过的值,然后在达到不同的部件号时,删除除了您开始的第一行以外的所有部分,然后继续。假设输入部件列表已按部件号排序。

全部谢谢!

-Edit 1 -

我确实设法找到了一种组合数据值的方法:

函数ConcatinateAllCellValuesInRange(sourceRange as Excel.Range)As String     Dim finalValue As String

Dim cell As Excel.Range

For Each cell In sourceRange.Cells
    finalValue = finalValue + "," + CStr(cell.Value)
Next cell

ConcatinateAllCellValuesInRange = Right(finalValue, Len(finalValue) - 1)

结束功能

但是,现在技巧仍然是确定此功能的输入范围,即当部件号改变时。

1 个答案:

答案 0 :(得分:0)

可能的解决方案是创建一个集合,该集合使用Part作为Key并将Used-On值作为值,因此在Part的第一次出现时,添加KeyValue对,然后在正在进行的循环中,如果密钥已经存在于集合中,获取密钥的值和集合中的值,将它们合并在一起,删除当前的KeyValue对并​​添加一个新的(您不能修改集合的KeyValue对,因此删除旧的并添加一个新的。)

如果您完成了列表的循环,则可以遍历集合中的元素并将其保存在工作表上的其他位置。或者,如果需要,删除当前范围并插入旧值所在的所有内容。

如果您需要帮助,请告诉我

修改

这是我描述的方法的一个示例,虽然我使用了Dictionary而不是Collection,因为它具有更多功能(需要参考" Microsoft Scripting Runtime"):

Option Explicit

Sub combineStuff()

    'Create Dictionary
    Dim tmpDic As New Dictionary

    'tempstring to preserve the value of a key
    Dim tmpValue As String


    Dim i As Integer

    'Loop through rows - change this to your needs
    For i = 1 To 15 Step 1

        'Simple check if "Part" and "Used-On" are both filled
        If Cells(i, 1).Value <> "" And Cells(i, 2).Value <> "" Then

            'Check if the Key already exists
            If tmpDic.Exists(CStr(Cells(i, 1).Value)) Then

                'If it does, save it's value
                tmpValue = tmpDic.Item(CStr(Cells(i, 1).Value))

                'Delete the Key Value pair
                tmpDic.Remove CStr(Cells(i, 1).Value)

                'Add Key Value pair with updated Value
                tmpDic.Add CStr(Cells(i, 1).Value), tmpValue & "," & CStr(Cells(i, 2).Value)
            Else

                'Key does not exist yet, add it
                tmpDic.Add CStr(Cells(i, 1).Value), Cells(i, 2).Value
            End If
        End If
    Next i

    Dim tmpKey As Variant
    i = 1

    'Loop through all items in the Dictionary
    For Each tmpKey In tmpDic

        'Insert Key
        Cells(i, 4).Value = tmpKey

        'Insert Value
        Cells(i, 5).Value = tmpDic(tmpKey)
        i = i + 1
    Next tmpKey

End Sub

请注意,字典不会被排序!最后修改的密钥是列表中的最后一个密钥。如果要对结果进行排序,最好使用多维数组来存储键和值对。然后你可以轻松地对它们进行排序。