2015-09-19 49 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排序。