Excel VBA:查找每天的细胞范围(未指定),并将公式应用于新细胞

这是我第一次发布,但很快感谢社区的所有帮助,这个网站已经给了我在大学与工作。

问题摘要:我有networking数据,每天以date时间格式每15分钟录制一次,比特率在不同的列中input和输出。 目标是每天应用几个公式(例如平均值,出90度等)。但是,这些公式需要适用于每一天,而不是由用户input或包含在代码中的特定date。

这是我真正挣扎的地方,我花了几天的时间试图破解它,但是我能find的每个类似的例子都需要一个用户指定的date。

我之所以需要VBA来处理这个任务,是因为我有超过50个报告,每个报告都有一个月的数据,最终代码将导入每个报告,应用公式,然后将它们导出为CSV,以便在其他工作簿中使用。

当前电子表格示例

Time | In Bit Rate | Out Bit Rate 01/02/2017 15:00 | 11200 | 42300 01/02/2017 15:15 | 14100 | 47400 01/02/2017 15:30 | 11300 | 42300 02/02/2017 15:00 | 12100 | 44100 02/02/2017 15:15 | 11500 | 42600 02/02/2017 15:30 | 12400 | 44700 

期望的结果例子

 Time | In Bit Rate | Out Bit Rate | In Bit Rate Average | Out Bit Rate Average 01/02/2017 15:00 | 11200 | 42300 | 12200 | 44000 01/02/2017 15:15 | 14100 | 47400 | | 01/02/2017 15:30 | 11300 | 42300 | | 02/02/2017 15:00 | 12100 | 44100 | 12000 | 43800 02/02/2017 15:15 | 11500 | 42600 | | 02/02/2017 15:30 | 12400 | 44700 | | 

基本上,我遇到的主要困难是做dateselect,并确保代码每天运行,我假设一个循环将在这种情况下是有用的,但我不知道它将如何挑出每一个单独的一天首先。

我开始追求的一个想法是从每个date时间值提取date到一个新的列,然后处理新的date单元格作为“重复”,然后我会有我的行select。 但是,这也许并不是完成任务的最有效的方式。

尝试这个。 数据应该在工作表“MyData”中。 目前的代码只是执行第2列(“比特率”)的操作。 你必须调整它以适应你的需求。 基本上,数据是临时存储在一个数组中的。 这个代码只有在列A被订购的情况下才有效。 无论如何,我认为你的主要兴趣在于日子function。

 Private Sub CommandButton1_Click() Dim MyArray() As Variant Dim lLastRow As Long Dim i As Long lLastRow = Worksheets("MyData").UsedRange.Rows.Count ReDim MyArray(1 To 1) As Variant For i = 1 To lLastRow If (Day(Worksheets("MyData").Cells(i + 1, 1)) <> Day(Worksheets("MyData").Cells(i, 1))) Then MyArray(UBound(MyArray)) = Worksheets("MyData").Cells(i, 2).Value Worksheets("MyData").Cells(i, 4) = Application.WorksheetFunction.Average(MyArray) Worksheets("MyData").Cells(i, 5) = Application.WorksheetFunction.StDev(MyArray) Worksheets("MyData").Cells(i, 6) = Application.WorksheetFunction.Percentile(MyArray, 0.9) ReDim MyArray(1 To 1) As Variant 'reset array for next day Else MyArray(UBound(MyArray)) = Worksheets("MyData").Cells(i, 2).Value 'add data to array ReDim Preserve MyArray(1 To UBound(MyArray) + 1) As Variant 'now array is 1 element longer End If Next i End Sub 

公式解决scheme。 假设您的列是A, B, C, D and E ,请在D2键入以下公式,然后将其复制/粘贴到D and E中的所有单元格中。

 =IF(DAY($A2)<>IFERROR(DAY($A1), 0),AVERAGEIFS(B:B,$A:$A,">="&INT($A2),$A:$A,"<"&1+INT($A2)), "") 

在这里输入图像描述