我有一组二维数据,如下所示:
A B C
A - 9 4
B 24 - 13
C 3 12 -
它表示两个实体之间的关系。我想返回这些值的列表,例如:
AB:4 交流电:5 巴:1 公元前:2 加州:6 CB:3
对解决此问题的最佳方法有任何想法吗?
我有一组二维数据,如下所示:
A B C
A - 9 4
B 24 - 13
C 3 12 -
它表示两个实体之间的关系。我想返回这些值的列表,例如:
AB:4 交流电:5 巴:1 公元前:2 加州:6 CB:3
对解决此问题的最佳方法有任何想法吗?
假设布局如下,创建源矩阵的副本,
=IFERROR(RANK(B2,$B$2:$D$4),"")
在 G2 中向下复制到 I4。从您的排名的这个 2D 版本创建一个具有多个合并范围的数据透视表(“反向数据透视” - 可能Alt是 +D、P)。双击Total
s 相交。如果将结果复制回源表,如下所示(为方便起见),请添加=Q2&R2&": "&S2
U2(或相应调整)并向下复制以适应:
可能更适合更大的数据集!
您还可以使用 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
andRANK
得到一列对和等级。
这将是最终结果: