我有两个维度的数据集,如下所示:
A B C
A - 9 4
B 24 - 13
C 3 12 -
它表示两个实体之间的关系。我想返回列出的那些值列表,例如:
AB:4 AC:5 BA:1 BC:2 CA:6 CB:3
有关最佳方法的任何想法吗?
答案 0 :(得分:2)
创建源矩阵的副本,假设布局如下,
=IFERROR(RANK(B2,$B$2:$D$4),"")
G2中的向下复制到I4。从您的排名的2D版本创建具有多个合并范围的数据透视表(“反向枢轴” - 可能 Alt + D,P)。双击Total
s相交。如果将结果复制回源表,如下(为方便起见),在U2中添加=Q2&R2&": "&S2
(或相应调整)并复制以适应:
可能更适合更大的数据集!
答案 1 :(得分:0)
您还可以使用VBA从摘要表创建一个平面表。从那时起,使用CONCATENATE
和RANK
可以很容易地根据数值对对进行排序。
我们假设这是你的起点:
以下是将此数据透视表转换为平面表的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
你会得到一张这样的平台:
然后,使用CONCATENATE
和RANK
获取一对对和列。
这将是最终结果: