首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Excel中使用重复数据创建行

在Excel中使用重复数据创建行
EN

Stack Overflow用户
提问于 2015-06-15 17:45:16
回答 1查看 56关注 0票数 0

所以我需要做一个工作表来上传一些产品,其中一些产品是分组产品。要使我的导入器工作,我需要获取这些分组的产品,并为它们创建一个新行。所有分组的ids都在与非分组的ids混合的列中。我还有一个包含各个ids的列。

示例数据ids和分组ids列:

代码语言:javascript
运行
复制
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被广泛使用,我在所有的垃圾中找不到真正的解决方案。

对于每个示例,工作表末尾的输出可能如下所示:

代码语言:javascript
运行
复制
"AR1424", "AR1424-03, AR1424-07"
"AR1618", "AR1618-03, AR1618-14"
"AR1800", "AR1800-03, AR1800-04, AR1800-05, AR1800-10, AR1800-48" 
EN

回答 1

Stack Overflow用户

发布于 2015-06-17 00:42:07

如果你想用VBA而不是公式来做这件事,这里有一种方法,它在每个唯一的条目上使用AutoFilter,然后将可见的单元格处理到另一个工作表上。范围和名称是特定于上述应用程序的,但可以根据需要进行更改。

代码

代码语言:javascript
运行
复制
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将所有单元格连接在一起,或者将其输出到不同的列(当前已注释掉)。

之前和之后的图片(在新的页面上)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30842042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档