更新
我已经测试了下面的 VBA 方法,但由于列限制,它(对我来说)失败了,所以除非你有 64 位版本(或者可能是 2003 年以后的版本)的 excel,否则你将无法使用列来做到这一点。我已经修改了 VBA 版本以使用行而不是列,它工作正常。
我在这里做了两个版本的演示:https ://dl.dropbox.com/u/14854735/ptdata.xls
VBA 方法(简单/快速)
以下内容未经测试。创建工作簿的副本以进行处理,打开代码编辑器并将以下内容粘贴到新的代码模块(不是工作簿或工作表代码部分)。
Const ROW_HEADER = 1 ' No Row Header - Set to 0
Const COL_HEADER = 1 ' No Column Header - Set to 0
Sub FormatDocument()
' This sub assumes the following
' Your source worksheet has column headers (row 1)
' Your source worksheet has row headers (column 1)
' So your data is bound by the range $B$2:$BL$49
' See above constants if this is not the case
' Your source sheet must be the active sheet when you run this sub (unless you edit below)
Dim Source As Worksheet
Dim Destination As Worksheet
Dim Pass As Integer
Dim CYear As Integer
Dim CMonth As Integer
Dim Column As Integer
Set Source = Thisworkbook.ActiveSheet ' If possible change this to the name of the source sheet
For Pass = 1 To 4
Set Destination = ThisWorkbook.Worksheets.Add
Column = 1
For CYear = (63 + ROW_HEADER) To (1 + ROW_HEADER) Step -1
For CMonth = 0 To 11
Destination.Cells(Column, 1).Value = Source.Cells(COL_HEADER + Pass + (CMonth * 4), CYear).Value
' NOTE: I've switched the row and column
' It will now use many rows and a single column
' Destination.Cells(1, Column).Value = Source.Cells(COL_HEADER + Pass + (CMonth * 4), CYear).Value
Column = Column + 1
Next
Next CYear
Next Pass
End Sub
公式法
以下公式应粘贴到您的目标工作表中并复制到所有必需的单元格中(在修改它以采用所需的值类型之后)。这本质上是将二维数组(您的数据)映射到一维数组上。
=INDIRECT(ADDRESS(((((COLUMN()-1)-(12*INT((COLUMN()-1)/12))))*4)+2,64-INT(COLUMN()/12),1,TRUE,"SourceSheet"))
我已经更新了公式,它现在应该可以按预期工作,但是仍然受到列数的限制(Jan1950-Apr1971 是我可以输入的)
此代码还应考虑列和行标题,如果您不需要它们,则+1+n
变为+0+n
和64-INT(COLUMN()/12)+1
变为64-INT(COLUMN()/12)+0
。对未来问题的提示:如果您尝试自己制定解决方案(实际代码或公式,而不仅仅是大纲),您应该将其包含在您的问题中。所以我们可以看到你自己尝试了:)