2012-04-19 80 views
3

我有一個較大的Excel表(591米的cols,2645行),看起來像這樣一個基本格式:如何在Excel 2007中將多行摺疊成單行?

| Time | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 | 
|======+========+========+========+========+========+========+========| 
| 0.01 | 0.35 |  |  |  |  | 0.1351 | 0.2398 | 
| 0.02 |  | 0.42 |  |  |  | 0.4314 | 0.4342 | 
| 0.03 |  |  | 0.99 |  |  | 0.3414 | 0.4321 | 
| 0.04 |  |  |  | 0.12 |  | 0.4351 | 0.4256 | 
| 0.05 |  |  |  |  | 0.66 | 0.7894 | 0.9874 | 

這基本上是一個數據流的記錄,其中一些字段每次採樣一次一步,而其他人則在每個時間步驟進行採樣。然後,一旦完成循環(即,再次寫入「數據1」),則記錄整個「記錄」。

最後的數據記錄,進行數據處理和分析的目的,看起來是這樣的:

| Time | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 | 
|======+========+========+========+========+========+========+========| 
| 0.05 | 0.35 | 0.42 | 0.99 | 0.12 | 0.66 | 0.7894 | 0.9874 | 

注意,時間戳等於在表中找到一個時間戳,即重複數據字段等於當時的數據值,並且週期性數據字段等於每個字段的最後報告值。

爲單個循環中記錄然後將基本上由所述給定的時間內記錄的任何字段中的最終值。我可以輕鬆地做到這一點,但我有2600+行數據處理每個數據集和六個數據集來處理。

在整個數據文件中是否存在乾淨/簡單/實用的方法?我可以用任何方式蠻力,但我希望不必重新發明輪子。如果我可以將輸出寫入新的工作表,那會很棒。

+0

您是否想要爲Time = 0.05,0.10,0.15 ...做這個?或者0.05,0.06,0.07,0.08?或者數據1到數據5填入的每個週期? – rajah9 2012-04-19 19:23:55

+0

對不起,我想爲每個「套」做。因此,對於這個例子,它將在時間= 0.05,0.10,0.15等等。 – brightwellcd 2012-04-19 19:40:07

回答

1

工作,這是我結束了使用的解決方案......

首先,我創建了第二個表(表2),複製標題行,並將第一行中的每條記錄設置爲等於第一張紙上第一行中的第一條記錄(表1)。如果Sheet 1中的第一行有一個空值,我用零替換它。例如:

=IF(Sheet1!A2="",0,Sheet1!A2) 

然後我用一個公式來有條件地將值從表1複製到表2或表2.使用的值的當前單元上方。例如,在B3(第二記錄,第一場):

=IF(Sheet1!B3="",B2,Sheet1!B3) 

然後我複製這在表2每細胞,其具有在說明書1.可用一個源值的結果是這樣的:

| Time | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 | Data 7 | 
|======+========+========+========+========+========+========+========| 
| 0.01 | 0.35 | 0  | 0  | 0  | 0  | 0.1351 | 0.2398 | 
| 0.02 | 0.35 | 0.42 | 0  | 0  | 0  | 0.4314 | 0.4342 | 
| 0.03 | 0.35 | 0.42 | 0.99 | 0  | 0  | 0.3414 | 0.4321 | 
| 0.04 | 0.35 | 0.42 | 0.99 | 0.12 | 0  | 0.4351 | 0.4256 | 
| 0.05 | 0.35 | 0.42 | 0.99 | 0.12 | 0.66 | 0.7894 | 0.9874 | 

由此看來,我能夠產生相關的p很多來有效地分析數據。

0

將其粘貼到數據下方行的單元格中。 A是您粘貼的列

=LOOKUP(2,1/(A1:A5<>""),A:A) 
2

歡迎來到SO。

我有基於長度5次小解決方案它使用indirect功能,你應該能夠根據需要擴展它。

首先,我在您的示例中添加了一些行,以獲得0.15的時間。這佔用了a1到h16。然後我把i17加到j19,告訴哪些行要檢查。我做了這些:

2 6 
7 11 
12 16 

這意味着i17和j17代表第2到第6行(或數據中的第1個循環)。我會建議你讓j17 = i17 + 4,j18 = i17 + 1。

好的,這裏是間接函數。 在A17,=INDIRECT("A"&$J17),這意味着,給我柱A,第2行(因爲在細胞I17是有2,$裝置使用絕對柱,並保持在該式中使用I)。

在B17,=SUM(INDIRECT("b"&$I17&":b"&"$"&$J17)),它通過B6表示b2的總和。

在c17中,=SUM(INDIRECT("c"&$I17&":c"&"$"&$J17))

對d17,e17和f17重複該模式。

在G17,你只是想要複製的內容與=INDIRECT("g"&$J17) G6。

在H17,你複製的內容與=INDIRECT("h"&$J17) H6。

然後,您可以將a17:h17中的公式複製三行。

2

這樣的事情可能會爲你

Sub tester() 
    SummarizeRows ThisWorkbook.Sheets("Sheet1").Range("A1"), _ 
        ThisWorkbook.Sheets("Sheet2").Range("A1") 
End Sub 


Sub SummarizeRows(rngIn As Range, rngOut As Range) 

Const MASTER_COL As Long = 2 'summarize when new value here (except first row) 

Dim vals(), data 
Dim numRows As Long, numCols As Long 
Dim r As Long, c As Long, r_out As Long 
Dim c2 As Long, v 

    r_out = 1 
    'get all the input data 
    data = rngIn.CurrentRegion.Value 
    numRows = UBound(data, 1) 
    numCols = UBound(data, 2) 
    ReDim vals(1 To numCols) 

    For r = 2 To numRows 
     For c = 1 To numCols 
      v = data(r, c) 
      If Len(v) > 0 Then 
       If c = MASTER_COL And r > 2 Then 
        'new value in "master" column... 
        r_out = r_out + 1 
        For c2 = 1 To numCols 
         data(r_out, c2) = vals(c2) 
         vals(c2) = "" 
        Next c2 
       End If 
       vals(c) = v 
      End If 
     Next 
    Next r 

    'write any last values 
    r_out = r_out + 1 
    For c2 = 1 To numCols 
     data(r_out, c2) = vals(c2) 
    Next c2 

    rngOut.Resize(r_out, numCols).Value = data 

End Sub