实例需求:将工作表中的数据(多维度交叉),对日期进行逆透视,转换为下表的格式。
示例代码如下。
Sub UnpivotTable()Dim oSht As WorksheetDim inLastRow As Long, inLastCol As LongDim outLastRow As Long, outCol As LongDim iRow As Long, iCol As LongConst FIX_COLS = 4Const HEADER_FLD = "Date"Const VALUE_FLD = "Value"Set oSht = Sheet("Data")With oShtinLastRow = .Cells(.Rows.Count, "A").End(xlUp).rowinLastCol = .Cells(1, .Columns.Count).End(xlToLeft).ColumnoutLastRow = inLastRow + 2.Cells(outLastRow, 1).Resize(1, FIX_COLS).Value = .Cells(1, 1).Resize(1, FIX_COLS).Value.Cells(outLastRow, FIX_COLS + 1).Value = HEADER_FLD.Cells(outLastRow, FIX_COLS + 2).Value = VALUE_FLDFor iRow = 2 To inLastRowFor iCol = 5 To inLastColoutLastRow = outLastRow + 1.Cells(outLastRow, 1).Resize(1, FIX_COLS).Value = .Cells(iRow, 1).Resize(1, FIX_COLS).Value.Cells(outLastRow, FIX_COLS + 1) = .Cells(1, iCol).Cells(outLastRow, FIX_COLS + 2) = .Cells(iRow, iCol)Next iColNext iRowEnd With
End Sub
【代码解析】
第6~8行代码定义常量,其含义如下。
常量 | 含义 |
---|---|
FIX_COLS | 数据表中固定列的数量,这些列将包含在输出表的每行数据中 |
HEADER_FLD | 被转置标题字段名称 |
VALUE_FLD | 数值字段名称 |
第9行代码获取源数据工作表对象引用。
第11~12行代码获取数据区域的最后行和列位置。
微软参考文档:
Range.End 属性 (Excel)
第13行代码设置数据输出位置为最后数据行之下两行。
第14行代码复制固定列标题行。
第15~16行代码更新标题字段(日期Date)和值字段标题(数值Value)。
第17~24行循环变量源数据表格。
第19行输出数据表的行号递增1。
第20行复制固定列数据。
第21行填写Date列数据。
第22行填写Value列数据。