EXCEL Copy&从一个文档连接到另一个文档

时间:2013-03-02 18:40:58

标签: excel excel-vba excel-formula formula vba

我无法弄清楚如何将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. (以相反的顺序,以便数据来自Jan1950-Jan2012)
  8. 并将其粘贴到4个Excel文档中的一个中的新行(每种数据类型一个)
  9. 因此最后一行将包含降水 Jan 1950,Feb 1950,March 1950(Nov2012,Dec2012)
  10. 这样,从1950年1月到2012年12月,一行将有12个月(月)* 62年(年)
  11. 基本上会有4个excel文档,每个文档都有一个非常长的行

  12. 以下是我的想法

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

    1. 以相反的顺序(即Z3-C3)参与对应于Jan1950-Jan2012的Precip
    2. 复制并将其连接到......
    3. 相反顺序的另一行的相同部分(即Z7-C7)对应于1950年2月至2012年2月的Precip
    4. 相反顺序的另一行(即Z12-C12)对应于Mar1950-Mar2012的Precip
    5. 重复所有12个月
    6. 将它们粘贴到沉淀excel文档中
    7. 这需要对所有四种数据类型进行(即Z4-C4是minTemp Jan 1950-2012; Z8-C8 Feb;等等)
    8. 再一次产生了一行,其中包含了从1950年1月到2012年12月的数据,仅用于该数据类型

1 个答案:

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