2017-02-03 50 views
2

這是我第一次發佈,但一個快速謝謝社會各界對所有幫助這個網站已經給了我的大學&工作。Excel的VBA:查找單元格區域的每一天(指定的非),並在新的小區應用公式

問題摘要: 我有網絡數據,每15分鐘通過天記錄在日期時間格式,與在單獨的列的比特率和縮小。 目標是對每個(例如平均值,第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  |      | 

基本上我具有正在日期選擇,並確保代碼的主要困難爲每個運行,並每天我都會假設一個循環在這個例子中會很有用,但是我不確定它將如何挑選每一個獨立的日子來開始。

的一個想法,我開始追求是從每個日期時間值的日期提取到一個新列,然後處理新的日期細胞「重複」,有那麼我將我行選擇。但是,這並不意味着可能是完成任務的最有效方式。

回答

1

試試這個。數據應該在工作表「MyData」中。目前的代碼只是在第2列(「比特率」)下執行操作。你必須調整它以適應你的需求。基本上,數據臨時存儲在一個數組中。只有列A是有序的,此代碼才能工作。無論如何,我認爲你的主要興趣在於Day函數。

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

位調整後,你的代碼似乎意在努力!非常感謝你。我不熟悉VBA中的數組,因此我將不得不進一步調查,但是您列出的功能非常有用,所以再次感謝您。 – PolygonS1

+0

很高興幫助!如果它符合你的需求,請將其標記爲已接受...並且數組只是一堆事情。你可以訪問像MyArray(0)','MyArray(1)'等元素。就你而言,我會設置兩個數組:'MyInBitArray'和'MyOuBitArray'。 – CMArg

+0

對不起,請教您一個後續問題,您是否有任何使用日期功能的經驗,而不是記錄所有日期?當我直接在文件中運行代碼時,您的代碼運行良好,但是當我在另一個宏中調用宏(在多個報告中運行它)時,它會開始丟失每個月的第12日的所有日期。我假設它可能是英國/美國的日期不匹配問題,但我不確定。 – PolygonS1

0

公式解決方案。 假設你的列是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)), "") 

enter image description here

+0

感謝您的回覆,我會給它一個機會。如果它有效,我會考慮如何使用VBA輸入公式(這是一個不幸的要求),所以我還有一個由CMArg概述的方法以防萬一。 – PolygonS1

+0

不客氣,多個解決方案都很好,@CMArg也是不錯的。 –

相關問題