emm*_*mby 39 excel vba excel-vba
我有一个二维表,包含Excel中的国家和年份.例如.
1961 1962 1963 1964
USA a x g y
France u e h a
Germany o x n p
Run Code Online (Sandbox Code Playgroud)
我想"扁平"它,这样我在第一个col中有Country,在第二个col中有Year,然后在第三个col中有值.例如.
Country Year Value
USA 1961 a
USA 1962 x
USA 1963 g
USA 1964 y
France 1961 u
...
Run Code Online (Sandbox Code Playgroud)
我在这里给出的例子只是一个3x4矩阵,但我拥有的真实数据集要大得多(大约50x40左右).
有关如何使用Excel执行此操作的任何建议吗?
Ada*_*vis 36
您可以使用excel数据透视表功能来反转数据透视表(这基本上就是您在此处所拥有的):
这里有好的指示:
http://spreadsheetpage.com/index.php/tip/creating_a_database_table_from_a_summary_table/
如果您不想手动按照说明操作,请链接到以下VBA代码(将其放入模块中):
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
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
Run Code Online (Sandbox Code Playgroud)
-亚当
Mic*_*oie 17
@Adam Davis的答案是完美的,但为了防止你像我对Excel VBA一样无能为力,这就是我在Excel 2007中使用代码所做的工作:
你完成了!第一列是行,第二列是列,第三列是数据.
vla*_*mir 10
在Excel 2013中需要按照以下步骤操作:
支持Office:Unpivot列(Power Query)
小智 5
平坦化数据矩阵(又名表)可以与一个阵列formula¹和两个标准公式来完成.
数组公式¹和G3中的两个标准公式:I3是,
=IFERROR(INDEX(A$2:A$4, MATCH(0, IF(COUNTIF(G$2:G2, A$2:A$4&"")<COUNT($1:$1), 0, 1), 0)), "")
=IF(LEN(G3), INDEX($B$1:INDEX($1:$1, MATCH(1E+99,$1:$1 )), , COUNTIF(G$3:G3, G3)), "")
=INDEX(A:J,MATCH(G3,A:A,0),MATCH(H3,$1:$1,0))
Run Code Online (Sandbox Code Playgroud)
必要时填写.
虽然阵列公式可能会因循环计算而对性能产生负面影响,但您所描述的40行×50列的工作环境不应过度影响性能和计算滞后.
¹ 数组公式需要用Ctrl+ Shift+ 完成Enter↵.一旦正确进入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们.尝试并减少对列表的全列引用,这些范围更接近地表示实际数据的范围.数组公式以对数方式计算计算周期,因此将参考范围缩小到最小值是一种好习惯.有关更多信息,请参阅数组公式的指南和示例.
| 归档时间: |
|
| 查看次数: |
55713 次 |
| 最近记录: |