Доброго времени суток, уважаемые форумчане! Возникла проблема, с которой хочу к вам обратиться. Есть таблица, в которую загружаются данные по клиентам (лист "Данные"), нужно рассчитать период задолженности (сколько месяцев просрочки, гр.14"N") и период задолженности в днях (гр.16 "P"), после чего, перенести полученные данные, на лист "Результат". Что сделано: На листе "Данные" в гр. 10-15 (J - Q), стоят формулы, которые рассчитываются каждую строку отдельно, по каждой сумме. Теперь необходимо, с листа "Данные", перенести суммы, сгруппировав по клиентам. Группировку по клиентам, я сделал путем сводной таблицы (Лист1 гр.1-3"A-C"), полученные значения (счет, Тип, ИНН), перенес на лист Результат", после, сцепил эти значения (счет, Тип, ИНН), получив уникальное значение (Лист "Результат" гр.4"D", такой же как и на листе "Данные", сцепил "счета ДЗ" + "Тип" + "ИНН", в гр.12"L"). Затем, на листе "Результат", в каждой ячейке в гр.9-32"I-AF", прописал формулу "суммеслимн" и в каждую строку. С формулами, у меня получилось, но файл стал громадным и компьютер зависал при его расчетах (в реальной таблице, более 100'000 строк). Возможно это переложить на макрос (перенос значений, а именно, замена функции "суммеслимн")?
Доброго времени суток, уважаемые форумчане! Возникла проблема, с которой хочу к вам обратиться. Есть таблица, в которую загружаются данные по клиентам (лист "Данные"), нужно рассчитать период задолженности (сколько месяцев просрочки, гр.14"N") и период задолженности в днях (гр.16 "P"), после чего, перенести полученные данные, на лист "Результат". Что сделано: На листе "Данные" в гр. 10-15 (J - Q), стоят формулы, которые рассчитываются каждую строку отдельно, по каждой сумме. Теперь необходимо, с листа "Данные", перенести суммы, сгруппировав по клиентам. Группировку по клиентам, я сделал путем сводной таблицы (Лист1 гр.1-3"A-C"), полученные значения (счет, Тип, ИНН), перенес на лист Результат", после, сцепил эти значения (счет, Тип, ИНН), получив уникальное значение (Лист "Результат" гр.4"D", такой же как и на листе "Данные", сцепил "счета ДЗ" + "Тип" + "ИНН", в гр.12"L"). Затем, на листе "Результат", в каждой ячейке в гр.9-32"I-AF", прописал формулу "суммеслимн" и в каждую строку. С формулами, у меня получилось, но файл стал громадным и компьютер зависал при его расчетах (в реальной таблице, более 100'000 строк). Возможно это переложить на макрос (перенос значений, а именно, замена функции "суммеслимн")?amadeus017
Главная задача все же, это перенос данных на другой лист, макросом (замена формулы "суммеслимн") [moder]Почему тогда вопрос не в разделе по макросам? Перенесла[/moder]
Главная задача все же, это перенос данных на другой лист, макросом (замена формулы "суммеслимн") [moder]Почему тогда вопрос не в разделе по макросам? Перенесла[/moder]amadeus017
Сообщение отредактировал Pelena - Воскресенье, 01.11.2015, 11:47
Задача сводится к тому, что на лист "Результат", нужно разнести по колонкам (графам) данные из листа "Данные". На данный момент, в каждой ячейки стоит формула, "суммеслимн", которую и хочется заменить макросом (чтоб комп не зависал). Все остальное, можно сделать вручную (все, что до переноса данных).
Задача сводится к тому, что на лист "Результат", нужно разнести по колонкам (графам) данные из листа "Данные". На данный момент, в каждой ячейки стоит формула, "суммеслимн", которую и хочется заменить макросом (чтоб комп не зависал). Все остальное, можно сделать вручную (все, что до переноса данных).amadeus017
Sub ertert() Dim x, y(), i&, rw&, k$ x = Range("A2:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
With Sheets("Результат") x = .Range("A7:C" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With ReDim y(1 To UBound(x), 1 To 24)
With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 1 To UBound(x, 1) k = x(i, 1) & x(i, 3) & x(i, 2) 'Счет ДЗ - Тип - ИНН .Item(k) = i Next i
With Sheets("Данные") x = .Range("A10:N" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With For i = 1 To UBound(x, 1) k = x(i, 1) & x(i, 2) & x(i, 10) If .Exists(k) Then rw = .Item(k) y(rw, x(i, 14)) = y(rw, x(i, 14)) + x(i, 9) End If Next i End With
With Sheets("Результат") .Range("I7").Resize(UBound(y), 24).Value = y .Activate End With End Sub
[/vba]
amadeus017, привет попробуйте так: [vba]
Код
Sub ertert() Dim x, y(), i&, rw&, k$ x = Range("A2:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
With Sheets("Результат") x = .Range("A7:C" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With ReDim y(1 To UBound(x), 1 To 24)
With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 1 To UBound(x, 1) k = x(i, 1) & x(i, 3) & x(i, 2) 'Счет ДЗ - Тип - ИНН .Item(k) = i Next i
With Sheets("Данные") x = .Range("A10:N" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With For i = 1 To UBound(x, 1) k = x(i, 1) & x(i, 2) & x(i, 10) If .Exists(k) Then rw = .Item(k) y(rw, x(i, 14)) = y(rw, x(i, 14)) + x(i, 9) End If Next i End With
With Sheets("Результат") .Range("I7").Resize(UBound(y), 24).Value = y .Activate End With End Sub
что-то получилось! Попробовал пару раз на маленькой таблице, все работает, надо попробовать на большой. nilem Большое спасибо за помощь новичку!!!
что-то получилось! Попробовал пару раз на маленькой таблице, все работает, надо попробовать на большой. nilem Большое спасибо за помощь новичку!!!amadeus017
Не видел, сделал свой вариант - похожий, но другой: [vba]
Код
Option Explicit
Sub tt() Dim a(), b(), c(), d As Object, i&, ii&, iL&, t$
Set d = CreateObject("scripting.dictionary"): d.comparemode = 1 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
With Sheets("Данные") If .FilterMode Then .ShowAllData iL = .Range("L" & .Rows.Count).End(xlUp).Row a = .Range(.Range("I10"), .Range("I" & iL)).Value b = .Range(.Range("L10"), .Range("L" & iL)).Value c = .Range(.Range("N10"), .Range("N" & iL)).Value End With
For i = 1 To UBound(a) t = b(i, 1) & "|" & c(i, 1) d.Item(t) = d.Item(t) + a(i, 1) Next Erase b, c
With Sheets("Результат") If .FilterMode Then .ShowAllData iL = .Range("D" & .Rows.Count).End(xlUp).Row a = .Range(.Range("D7"), .Range("D" & iL)).Value For i = 9 To 33 t = .Cells(5, i) For ii = 1 To UBound(a) .Cells(ii + 6, i) = d.Item(a(ii, 1) & "|" & t) Next: Next End With
[/vba] На второй массив не хватило тепения :) Но можно добавить, если вдруг понадобится ускорить.
Не видел, сделал свой вариант - похожий, но другой: [vba]
Код
Option Explicit
Sub tt() Dim a(), b(), c(), d As Object, i&, ii&, iL&, t$
Set d = CreateObject("scripting.dictionary"): d.comparemode = 1 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
With Sheets("Данные") If .FilterMode Then .ShowAllData iL = .Range("L" & .Rows.Count).End(xlUp).Row a = .Range(.Range("I10"), .Range("I" & iL)).Value b = .Range(.Range("L10"), .Range("L" & iL)).Value c = .Range(.Range("N10"), .Range("N" & iL)).Value End With
For i = 1 To UBound(a) t = b(i, 1) & "|" & c(i, 1) d.Item(t) = d.Item(t) + a(i, 1) Next Erase b, c
With Sheets("Результат") If .FilterMode Then .ShowAllData iL = .Range("D" & .Rows.Count).End(xlUp).Row a = .Range(.Range("D7"), .Range("D" & iL)).Value For i = 9 To 33 t = .Cells(5, i) For ii = 1 To UBound(a) .Cells(ii + 6, i) = d.Item(a(ii, 1) & "|" & t) Next: Next End With
Добрался до форума, чтобы посмотреть на мою тему и выразить всем свою благодарность за проделанную Вами, работу! nilem Помогли с макросом, который я сегодня попробовал в работе, пока все устраивает.
Добрался до форума, чтобы посмотреть на мою тему и выразить всем свою благодарность за проделанную Вами, работу! nilem Помогли с макросом, который я сегодня попробовал в работе, пока все устраивает.amadeus017