更新
我已经测试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
公式法
下式应粘贴到您的目的地片材(S)和跨复制到所有必需的细胞(修改它取所需的值类型之后)。这基本上是将一个二维数组(数据)映射到一维数组上。
=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
。 提示未来的问题:如果您试图自己制定解决方案(实际的代码或公式,而不仅仅是大纲),则应将其包含在您的问题中。所以我们可以看到你已经自己去了:)
非常感谢您的快速回复。试过这些后,他们似乎没有工作,但我正在与他们搞乱。在我尝试太多并给出结果/问你问题之前,我想问问......这两种不同的方法还是都需要使用?我对excel的大部分都是新手,所以我不确定。此外,我很乐意向您发送图片,但我无法发布照片。我认为这将是一个非常简单的宏(或公式),我只是不太了解语法。有没有办法给我发送图片? – user1574832 2013-03-03 02:32:52
它的两种不同的方法,我想说,但现在看不到。 VBA一个更容易使用。您的数据是否包含列和/或行标题,还是纯粹数据?该代码假定范围B2:BL49覆盖您的数据,不包括行1和列A,因为它们是标题。您可以发布指向文件/图片的链接,数据排列方式的示例会有所帮助,以确保我的理解正确。 – NickSlash 2013-03-03 05:51:41
以下是一些图像链接。再次感谢您的帮助,我认为您非常亲密,嵌套的循环只需要切换一下。 VBA迭代似乎没有正常工作。它正确地从右向右开始(1950),但不是抓取行中的所有值,而是抓取列中的每一个四分之一,然后转移到下一列。以下是该工具现在正在做什么以及需要做什么的另一个链接。这应该更有意义。我删除了标题,但是黄色标题将帮助您了解每行和每列。 – user1574832 2013-03-03 15:16:55