Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:查找每天的单元格范围(未指定)并在新单元格中应用公式_Excel_Datetime_Select_Excel Formula_Vba - Fatal编程技术网

Excel VBA:查找每天的单元格范围(未指定)并在新单元格中应用公式

Excel VBA:查找每天的单元格范围(未指定)并在新单元格中应用公式,excel,datetime,select,excel-formula,vba,Excel,Datetime,Select,Excel Formula,Vba,这是我第一次发帖,但要向社区表示感谢,感谢这个网站在大学和工作中为我提供的所有帮助 问题摘要: 我有网络数据,每天每15分钟以datetime格式记录一次,比特率在不同的列中输入和输出。 目标是每天应用几个公式(如平均值、第90百分位数等) 但是,这些公式需要应用于每一天,而不需要用户输入特定的日期或包含在代码中 这是我真正挣扎的地方,我花了几天时间试图破解它,但我能找到的每一个类似的例子都需要用户指定的日期 我之所以需要VBA来完成此任务,是因为我有50多个报表,每个报表包含一个月的数据,最终

这是我第一次发帖,但要向社区表示感谢,感谢这个网站在大学和工作中为我提供的所有帮助

问题摘要: 我有网络数据,每天每15分钟以datetime格式记录一次,比特率在不同的列中输入和输出。 目标是每天应用几个公式(如平均值、第90百分位数等) 但是,这些公式需要应用于每一天,而不需要用户输入特定的日期或包含在代码中

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

我之所以需要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        |                     |
期望结果示例

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        |                     |
本质上,我面临的主要困难是选择日期,并确保代码每天都在运行,我假设在这种情况下,循环会很有用,但我不确定它将如何选择开始的每一天


我开始追求的一个想法是将每个日期时间值中的日期提取到一个新列中,然后将新的日期单元格作为“重复项”处理,然后进行行选择。然而,这并不是完成任务的最有效方式。

试试这个。数据应该在“MyData”表中。本代码仅对第2列(“比特率”)执行操作。你必须调整它以适应你的需要。基本上,数据是临时存储在数组中的。此代码仅在A列被订购时有效。不管怎样,我认为你主要感兴趣的是函数

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
Private子命令按钮1\u单击()
Dim MyArray()作为变量
昏暗的灯塔一样长
我想我会坚持多久
lLastRow=工作表(“MyData”).UsedRange.Rows.Count
ReDim MyArray(1到1)作为变体
对于i=1到lLastRow
如果(天(工作表(“MyData”).单元格(i+1,1))天(工作表(“MyData”).单元格(i,1)),则
MyArray(UBound(MyArray))=工作表(“MyData”)。单元格(i,2)。值
工作表(“MyData”).Cells(i,4)=Application.WorksheetFunction.Average(MyArray)
工作表(“MyData”).Cells(i,5)=Application.WorksheetFunction.StDev(MyArray)
工作表(“MyData”).Cells(i,6)=应用程序.WorksheetFunction.Percentile(MyArray,0.9)
重拨MyArray(1到1)作为变量“为第二天重置阵列”
其他的
MyArray(UBound(MyArray))=工作表(“MyData”)。单元格(i,2)。值“将数据添加到数组”
ReDim保留MyArray(1到UBound(MyArray)+1)作为变体“现在数组长1个元素”
如果结束
接下来我
端接头
一种配方解决方案。 假设列为
A、B、C、D和E
,在
D2
中键入以下公式,然后沿
D和E
中的所有单元格复制/粘贴它

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

=IF(DAY($A2)IFERROR(DAY($A1),0),AVERAGEIFS(B:B,$A:$A,“>=”&INT($A2),$A:$A,"经过一点调整后,您的代码似乎可以正常工作!非常感谢。我不熟悉VBA中的数组,因此我必须进一步研究,但您概述的函数非常有用,因此再次感谢您。很高兴提供帮助!如果它适合您的需要,请标记为已接受…数组只是一堆东西。您可以访问元素,如
MyArray(0)
MyArray(1)
因此……在您的情况下,我设置了两个数组:
MyInBitArray
MyOuBitArray
。很抱歉问您一个后续问题,您是否有过Day函数不拾取所有日期的经验?当我直接在文件中运行代码时,代码运行良好,但当我在另一个宏中调用该宏时(在多个报告上运行)它开始丢失每个月12日之前的所有日期。我假设这可能是英国/美国日期不匹配的问题,但我不确定。不是真的,但我远不是专家。1)我要做的第一件事是检查您的时间单元格是否正确设置为日期格式。例如,在空列中写入公式
=A1+1/24
(如果时间在A列中),然后向下拖动。这将为您的数据添加一个小时。2)第二件事是添加对工作簿的引用:而不是
工作表(“MyData”)。单元格(i,4)
设置一个显式引用:
set wbk=Workbooks.Open(“C:\myworkbook.xls”)
然后替换为
wbk.Worksheets(“MyData”).Cells(i,4)
如果有人读取此线程,csv文件中基于日期的数组被误读的解决方案是声明要在本地解释的日期。我认为这是因为在csv中,代码默认为美国日期格式。示例代码
Workbooks.Open(文件名:=myFolder&myFile,格式:=xlDelimited,Local:=True)谢谢你的回应,我会给它一个镜头。如果它有效的话,我会考虑如何用VBA来输入这个公式(这是一个不幸的要求),所以我有一个额外的方法,用CMAGG来概括。如果你不欢迎的话,有一个以上的解决方案是好的,CMArg的一个也是好的。