我正在尝试编写一个脚本,给定一个部件列表及其使用过的数字,将所有重复部分的用过的值组合起来并对结果值进行排序。这听起来令人困惑,所以这里是我正在拍摄的照片:
它应该能够处理重复和空白。
通过研究和修补的组合,我得到了一个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)
结束功能
但是,现在技巧仍然是确定此功能的输入范围,即当部件号改变时。
答案 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
请注意,字典不会被排序!最后修改的密钥是列表中的最后一个密钥。如果要对结果进行排序,最好使用多维数组来存储键和值对。然后你可以轻松地对它们进行排序。