Один из способов упрощения - макрос VBA или Power Query для выполнения того же действия.
Вот решение для Power Query:
Чтобы использовать Power Query
Data => Get&Transform => from Table/Range
Home => Advanced Editor
.Applied Steps
, чтобы понять алгоритмРедактирование1: Лучший алгоритм общего пробега
Редактирование2: Дифференциация по годам
Все, что мы делаем, это добавляем год к названию месяца в шаге, который его генерирует
let
//Replace Table Name in the next line with actual table name in your workbook
Source = Excel.CurrentWorkbook(){[Name = "Table30"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{
{"Sl. No.", Int64.Type},
{"Tran Date", type date},
{"Withdrawal", Currency.Type}, {"Deposit", Currency.Type}, {"Balance Amount", Currency.Type}
}),
//Replace nulls with 0 because cannot add nulls
#"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,0,Replacer.ReplaceValue,{"Withdrawal", "Deposit"}),
//get starting balance. Should be last entry of previous month
//but for here I will set it to 0
startingBalance = 0,
//Group by dates and get net of Withdrawal/Deposits for each date
group = Table.Group(#"Replaced Value","Tran Date",{
{"Net Change", each List.Sum([Deposit]) - List.Sum([Withdrawal]), Currency.Type}
}),
//create list of all dates in the statement
monthDates = Table.FromList(
let
mnthStart = Date.StartOfMonth(List.Min(#"Replaced Value"[Tran Date])),
mnthEnd = Date.EndOfMonth(List.Max(#"Replaced Value"[Tran Date]))
in List.Dates(mnthStart,Duration.Days(mnthEnd - mnthStart)+1, #duration(1,0,0,0)),
Splitter.SplitByNothing(),{"Month"}),
//Merge with the dates from the grouped table
// and sort to ensure proper date order
allDates = Table.Join(group,"Tran Date", monthDates,"Month",JoinKind.RightOuter),
#"Sorted Rows" = Table.Sort(allDates,{{"Month", Order.Ascending}}),
//Remove partial date column
#"Removed Columns" = Table.RemoveColumns(#"Sorted Rows",{"Tran Date"}),
//Add running total column = end of day balance
bl = List.Buffer(List.ReplaceValue(#"Removed Columns"[Net Change],null,0,Replacer.ReplaceValue)),
RT = List.Generate(
()=>[rt=bl{0}, idx=0],
each [idx] < List.Count(bl),
each [rt = [rt] + bl{[idx]+1}, idx = [idx]+1],
each [rt]
),
rtTable = Table.FromColumns(
{#"Removed Columns"[Month],RT},
{"Date", "EOD Bal"}),
//Convert date to month name
//Add year to differentiate by year
#"Added Custom1" = Table.AddColumn(rtTable, "MonthName", each Date.MonthName([Date]) & Date.ToText([Date]," yyyy")),
//Group by monthName and aggregate by average
#"Grouped Rows" = Table.Group(#"Added Custom1", {"MonthName"}, {{"Average Daily", each List.Average([EOD Bal]), type number}}),
//set data types
typed = Table.TransformColumnTypes(#"Grouped Rows",{{"MonthName", Text.Type},{"Average Daily", Currency.Type}})
in
typed
Данные
Результаты
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: