如何在Excel 2007中将多行折叠成单行?

我有一个大的Excel表格(591列,2645行),其基本格式如下所示:

| 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 | 

这基本上是一个数据stream的logging,其中一些字段在每个时间步仅被采样一次,而另一些则在每个单独的时间步被采样。 一旦完成循环(即,再次写入“数据1”),则logging整个“logging”。

数据处理和分析的最终数据logging如下所示:

 | 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 | 

请注意,时间戳等于表中find的时间戳,重复数据字段等于当时的数据值,周期性数据字段等于每个字段的最后一次报告值。

那么单一循环的logging基本上将包括给定时间范围内任何字段logging的最终值。 我可以轻松地做到这一点,但我有2600+行数据处理每个数据集和六个数据集来处理。

在整个数据文件中是否有干净/简单/实用的方法? 我可以用任何方式蛮力,但我希望不必重新发明轮子。 如果我可以将输出写入一个新的工作表,那会很棒。

欢迎来到SO。

我有一个基于长度为5的循环的小解决scheme。它使用indirect函数,并且您应该能够根据需要进行扩展。

首先,我在你的例子中添加了一些行,以便达到0.15。 这占用了1到h16。 然后我把i17加到j19,告诉哪一行要检查。 我做了这些:

  2 6 7 11 12 16 

这意味着i17和j17代表第2到第6行(或数据中的第1个循环)。 我build议你让j17 = i17 + 4,j18 = i17 + 1。

好的,这里是间接的function。 在a17中, =INDIRECT("A"&$J17) ,意思是给第二行(因为单元格i17中有一个2, $表示使用绝对列,并继续使用公式)。

在b17中, =SUM(INDIRECT("b"&$I17&":b"&"$"&$J17)) ,这意味着b2到b6的总和。

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

重复d17,e17和f17的模式。

在g17中,你只是想将g6中的内容复制到=INDIRECT("g"&$J17)

在h17中,您将使用=INDIRECT("h"&$J17)复制h6中的内容。

然后,您可以将a17:h17中的公式从三行中复制下来。

像这样的东西可能会为你工作

 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 

这是我使用的解决scheme…

首先,我创build了第二张纸(表2),复制标题行,并将第一行中的每个logging设置为与第一张纸(表1)上第一行中的第一个logging相同。 如果Sheet 1中的第一行有一个空值,我用零replace它。 例如:

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

然后,我使用一个公式来有条件地将Sheet 1中的值复制到Sheet 2,或者使用Sheet 2中当前单元格上方的值。例如,在B3(第二个logging,第一个字段)中:

 =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 | 

由此,我能够生成相关图表来有效地分析数据。

将其粘贴到数据下方的行的单元格中。 A是你正在粘贴的列

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