2013-03-02 93 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

相關問題