Excel中的组值根据列中的重复值

时间:2013-08-05 14:12:24

标签: excel excel-vba vba

假设我有数据

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  

我想从column2中只取正值,其中column1具有相同的值(例如,1表示2个正值。我想以上面显示的格式显示它们。)

如何使用手动方法(公式)或使用VBA来实现这一目标? 我编写了一个代码,它从column1获取正值,其中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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 - Enter 组合键),然后向下和向下复制。

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