在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中只取正值,其中列1具有相同的值(例如,对于1有2个正值,我想以上面显示的格式显示它们)。

我怎样才能使用手动方法(公式)或使用VBA来实现? 我已经写了一个代码,其中column1.value = 1的column1取正值。 但是如何迭代下一个值(即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 

这是一个纯粹的基于公式的方法来解决你的问题。

需要两套公式,第一套从第一列创build不重复的值列表,第二组在第二列中查找并放置正值。

创build不同的列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查找是一个数组公式; 在示例工作表中,将其input到单元格E2(使用CtrlShiftEnter组合键),然后向下复制。

 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),"-") 

在这里输入图像说明

有可能是更短的方式,但这是有效的。 select所需的范围并运行下面的macros:

 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