2015-09-19 46 views
-1

我想从列A中获取唯一值,并在Excel中获取列B中的所有对应值。因此,改造这个:唯一值和CSV列

Image 1

成:

Image 2

是否有可能在Excel中?

+1

[python] or [excel]?可能的重复[集合,整理和转置行到列](http://stackoverflow.com/questions/29440349/aggregate-collat​​e-and-transpose-rows-into-columns) – Jeeped

+0

在Excel中抱歉。我已经尝试过您建议的脚本,但不幸的是我无法为我的需求工作。 – Sam

回答

1

随着Sheet1中这样的数据:

enter image description here

运行此宏:

Sub dural() 
    Dim s1 As Worksheet, s2 As Worksheet 
    Dim i As Long, j As Long, st As String 
    Set s1 = Sheets("Sheet1") 
    Set s2 = Sheets("Sheet2") 
    s1.Range("A:A").Copy s2.Range("A1") 
    s2.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlNo 

    For Each r In s2.Range("A:A") 
     v = r.Value 
     If v = "" Then Exit Sub 
     For Each rr In s1.Range("A:A") 
      vv = rr.Value 
      If vv = "" Then Exit For 
      If v = vv Then 
       If r.Offset(0, 1).Value = "" Then 
        r.Offset(0, 1).Value = rr.Offset(0, 1).Value 
       Else 
        r.Offset(0, 1).Value = r.Offset(0, 1).Value & " ," & rr.Offset(0, 1).Value 
       End If 
      End If 
     Next rr 
    Next r 
End Sub 

会产生这Sheet2中

enter image description here

注:

在工作表Sheet1 不需要进行排序的数据。

+0

完美地工作,谢谢! – Sam

+0

@Sam谢谢您的反馈! –

1

试试这个:

Sub Test() 
    Dim objIds, arrData, i, strId 
    Set objIds = CreateObject("Scripting.Dictionary") 
    arrData = Range("A1:B8").Value ' put here your source range 
    For i = LBound(arrData, 1) To UBound(arrData, 1) 
     If IsEmpty(objIds(arrData(i, 1))) Then 
      objIds(arrData(i, 1)) = arrData(i, 2) 
     Else 
      objIds(arrData(i, 1)) = objIds(arrData(i, 1)) & ", " & arrData(i, 2) 
     End If 
    Next 
    i = 1 ' first row for output 
    For Each strId In objIds 
     Cells(i, 3) = strId ' first column for output 
     Cells(i, 4) = objIds(strId) ' second column for output 
     i = i + 1 
    Next 
End Sub 
1

这是你所需要的,没有什么必须进行排序:

Sub Sam() 
    Dim c&, i&, d$, s$, v, w 
    v = [a1].CurrentRegion.Resize(, 2) 
    ReDim w(1 To UBound(v), 1 To 2) 
    For i = 1 To UBound(v) 
     d = ", " 
     If s <> v(i, 1) Then d = "": c = c + 1: s = v(i, 1): w(c, 1) = s 
     w(c, 2) = w(c, 2) & d & v(i, 2) 
    Next 
    [d1:e1].Resize(UBound(w)) = w 
End Sub 

此代码是非常快的。如果你要处理一个大的列表,效率在这里将不胜感激。

通过调整过程顶部和底部的方括号中的地址,您可以管理源数据的位置和输出的写入位置。

0

看看如何使用Excel公式解决这个问题(我知道OP中有一个VBA标签),但这里有另一种选择。

添加2个附加列中的公式我们得到这样的结果:

enter image description here

通过在finalList列中的值= 1我们得到所期望的结果进行滤波:

enter image description here

所需公式如下:

单元格C1:= B2

小区C2(和向下复制到在列C中的所有细胞):= IF(A3 = A2,C2 & “” & B3,B3)

细胞D1(和向下复制到在列中的所有单元D):= IF(A2 = A3,0,1)

注意:这只适用于列A排序。