在Excel电子表格中对值进行排序

时间:2012-12-21 20:28:47

标签: excel excel-formula

我有一个充满姓名和人物角色的电子表格,如下所示:

Role Name  Change
1     A     Yes
2     A     No
5     A     N/Ap
1     B     Yes
3     B     No
2     C     Yes
4     C     No

我必须提出如下所示的电子表格:

     1        2        3        4        5        6
A   Yes                     
B                       
C                       

基本上,它应该从第一个电子表格中检索信息,并在第二个电子表格中清楚地列出。

手动执行此操作的名称和角色太多了。 VLMOVE无效,我已尝试MATCHINDEX

5 个答案:

答案 0 :(得分:2)

同意@Melanie,如果您可以将数据强制转换为可以解释为数字的结构(例如,1表示是,0表示为假),则数据透视表是最简单的方法(因为它们将显示)数字作为值 - 而不是文本)。 *(见下文)

如果您想显示任意文字,可以试试这个:

=IF(
    SUMPRODUCT(--($A$2:$A$8=F$1),--($B$2:$B$8=$E2),ROW($A$2:$A$8))=0,"",
    INDEX(
        $A$1:$C$8,
        SUMPRODUCT(--($A$2:$A$8=F$1),--($B$2:$B$8=$E2),ROW($A$2:$A$8)),
        3))

这将检查三列中的SUMPRODUCT是否总计为0(这将在没有匹配x / y的组合时发生(例如Name: CRole: 5) ,如果是,则返回""。否则,它返回Value列中的值。

enter image description here



*'数据透视表选项'将表示更改为数字(例如,将D2中的公式复制下来)。然后从(在示例中)A1:D8创建一个数据透视表,其中的字段如图所示。使用“粘贴特殊值/值”将数据透视表复制到另一个工作表(尽管在F11中显示:示例中为同一工作表的K15)。然后在那个以名称A开头并且根据需要向下的其他工作表选择行中,将-1替换为否,将1替换为是,将0替换为N / Ap。

enter image description here

答案 1 :(得分:2)

替代@RocketDonkey(但感谢更完整的预期结果!)可以将角色和名称串起来(比如在Sheet1中插入B& C之间的列中[因为我认为OP想要一个单独的表格用于结果]):

C2=A1&B2  copied down as required

然后在Sheet2中使用查找!B2:

=IFERROR(VLOOKUP(B$1&$A2,Sheet1!$C$2:$D$8,2,FALSE),"")  

根据需要反复复制。

这假定已经构建了结果的网格(如有问题)(并且有7行数据 - 否则需要调整8美元。)

答案 2 :(得分:1)

如果没有VBA,还有另一种方法可以解决这个问题。如果您创建另一列连接第一个电子表格中的前两个,如下所示:

Role Name  Change  CheckColumn
1     A     Yes    1A
2     A     No     2A
5     A     N/Ap   5A
1     B     Yes    1B
3     B     No     3B
2     C     Yes    2C
4     C     No     4C

然后,您可以同时使用OffsetMatch函数来查找第二张表中的更改。因此,假设您的数据是从单元格A1中放置的,则单元格B2中的公式将为:

=iferror(offset(Sheet1!$A$1,match(B$1&$A2,sheet1!$D:$D,0),2),"")

或者,如果在角色列之前将连续列放在sheet1中,则可以在sheet2中使用vlookup,其公式为:

=iferror(vlookup(B$1&$A2,sheet1!$A:$D,4,false),"")

答案 3 :(得分:1)

修订

您可以使用数组公式重新组织表,而无需更改其结构。假设数据在Sheet1上的A2:C8范围内,结果表在Sheet2的范围A1:G4中,下面的公式将是结果表中的第一个条目(角色1和名称A)。

   =IFERROR(INDEX(Sheet1!$A$2:$C$8,MATCH(B$1&$A2,Sheet1!$A$2:$A$8&Sheet1!$B$2:$B$8,0),3),"-")

MATCH公式返回角色/名称组合1A出现的行号。 INDEX函数返回由MATCH公式和列号3找到的行号的单元格内容,即数据表的“更改”列。如果角色/名称组合不在数据表中,则IFERROR返回“ - ”。

请务必使用Control-Shift-Enter组合键输入公式。然后将公式复制到结果表的其余单元格中。

Sheet1上的数据表:

data table on Sheet1

Sheet2上的结果表:

result table on Sheet

答案 4 :(得分:1)

好了,因为有Excel-VBA标签,认为它会通过在VBA中添加一个来完成解决方案类型:)以下代码不优雅,无论如何你需要使用代码库,试一试:)

代码:

Option Explicit

Public Sub sortAndPivot()
Dim d As Object
Dim ws As Worksheet
Dim sourceArray As Variant, pvtArray As Variant, v As Variant
Dim maxRole As Long
Dim i, j, k, m As Integer

    Set d = CreateObject("Scripting.Dictionary")
    Set ws = Worksheets("Sheet3") '-- set according to your sheet
    '-- you could enhance by using an input box to select the range
    sourceArray = Application.WorksheetFunction.Transpose(ws.Range("B3:D9").Value)
    '-- max role number
    maxRole = Application.WorksheetFunction.Max(ws.Range("B3:B9"))

    '-- find unique name list
    For i = LBound(sourceArray, 2) To UBound(sourceArray, 2)
        If Not d.exists(sourceArray(2, i)) Then
            d.Add sourceArray(2, i), i
        End If
    Next i

    ReDim pvtArray(d.Count, maxRole)
    pvtArray(0, 0) = "Name"

    '-- add unique names from dictionary
    j = 1
    For Each v In d.keys
        pvtArray(j, 0) = v
        j = j + 1
    Next

    '-- add unique Role number list
    For i = UBound(pvtArray, 2) To LBound(pvtArray) + 1 Step -1
        pvtArray(0, i) = i
    Next i

    '-- sort into the correct positions
    For k = LBound(pvtArray, 1) + 1 To UBound(pvtArray, 1)
        For m = LBound(pvtArray, 2) + 1 To UBound(pvtArray, 2)
            For i = LBound(sourceArray, 2) To UBound(sourceArray, 2)
                If pvtArray(k, 0) = sourceArray(2, i) Then
                    If pvtArray(0, m) = sourceArray(1, i) Then
                        pvtArray(k, m) = sourceArray(3, i)
                    End If
            End If
        Next i
        Next m
    Next k

    'Output the processed array into the Sheet in pivot view.
    Range("F2").Resize(UBound(pvtArray) + 1, _
    UBound(Application.Transpose(pvtArray))) = pvtArray

    Set d = Nothing
End Sub

结果:

enter image description here