根据列中的重复值对excel中的值进行分组

根据列中的重复值对excel中的值进行分组,excel,vba,Excel,Vba,假设我有数据 Column1 Column2 1 1000 1 -2000 1 3000 2 2000 2 -1000 3 5000 3 -4000 第1栏第2栏 1 1000 1 -2000 1 3000 2 2

假设我有数据

Column1 Column2 1 1000 1 -2000 1 3000 2 2000 2 -1000 3 5000 3 -4000 第1栏第2栏 1 1000 1 -2000 1 3000 2 2000 2 -1000 3 5000 3 -4000 我想把它展示得像

Column1 Column2 Column3 1 1000 3000 2 2000 3 5000 第1栏第2栏第3栏 1 1000 3000 2 2000 3 5000 我只希望从第2列中获取正值,其中第1列具有相同的值(例如,对于第1列,有2个正值。我希望以上面所示的格式显示它们。)

如何使用手动方法(公式)或VBA实现这一点?? 我已经编写了一个代码,其中它从column1获取正值,column1.value=1。但是如何迭代下一个值(即2和3)

Sheets(“Sheet1”)。选择
myvalue=单元格(2,1)。值
MsgBox myvalue
变暗负片值(0到10)的长度为
作为整数的Dim column
将行设置为整数
柱=1
行=2
i=0
而单元格(行,列).Value=myvalue
如果(单元格(第2行)。值<0),则
MsgBox单元格(第2行).值
negativevalue(i)=单元格(第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
子进程数据()
“对数据进行排序
ActiveWorkbook.Worksheets(“Sheet1”).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(“Sheet1”).Sort.SortFields.Add Key:=Selection.Cells(1,1)_
SortOn:=xlSortOnValues,顺序:=XLASSENDING,数据选项:=xlSortNormal
使用ActiveWorkbook.Worksheets(“Sheet1”).Sort
.设置范围选择
.Header=xlNo
.方向=xlTopToBottom
.SortMethod=xl拼音
申请
以
“过程数据
Dim cl作为对象,r作为整数,c作为整数,cNum作为整数,cSt作为整数
首先将变暗为布尔值,然后更新为布尔值
r=选择。单元格(1,1)。行-1
cNum=选择。单元格(1,2)。列+2
cSt=cNum+1
第一个=正确
更新=错误
对于Selection.Cells.Columns(1.Cells)中的每个cl
如果cl.Offset(0,1).Value>=0,则
更新=错误
如果首先
第一个=错误
update=True
ElseIf cl.值单元格(r,cNum)。然后计算值
update=True
如果结束
如果更新,则
r=r+1
c=cSt
单元格(r,cNum).值=cl.值
如果结束
单元格(r,c).Value=cl.Offset(0,1).Value
c=c+1
如果结束
下一个
端接头

可能有更短的方法,但这是可行的。选择所需范围并运行以下宏:

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
子进程数据()
“对数据进行排序
ActiveWorkbook.Worksheets(“Sheet1”).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(“Sheet1”).Sort.SortFields.Add Key:=Selection.Cells(1,1)_
SortOn:=xlSortOnValues,顺序:=XLASSENDING,数据选项:=xlSortNormal
使用ActiveWorkbook.Worksheets(“Sheet1”).Sort
.设置范围选择
.Header=xlNo
.方向=xlTopToBottom
.SortMethod=xl拼音
申请
以
“过程数据
Dim cl作为对象,r作为整数,c作为整数,cNum作为整数,cSt作为整数
首先将变暗为布尔值,然后更新为布尔值
r=选择。单元格(1,1)。行-1
cNum=选择。单元格(1,2)。列+2
cSt=cNum+1
第一个=正确
更新=错误
对于Selection.Cells.Columns(1.Cells)中的每个cl
如果cl.Offset(0,1).Value>=0,则
更新=错误
如果首先
第一个=错误
update=True
ElseIf cl.值单元格(r,cNum)。然后计算值
update=True
如果结束
如果更新,则
r=r+1
c=cSt
单元格(r,cNum).值=cl.值
如果结束
单元格(r,c).Value=cl.Offset(0,1).Value
c=c+1
如果结束
下一个
端接头

以下是一种纯粹基于公式的方法来回答您的问题

需要两组公式,第一组用于创建第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),"-")

以下是一种纯粹基于公式的方法来回答您的问题

需要两组公式,第一组用于创建第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),"-")

您是否尝试过使用录制宏工具进行任何操作?你试过什么配方?您需要显示您尝试了什么,以便我们可以帮助您解决遇到的特定问题。使用筛选的Pivot表有什么问题