2013-08-05 29 views
1

想,我有數據組值在Excel中根據重複的值列

Column1  Column2 
1   1000 
1   -2000 
1   3000 
2   2000 
2   -1000 
3   5000 
3   -4000

我要像

Column1 Column2 Column3 
1   1000  3000 
2   2000 
3   5000

我想從列2只取正值,顯示它在那裏COLUMN1具有相同值(例如對於1有2個正值,我想以上面顯示的格式顯示它們)。

如何使用手動方法(公式)或使用VBA實現此操作? 我寫了一個代碼,其中column1取值爲1,其中column1.value = 1。但是,如何迭代下一個值(即2和3)

Sheets("Sheet1").Select 
myvalue = Cells(2, 1).Value 
MsgBox myvalue 


Dim negativevalue(0 To 10) As Long 
Dim colum As Integer 
Dim row As Integer 

colum = 1 
row = 2 
i = 0 
While Cells(row, colum).Value = myvalue 
If (Cells(row, 2).Value < 0) Then 

MsgBox Cells(row, 2).Value 
negativevalue(i) = Cells(row, 2).Value 


End If 
+2

有你嘗試與錄製宏工具什麼?你嘗試過什麼公式?您需要顯示您嘗試的內容,以便我們可以幫助您解決所遇到的特定問題。 – chancea

+0

數據透視表的數據透視表出現了什麼問題,列出了負值,column1是行,column2是列,column2是數據總和? – Aprillion

+0

@Suresh Jambhalkar,該代碼應該包含在您的問題中,並且更易於閱讀。 – neizan

回答

2

這裏是一個純粹的基於公式的方法來解決您的問題。

需要兩套式中,所述第一組,從第1列和所述第二組創建不同的值不重複的列表來查找並放置正值在塔2

的公式來創建不同的列1值的列表放置在單元格D2中並在該列下複製。該公式使用列1值的命名範圍。如果將它放在另一列中,請將$D1$D:D1調整爲您正在使用的列,並確保它指向放置公式的單元格上方的單元格。例如,如果你把公式中細胞C4,式中的列引用應該是$C$3:C3

Formula to create list of distinct values from column 1 
Cell D2 =IFERROR(INDEX(Column1,MATCH(0,INDEX(COUNTIF($D$1:D1,Column1), 
      0,0),0)),"-") 

列2查找是一個數組公式;在示例工作表中,它被輸入到單元格E2中(使用Ctrl - Shift - 輸入組合鍵),然後向下複製。

Array Formula to lookup and place column 2 values 
Cell E2 =IFERROR(INDEX(Column2,1/LARGE(IFERROR(1/((Column1=$D2)* 
      (Column2>=0)*ROW(INDIRECT("1:"&COUNTA(Column2)))),0), 
      COLUMNS($E$2:E$2)),1),"-") 

enter image description here

2

可能有更短的方法,但這是有效的。選擇所需的範圍並運行以下宏:

Sub ProcessData() 
    'Sort the data 
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Selection.Cells(1, 1), _ 
     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    With ActiveWorkbook.Worksheets("Sheet1").Sort 
     .SetRange Selection 
     .Header = xlNo 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

    'Process data 
    Dim cl As Object, r As Integer, c As Integer, cNum As Integer, cSt As Integer 
    Dim first As Boolean, update As Boolean 
    r = Selection.Cells(1, 1).Row - 1 
    cNum = Selection.Cells(1, 2).Column + 2 
    cSt = cNum + 1 
    first = True 
    update = False 

    For Each cl In Selection.Cells.Columns(1).Cells 
     If cl.Offset(0, 1).Value >= 0 Then 
      update = False 
      If first Then 
       first = False 
       update = True 
      ElseIf cl.Value <> Cells(r, cNum).Value Then 
       update = True 
      End If 
      If update Then 
       r = r + 1 
       c = cSt 
       Cells(r, cNum).Value = cl.Value 
      End If 
      Cells(r, c).Value = cl.Offset(0, 1).Value 
      c = c + 1 
     End If 
    Next 
End Sub 
+0

你的解決方案工作得很好。謝謝。你能提出一些修改我寫的代碼嗎? –

+0

你必須用另一個'while'循環或'for'循環等來包裝你的'while'循環,並且在內循環退出時改變'myValue'變量。有無數的方法可以達到相同的目的,但爲什麼不只是使用我的答案或@ chuff的,如果它適合你。 – neizan

+0

謝謝。我會繼續解決您的問題 –