排列数据的两个维度

时间:2013-08-22 18:16:11

标签: excel excel-formula pivot-table worksheet-function unpivot

我有两个维度的数据集,如下所示:

      A     B     C

 A    -     9     4

 B    24    -     13

 C    3     12    -

它表示两个实体之间的关系。我想返回列出的那些值列表,例如:

AB:4
AC:5
BA:1
BC:2
CA:6
CB:3

有关最佳方法的任何想法吗?

2 个答案:

答案 0 :(得分:2)

创建源矩阵的副本,假设布局如下,

=IFERROR(RANK(B2,$B$2:$D$4),"")  
G2中的

向下复制到I4。从您的排名的2D版本创建具有多个合并范围的数据透视表(“反向枢轴” - 可能 Alt + D,P)。双击Total s相交。如果将结果复制回源表,如下(为方便起见),在U2中添加=Q2&R2&": "&S2(或相应调整)并复制以适应:

SO18387948 example

可能更适合更大的数据集!

答案 1 :(得分:0)

您还可以使用VBA从摘要表创建一个平面表。从那时起,使用CONCATENATERANK可以很容易地根据数值对对进行排序。

我们假设这是你的起点:

enter image description here

以下是将此数据透视表转换为平面表的VBA代码: (转到开发人员标签 - > Visual Basic - > 插入 - > 模块 - >在此处复制粘贴代码

然后点击运行(绿色播放标志)

 Sub ReversePivotTable()
 '   Before running this, make sure you have a summary table with column headers.
 '   The output table will have three columns.
     Dim SummaryTable As Range, OutputRange As Range
     Dim OutRow As Long
     Dim r As Long, c As Long
     On Error Resume Next
     Set SummaryTable = ActiveCell.CurrentRegion
     With SummaryTable
          r = Application.Match("Totals", Columns(1), False)
         c = Application.Match("Total", Rows(1), False)
     End With
     Set SummaryTable = SummaryTable.Resize(r - 1, c - 1)
     MsgBox SummaryTable.Address
     If SummaryTable.Count = 1 Or SummaryTable.Rows.Count < 3 Then
         MsgBox "Select a cell within the summary table.", vbCritical
         Exit Sub
     End If
     SummaryTable.Select
     Set OutputRange = Application.InputBox(prompt:="Select a cell for the 3-column output", Type:=8)
 '   Convert the range
     OutRow = 2
     Application.ScreenUpdating = False
     OutputRange.Range("A1:C3") = Array("Column1", "Column2", "Column3")
     For r = 2 To SummaryTable.Rows.Count
         For c = 2 To SummaryTable.Columns.Count
             OutputRange.Cells(OutRow, 1) = SummaryTable.Cells(r, 1)
             OutputRange.Cells(OutRow, 2) = SummaryTable.Cells(1, c)
             OutputRange.Cells(OutRow, 3) = SummaryTable.Cells(r, c)
             OutputRange.Cells(OutRow, 3).NumberFormat = SummaryTable.Cells(r, c).NumberFormat
             OutRow = OutRow + 1
         Next c
     Next r
 End Sub

你会得到一张这样的平台:

enter image description here

然后,使用CONCATENATERANK获取一对对和列。

enter image description here

这将是最终结果:

enter image description here