所以我需要做一个工作表来上传一些产品,其中一些产品是分组产品。要使我的导入器工作,我需要获取这些分组的产品,并为它们创建一个新行。所有分组的ids都在与非分组的ids混合的列中。我还有一个包含各个ids的列。
示例数据ids和分组ids列:
AR1249-16 AR1249
AR1253-16 AR1253
AR1359-04 AR1359
AR1373-18 AR1373
AR1424-03 AR1424
AR1424-07 AR1424
AR1454-16 AR1454
AR1470-01 AR1470
AR1507-03 AR1507
AR1511-16 AR1511
AR1531-03 AR1531
AR1576-03 AR1576
AR1578-03 AR1578
AR1589-03 AR1589
AR1618-03 AR1618
AR1618-14 AR1618
AR1630-06 AR1630
AR1682-06 AR1682
AR1696-03 AR1696
AR1732-03 AR1732
AR1800-03 AR1800
AR1800-04 AR1800
AR1800-05 AR1800
AR1800-10 AR1800
AR1800-48 AR1800
AR1803-16 AR1803
AR1804-03 AR1804
AR1804-04 AR1804
AR1804-05 AR1804
AR1804-10 AR1804
AR1804-48 AR1804
AR1804-06 AR1804
问题:我想要做的是在Excel中使用一些排序或过滤函数来读取此列,查找分组ids中的重复项,并使用这些分组产品的单个ids创建一个新行。
我到处寻找可能的解决方案,但由于Excel被广泛使用,我在所有的垃圾中找不到真正的解决方案。
对于每个示例,工作表末尾的输出可能如下所示:
"AR1424", "AR1424-03, AR1424-07"
"AR1618", "AR1618-03, AR1618-14"
"AR1800", "AR1800-03, AR1800-04, AR1800-05, AR1800-10, AR1800-48"
发布于 2015-06-17 00:42:07
如果你想用VBA而不是公式来做这件事,这里有一种方法,它在每个唯一的条目上使用AutoFilter
,然后将可见的单元格处理到另一个工作表上。范围和名称是特定于上述应用程序的,但可以根据需要进行更改。
代码
Sub GroupByCommonValue()
Dim rng_all As Range
Set rng_all = Intersect(Range("B:B"), ActiveSheet.UsedRange)
Dim rng_data As Range
Set rng_data = Intersect(rng_all, rng_all.Offset(1))
'create output sheet
Dim sht_out As Worksheet
Set sht_out = Worksheets.Add()
sht_out.Range("A1") = "GROUP"
sht_out.Range("B1") = "IDs"
Dim rng_out As Range
Set rng_out = sht_out.Range("A2")
Dim rng As Range
For Each rng In rng_data
'skip duplicates
If Application.WorksheetFunction.CountIf(rng_out.EntireColumn, rng.Value) = 0 Then
rng_all.AutoFilter Field:=1, Criteria1:=rng.Value
Dim arr As Variant
arr = rng_data.Offset(, -1).SpecialCells(xlCellTypeVisible).Value
rng_out = rng.Value
If TypeName(arr) <> "Variant()" Then
rng_out.Offset(, 1) = arr
Else
arr = Application.Transpose(arr)
'top line will concatenate / lower will create column for each
rng_out.Offset(, 1) = Join(arr, ", ")
'rng_out.Offset(, 1).Resize(1, UBound(arr)).Value = arr
End If
Set rng_out = rng_out.Offset(1)
End If
Next
rng_all.Parent.AutoFilterMode = False
End Sub
关于代码的几个注释
在执行过滤器之前,
WorksheetFunction.CountIf
检查该值是否出现在输出表上。避免额外的work.SpecialCells
仅返回可见的单元格。如果有多个值,那么Value
将返回一个Variant()
数组。如果不是该类型,则只有一个单元格要移动。Join
将所有单元格连接在一起,或者将其输出到不同的列(当前已注释掉)。之前和之后的图片(在新的页面上)
https://stackoverflow.com/questions/30842042
复制相似问题