我有一个大型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 |
这基本上是数据流的记录,其中一些字段每个时间步仅采样一次,而其他字段在每个单独的时间步采样。然后,一旦循环结束,就会记录整个“记录”(即,再次写入“数据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 :(得分: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)
,这意味着,给我col A,第2行(因为在单元格i17中有2个。$
表示使用绝对列,并继续在公式中使用I)
在b17中,=SUM(INDIRECT("b"&$I17&":b"&"$"&$J17))
,表示b2到b6的总和。
在c17,=SUM(INDIRECT("c"&$I17&":c"&"$"&$J17))
。
重复d17,e17和f17的模式。
在g17中,您只想用=INDIRECT("g"&$J17)
复制g6中的内容。
在h17中,您使用=INDIRECT("h"&$J17)
复制h6中的内容。
然后,您可以将公式从a17:h17向下复制三行。
答案 1 :(得分: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
答案 2 :(得分:1)
这是我结束使用的解决方案......
首先,我创建了第二张工作表(工作表2),复制了标题行,并将第一行中的每条记录设置为等于第一张工作表(工作表1)第一行中的第一条记录。如果Sheet 1中的第一行有一个空值,我将其替换为零。例如:
=IF(Sheet1!A2="",0,Sheet1!A2)
然后我使用公式有条件地将Sheet 1中的值复制到Sheet 2或使用Sheet 2中当前单元格上方的值。例如,在B3中(第二个记录,第一个字段):
=IF(Sheet1!B3="",B2,Sheet1!B3)
然后我将其复制到Sheet 2中的每个单元格中,这些单元格在Sheet 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 |
由此,我能够生成相关的图表来有效地分析数据。
答案 3 :(得分:0)
将其粘贴到数据下方行的单元格中。 A是您要粘贴的列
=LOOKUP(2,1/(A1:A5<>""),A:A)