Добрый день форумчане.Работаю в SAPе и извлекаю таблицу в excel, вот только таблица очень большая. Не знаю с какой стороны подойти.Я в тупике .Подскажите
Добрый день форумчане.Работаю в SAPе и извлекаю таблицу в excel, вот только таблица очень большая. Не знаю с какой стороны подойти.Я в тупике .Подскажитеrow
Добрый день. 6 раз СУММПРОИЗВ() или СУММЕСЛИ() не заметил что ещё и к названию нужно привязываться... Макрос точно может посчитать. Но сейчас в последнее время модно на PQ делать... Макрос, рабочий: [vba]
Код
Option Explicit
Sub tt() Dim a, i&, t$ a = ActiveSheet.UsedRange.Columns(1).Resize(, 3).Value With CreateObject("Scripting.Dictionary") For i = 2 To UBound(a) If Len(a(i, 2)) = 0 Then t = a(i, 1) .Item(t & "d" & a(i, 1)) = .Item(t & "d" & a(i, 1)) + a(i, 2) .Item(t & "c" & a(i, 1)) = .Item(t & "c" & a(i, 1)) + a(i, 3) Next
a = [i3].CurrentRegion.Value For i = 2 To UBound(a) a(i, 2) = .Item(a(i, 1) & "d510101") + .Item(a(i, 1) & "d510102") + .Item(a(i, 1) & "d510103") a(i, 3) = .Item(a(i, 1) & "c510101") + .Item(a(i, 1) & "c510102") + .Item(a(i, 1) & "c510103") Next [i3].CurrentRegion.Value = a End With End Sub
[/vba] Можно пооптимизировать, но станет непонятнее, но не быстрее Если мешают нули - можно навесить доппроверку в макросе.
Добрый день. 6 раз СУММПРОИЗВ() или СУММЕСЛИ() не заметил что ещё и к названию нужно привязываться... Макрос точно может посчитать. Но сейчас в последнее время модно на PQ делать... Макрос, рабочий: [vba]
Код
Option Explicit
Sub tt() Dim a, i&, t$ a = ActiveSheet.UsedRange.Columns(1).Resize(, 3).Value With CreateObject("Scripting.Dictionary") For i = 2 To UBound(a) If Len(a(i, 2)) = 0 Then t = a(i, 1) .Item(t & "d" & a(i, 1)) = .Item(t & "d" & a(i, 1)) + a(i, 2) .Item(t & "c" & a(i, 1)) = .Item(t & "c" & a(i, 1)) + a(i, 3) Next
a = [i3].CurrentRegion.Value For i = 2 To UBound(a) a(i, 2) = .Item(a(i, 1) & "d510101") + .Item(a(i, 1) & "d510102") + .Item(a(i, 1) & "d510103") a(i, 3) = .Item(a(i, 1) & "c510101") + .Item(a(i, 1) & "c510102") + .Item(a(i, 1) & "c510103") Next [i3].CurrentRegion.Value = a End With End Sub
[/vba] Можно пооптимизировать, но станет непонятнее, но не быстрее Если мешают нули - можно навесить доппроверку в макросе.Hugo
let from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], group = Table.Group(from, "Название", {"tmp", each _},GroupKind.Local,(x,y)=>Number.From(y=null))[tmp], f1=(t)=>Table.SelectRows(t,each [Название]<>null), f2=(t)=>Table.SelectRows(t,each List.ContainsAny({Text.From([Название])},{"510101","510102","510103"})), lst = List.Transform(group,each [a=f1(_){0},b= try f2(_){0} [[Дебет],[Кредит]] otherwise [Дебет=null,Кредит=null],c=a&b][c]), to=Table.FromRecords(lst) in to
let from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], group = Table.Group(from, "Название", {"tmp", each _},GroupKind.Local,(x,y)=>Number.From(y=null))[tmp], f1=(t)=>Table.SelectRows(t,each [Название]<>null), f2=(t)=>Table.SelectRows(t,each List.ContainsAny({Text.From([Название])},{"510101","510102","510103"})), lst = List.Transform(group,each [a=f1(_){0},b= try f2(_){0} [[Дебет],[Кредит]] otherwise [Дебет=null,Кредит=null],c=a&b][c]), to=Table.FromRecords(lst) in to
Как вариант - убрать в коде вообще все суммирования, по примеру вроде как они не нужны, и думаю что PQ их тоже не делает и поэтому ошибок нет. А на практике - проще вручную заменить все точки на свой разделитель. Даже на ту же точку, если точка.
Как вариант - убрать в коде вообще все суммирования, по примеру вроде как они не нужны, и думаю что PQ их тоже не делает и поэтому ошибок нет. А на практике - проще вручную заменить все точки на свой разделитель. Даже на ту же точку, если точка.Hugo
Вообще суммирование нужно, потому что Вы ведь не делаете для каждого кода свой столбец! Берите вариант на PQ - оно быстро, только думаю сложнее применить, но зато не ругается пока на разделители. Может у себя внутри игнорирует?
Вообще суммирование нужно, потому что Вы ведь не делаете для каждого кода свой столбец! Берите вариант на PQ - оно быстро, только думаю сложнее применить, но зато не ругается пока на разделители. Может у себя внутри игнорирует?Hugo
конкретный вариант тянет первое вхождение из каждой группы - я предполагал, что 1 группа = 1 проводка; если надо - можно еще и общую группировку добавить
конкретный вариант тянет первое вхождение из каждой группы - я предполагал, что 1 группа = 1 проводка; если надо - можно еще и общую группировку добавитьпрохожий2019
Сейчас сделаю без суммирования, заодно и памяти поменьше съест. Готово: [vba]
Код
Sub tt() Dim a, el, i&, t$
a = ActiveSheet.UsedRange.Columns(1).Resize(, 3).Value
With CreateObject("Scripting.Dictionary") For Each el In Array(510101, 510102, 510103) .Item(el) = 0& Next For i = 2 To UBound(a) If Len(a(i, 2)) = 0 Then t = a(i, 1) If .exists(a(i, 1)) Then .Item(t & "d") = a(i, 2) .Item(t & "c") = a(i, 3) End If Next
a = [i3].CurrentRegion.Value For i = 2 To UBound(a) a(i, 2) = .Item(a(i, 1) & "d") a(i, 3) = .Item(a(i, 1) & "c") Next [i3].CurrentRegion.Value = a End With End Sub
[/vba] При выгрузке удивительным образом строка с неэкселевым разделителем превращается в число с экселевым!
Сейчас сделаю без суммирования, заодно и памяти поменьше съест. Готово: [vba]
Код
Sub tt() Dim a, el, i&, t$
a = ActiveSheet.UsedRange.Columns(1).Resize(, 3).Value
With CreateObject("Scripting.Dictionary") For Each el In Array(510101, 510102, 510103) .Item(el) = 0& Next For i = 2 To UBound(a) If Len(a(i, 2)) = 0 Then t = a(i, 1) If .exists(a(i, 1)) Then .Item(t & "d") = a(i, 2) .Item(t & "c") = a(i, 3) End If Next
a = [i3].CurrentRegion.Value For i = 2 To UBound(a) a(i, 2) = .Item(a(i, 1) & "d") a(i, 3) = .Item(a(i, 1) & "c") Next [i3].CurrentRegion.Value = a End With End Sub
[/vba] При выгрузке удивительным образом строка с неэкселевым разделителем превращается в число с экселевым! Hugo