0

我无法弄清楚如何将 exel 表重新格式化为 4 个不同的表。截至目前,我必须记录一份文件,一份有数据,一份需要重新格式化其他人的数据。

这是背景:

  1. 第一个文档在一年中的每个 (12) 月有 48 行(4 组)
  2. 相应的列来自 2012-1950 年
  3. ex.-->第一行是 1 月,降水值是 2012 年,然后是 2011 年、2010 年等。
  4. ex.-->第二行是 JANUARY,maxTemp 值是同一年
  5. 第三行与 minTemp 和第四 avgTemp 相同;然后这4个重复12次
  6. 我需要为一种数据类型复制并连接所有月份
  7. (以相反的顺序,因此数据是从 1950 年 1 月到 2012 年 1 月)
  8. 并将其粘贴到 4 个 excel 文档中的 1 个的新行中(每种数据类型一个)
  9. 所以最后一行将包含ex precipitation Jan1950, Feb1950, March1950 ... Nov2012, Dec2012
  10. 这样,从 1950 年 1 月到 2012 年 12 月,一行将有 12(月)*62(年)按顺序排列
  11. 基本上会有 4 个 excel 文档,每个文档都有一个非常长的行

这是我的想法

(除非有更好的方法)我想知道是否有一个宏(或公式)可以:

  1. 对应于 Jan1950-Jan2012 的 Precip以相反的顺序(即 Z3-C3)取行的一部分
  2. 复制它并将其与...连接起来
  3. 另一行的相同部分以相反的顺序(即 Z7-C7)对应于 Feb1950-Feb2012 的 Precip
  4. 另一行倒序(即 Z12-C12)对应于 Mar1950-Mar2012 的 Precip
  5. 重复所有 12 个月
  6. 将它们粘贴到沉淀excel文档中
  7. 这需要对所有四种数据类型进行(即 Z4-C4 是 minTemp Jan 1950-2012;Z8-C8 Feb;等等)

再次产生一行,其中包含从 1950 年 1 月到 2012 年 12 月仅针对该数据类型的数据

4

1 回答 1

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+n64-INT(COLUMN()/12)+1变为64-INT(COLUMN()/12)+0 。对未来问题的提示:如果您尝试自己制定解决方案(实际代码或公式,而不仅仅是大纲),您应该将其包含在您的问题中。所以我们可以看到你自己尝试了:)

于 2013-03-02T22:45:56.960 回答