2013-03-02 60 views
0

我无法弄清楚如何将exel表格重新格式化为4张不同的表格。 截至目前,我必须提供一份文件,一份包含数据,另一份需要重新格式化其他人的数据。EXCEL从一个文档复制并连接到另一个文档

这里是背景:

  1. 第一文档具有48行(4组)全年
  2. 的根据列是从年的每个(12)个月2012- 1950年
  3. 前.-->第一行是一月份降水值年到2012年,那么2011年,2010年,等
  4. 前.-->第二排我s 1月与maxTemp值在同一年
  5. 第三行是与minTemp和第四个avgTemp相同;然后这些4重复12次
  6. 我需要复制&串连所有月份的用于一个数据类型
  7. (以相反的顺序,使得数据是代替从Jan1950-Jan2012)
  8. 并将其粘贴到一个新行4合1的Excel文档(每个数据类型)
  9. 这样一个最后一行将包含前沉淀 Jan1950,Feb1950,March1950 ... Nov2012,Dec2012
  10. 这样,一排将有12月(月)* 62(年)从1950年1月至2012年12月订单
  11. 基本上不会有各4个Excel文档有一个很长的一行

这里是我的想法

(除非有更好的办法)我在想,如果有一个宏(或公式)将:

  1. 以相反的顺序(即。 Z3-C3)对应于雨Jan1950-Jan2012
  2. 复制它和与它串联...
  3. 以相反的顺序另一行的相同部分(即,Z7-C7)对应于Feb1950的雨-Feb2012
  4. 以相反的顺序另一行(即Z12-C12)对应的雨Mar1950-Mar2012
  5. 所有12个月重复
  6. 它们粘贴到沉淀excel文件
  7. 这需要完成所有四种数据类型(即。 Z4-C4是1950年1月至20日的minTemp; Z8-C8 Feb;等等)

这再次产生,一个行与来自Jan1950-Dec2012仅针对该数据类型的数据

回答

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 

公式法

下式应粘贴到您的目的地片材(S)和跨复制到所有必需的细胞(修改它取所需的值类型之后)。这基本上是将一个二维数组(数据)映射到一维数组上。

=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 。 提示未来的问题:如果您试图自己制定解决方案(实际的代码或公式,而不仅仅是大纲),则应将其包含在您的问题中。所以我们可以看到你已经自己去了:)

+0

非常感谢您的快速回复。试过这些后,他们似乎没有工作,但我正在与他们搞乱。在我尝试太多并给出结果/问你问题之前,我想问问......这两种不同的方法还是都需要使用?我对excel的大部分都是新手,所以我不确定。此外,我很乐意向您发送图片,但我无法发布照片。我认为这将是一个非常简单的宏(或公式),我只是不太了解语法。有没有办法给我发送图片? – user1574832 2013-03-03 02:32:52

+0

它的两种不同的方法,我想说,但现在看不到。 VBA一个更容易使用。您的数据是否包含列和/或行标题,还是纯粹数据?该代码假定范围B2:BL49覆盖您的数据,不包括行1和列A,因为它们是标题。您可以发布指向文件/图片的链接,数据排列方式的示例会有所帮助,以确保我的理解正确。 – NickSlash 2013-03-03 05:51:41

+0

以下是一些图像链接。再次感谢您的帮助,我认为您非常亲密,嵌套的循环只需要切换一下。 VBA迭代似乎没有正常工作。它正确地从右向右开始(1950),但不是抓取行中的所有值,而是抓取列中的每一个四分之一,然后转移到下一列。以下是该工具现在正在做什么以及需要做什么的另一个链接。这应该更有意义。我删除了标题,但是黄色标题将帮助您了解每行和每列。 – user1574832 2013-03-03 15:16:55

相关问题