2015-08-10 2 views
0

У меня есть данные, как показано ниже, из строки 2-7.Суммировать данные в строке на основе дат

Я хотел бы объединить все данные из предыдущих месяцевв один ряд, поэтому от картины ниже, я хотел бы объединить данные из 05/05/2014-07/09/2014, но оставьте полевые последний месяцданные нетронутые и не комбинируются. Поэтому мне нужно суммировать данные в столбце G и столбце H, для строк 2-4, другие столбцы не имеют значения.

Ряды 11-14 - это то, чего я хотел бы достичь. Как я могу это сделать (макро или иначе)?

http://i.stack.imgur.com/7AhrA.jpg

+0

Will F2: F7 всегда быть отсортирован как показано на рисунке? – pnuts

+0

Да, это всегда будет показано. Но иногда может быть больше или меньше данных (например, только F2: F5 или F2: F20), в зависимости от количества транзакций. Мне нужны все транзакции предыдущего месяца, суммированные в одну строку, и только транзакции текущего месяца, перечисленные в списке – Frankie139

+0

Как определяется текущий месяц (скажем, если нет записей в этом месяце) и почему 74.2911 на выходе, когда вход равен 70/50/55 ? – pnuts

ответ

0

Смотрите, если это поможет вам начать работу:

Sub Summary() 
    Dim FirstDataRow As Long 
    Dim LastDataRow As Long 
    Dim DataRow As Long 
    Dim cDates As Long 
    Dim cAmounts As Long 
    Dim CutoffDate As Date 
    Dim EarliestOldDate As Date 
    Dim LatestOldDate As Date 
    Dim SumOfOld As Long 
    Dim OldMonthsRow As Long 
    Dim OffSetToSummaryTable As Long 
    Dim InputRow As Long 
    Dim OutputRow As Long 
    Dim TheDate As Date 
    Dim TheAmount As Long 
    Dim ws As Worksheet 

    ' INITIALIZE 
    ' Assume we're operating on the activesheet 
    Set ws = ActiveSheet 

    ' Assume data starts in Row 2 
    FirstDataRow = 2 

    ' Assume data is a contiguous block 
    LastDataRow = ws.Range("F" & CStr(FirstDataRow)).End(xlDown).Row 

    ' Assume 3 empty rows between input and summary table 
    OffSetToSummaryTable = 3 

    ' Calculate row where sum of old months goes 
    OldMonthsRow = LastDataRow + OffSetToSummaryTable + 1 

    ' Calculate the cutoff date = first date of current month 
    CutoffDate = DateSerial(2015, 1, 1) 
    ' CutoffDate = DateSerial(Year(Date), Month(Date), 1) 

    ' Column where dates are 
    cDates = 6 

    ' Column where amounts are 
    cAmounts = 7 

    ' Initialize earliest and latest old dates, and sum of old 
    EarliestOldDate = DateSerial(3000, 12, 31) ' Way out in the future 
    LatestOldDate = DateSerial(1904, 1, 1)  ' Way back in the past 
    SumOfOld = 0 


    ' PROCESS THE DATA 
    OutputRow = OldMonthsRow 
    For InputRow = FirstDataRow To LastDataRow 
     TheDate = ws.Cells(InputRow, cDates) 
     TheAmount = ws.Cells(InputRow, cAmounts) 

     If TheDate >= CutoffDate Then 
      ' Add at the bottom of the summary table 
      OutputRow = OutputRow + 1 
      ws.Cells(OutputRow, cDates).Formula = TheDate 
      ws.Cells(OutputRow, cAmounts).Formula = TheAmount 
     Else 
      ' Update results for previous months 
      EarliestOldDate = IIf(TheDate < EarliestOldDate, TheDate, EarliestOldDate) 
      LatestOldDate = IIf(TheDate > LatestOldDate, TheDate, LatestOldDate) 
      SumOfOld = SumOfOld + TheAmount 
     End If 

    Next InputRow 

    ' WRITE RESULTS TO SUMMARY ROW 
    ws.Cells(OldMonthsRow, cDates).Formula = Format(EarliestOldDate, "dd/mm/yyyy") & " - " & Format(LatestOldDate, "dd/mm/yyyy") 
    ws.Cells(OldMonthsRow, cAmounts).Formula = SumOfOld 

    Set ws = Nothing 
End Sub 
+0

Спасибо, он отлично работает! Однако мне также нужны другие поля из B12: E14 и H12: H14 вместе с данными, которые генерируются в столбце F и G. Как и в - для текущего месяца мне нужны все данные в каждой строке, вставленной в «OffSetToSummaryTable» », а не только столбец F и G. Любые идеи? – Frankie139

+0

Фрэнки, что вы не пытаетесь изменить пример кода. Я думаю, вы можете понять, как это работает, а затем внести изменения, так что он функционирует так, как вам нравится. – xidgel