我无法弄清楚如何将exel表格重新格式化为4张不同的表格。 截至目前,我必须提供文档,一个包含数据,另一个需要重新格式化其他数据。
以下是背景资料:
以下是我的想法
(除非有更好的方法)我想知道是否会有一个宏(或公式):
再一次产生了一行,其中包含了从1950年1月到2012年12月的数据,仅用于该数据类型
答案 0 :(得分:0)
<强>更新强>
我已经测试了下面的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
。
提示未来的问题:如果您尝试自己制定解决方案(实际代码或公式,而不仅仅是大纲),您应该将其包含在您的问题中。所以我们可以看到你自己去了:)