Привет, Excelworld. Есть макрос который я называю перенос-разброс. Отличный макрос. Проблема в том, что он каждый раз работает со всем объёмом исходных данных и заново переносит-разбрасывает их в конечный лист. Длится всё это около 20 минут. Может можно как-то делать перенос-разброс выделив нужную область данных (всегда 15 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его? С VBA не дружу от слова совсем.
Привет, Excelworld. Есть макрос который я называю перенос-разброс. Отличный макрос. Проблема в том, что он каждый раз работает со всем объёмом исходных данных и заново переносит-разбрасывает их в конечный лист. Длится всё это около 20 минут. Может можно как-то делать перенос-разброс выделив нужную область данных (всегда 15 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его? С VBA не дружу от слова совсем.zegor
Option Compare Text Sub tt() tt_ = Timer r0_ = 2 c1_ = Cells(r0_, Columns.Count).End(1).Column c0_ = 1 n1_ = Cells(Rows.Count, c1_).End(3).Row - r0_ + 1 n0_ = Cells(Rows.Count, c0_).End(3).Row - r0_ + 1 ar1 = Cells(r0_, c1_).Resize(n1_) ar0 = Cells(r0_, c0_).Resize(n0_, c1_ - 2) Application.ScreenUpdating = 0 Application.Calculation = 3 Set slov = CreateObject("Scripting.Dictionary") Set slov1 = CreateObject("Scripting.Dictionary") slov1.CompareMode = 1 Set sh = Worksheets("zero") sh.Cells.Clear With slov For i = 1 To n1_ If Not slov1.Exists(ar1(i, 1)) Then qqq = slov1.Item(ar1(i, 1)) z_ = z_ + 1 zz_ = 0 For j = 1 To n0_ If ar1(i, 1) = ar0(j, 1) Or ar1(i, 1) = ar0(j, 2) Then zz_ = zz_ + 1 .Item(zz_) = WorksheetFunction.Index(ar0, j, 0) End If Next j If .Count Then sh.Cells(1, 1 + (z_ - 1) * (c1_ - 1)).Resize(zz_, 15) = Application.Transpose(Application.Transpose(.Items)) .RemoveAll End If End If Next i End With Application.Calculation = 1 Application.ScreenUpdating = 1 MsgBox Timer - tt_ End Sub
Option Compare Text Sub tt() tt_ = Timer r0_ = 2 c1_ = Cells(r0_, Columns.Count).End(1).Column c0_ = 1 n1_ = Cells(Rows.Count, c1_).End(3).Row - r0_ + 1 n0_ = Cells(Rows.Count, c0_).End(3).Row - r0_ + 1 ar1 = Cells(r0_, c1_).Resize(n1_) ar0 = Cells(r0_, c0_).Resize(n0_, c1_ - 2) Application.ScreenUpdating = 0 Application.Calculation = 3 Set slov = CreateObject("Scripting.Dictionary") Set slov1 = CreateObject("Scripting.Dictionary") slov1.CompareMode = 1 Set sh = Worksheets("zero") sh.Cells.Clear With slov For i = 1 To n1_ If Not slov1.Exists(ar1(i, 1)) Then qqq = slov1.Item(ar1(i, 1)) z_ = z_ + 1 zz_ = 0 For j = 1 To n0_ If ar1(i, 1) = ar0(j, 1) Or ar1(i, 1) = ar0(j, 2) Then zz_ = zz_ + 1 .Item(zz_) = WorksheetFunction.Index(ar0, j, 0) End If Next j If .Count Then sh.Cells(1, 1 + (z_ - 1) * (c1_ - 1)).Resize(zz_, 15) = Application.Transpose(Application.Transpose(.Items)) .RemoveAll End If End If Next i End With Application.Calculation = 1 Application.ScreenUpdating = 1 MsgBox Timer - tt_ End Sub
_Boroda_, предложенный вами макрос делает то же самое что и "старый". Открываю лист Zero, удаляю всё что в нём есть. Открываю Лист1, выделяю массив А57:О57, Alt+F8. Вижу что макрос работал с массивом А2:О57
Проблема в том, что он каждый раз работает со всем объёмом исходных данных и заново переносит-разбрасывает их в конечный лист.
Нужно что бы он "хватал" выделенную область (например я выделяю массив А57:О57) и перебрасывал в лист Zero только её. Те самые 15 столбцов. Но это одна строка, а их может выделяться и 50. Всё это для того что бы макрос не таскал всё что есть каждый раз заново по 20 минут.
_Boroda_, предложенный вами макрос делает то же самое что и "старый". Открываю лист Zero, удаляю всё что в нём есть. Открываю Лист1, выделяю массив А57:О57, Alt+F8. Вижу что макрос работал с массивом А2:О57
Проблема в том, что он каждый раз работает со всем объёмом исходных данных и заново переносит-разбрасывает их в конечный лист.
Нужно что бы он "хватал" выделенную область (например я выделяю массив А57:О57) и перебрасывал в лист Zero только её. Те самые 15 столбцов. Но это одна строка, а их может выделяться и 50. Всё это для того что бы макрос не таскал всё что есть каждый раз заново по 20 минут.zegor
_Boroda_, подскажите пожалуйста такую вещь- в предложенном вами макросе всё построено на том что рабочие столбцы это 1-15 а база имён в 17-ом столбце. Пытаюсь под свою книгу адаптировать. У меня рабочие столбцы 1-26 а база имён в столбце 60 (BH который). Ткните носом где заменить число что бы ваш макрос не выдавал ошибку Type mismatch. [vba]
[offtop]Да уж и не вспомню сейчас где взял макрос, давно это было. Разрослась "база данных" вот и стал он медленным.[/offtop]
_Boroda_, подскажите пожалуйста такую вещь- в предложенном вами макросе всё построено на том что рабочие столбцы это 1-15 а база имён в 17-ом столбце. Пытаюсь под свою книгу адаптировать. У меня рабочие столбцы 1-26 а база имён в столбце 60 (BH который). Ткните носом где заменить число что бы ваш макрос не выдавал ошибку Type mismatch. [vba]
12 минут макрос считает. И почему-то не 300 имён из столбца Q взял для сортировки а 251.
До меня дошло- прежний макрос, тот который корявый (просто уточняю), брал всё что видел и сортировал на листе zero из расчёта [vba]
Код
MyArr = Cells(2, 17).Resize(71).Value
[/vba] где я мог и 300 вместо 71 указать. Сейчас же, с новым макросом, я даже не представляю как это сделать. Дело в том что у меня почти тысяча имён для сортировки (столбец Q), и прежним макросом я отсекал по 300 имён для операции перенос-разброс. Делал это для того что бы 300 в лист zero, следующие 300 в лист zero1 шли и так далее. Прошу сильно не пинать за столь позднее уточнение и нюансы.
12 минут макрос считает. И почему-то не 300 имён из столбца Q взял для сортировки а 251.
До меня дошло- прежний макрос, тот который корявый (просто уточняю), брал всё что видел и сортировал на листе zero из расчёта [vba]
Код
MyArr = Cells(2, 17).Resize(71).Value
[/vba] где я мог и 300 вместо 71 указать. Сейчас же, с новым макросом, я даже не представляю как это сделать. Дело в том что у меня почти тысяча имён для сортировки (столбец Q), и прежним макросом я отсекал по 300 имён для операции перенос-разброс. Делал это для того что бы 300 в лист zero, следующие 300 в лист zero1 шли и так далее. Прошу сильно не пинать за столь позднее уточнение и нюансы.zegor
Не может такого быть. Что показал таймер, встроенный в макрос? На старенькой машине на данных из первого файла Ваш макрос дал результат 0,595, мой - 0,062. На работе (там хорошая машина) мой отрабатывал за 0,0027 Сколько строк у Вас в столбце А?
почему-то не 300 имён из столбца Q взял для сортировки а 251
Обратите внимание на покраску розовым в моем файле. Это задвоения. Зачем Вам выводить дважды одинаковые показатели? У меня такие задвоения убираются, вот 49 значений и ушло
можно как-то делать перенос-разброс выделив нужную область данных (всегда 15 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его?
Каким Вы представляете себе алгоритм поиска нужного блока? Ведь у Вас есть блок с парой Yuichi Tommy для Yuichi и для Tommy. Если Вам нужно добавить только Tommy, то как Вы эти блоки различать будете?
Не может такого быть. Что показал таймер, встроенный в макрос? На старенькой машине на данных из первого файла Ваш макрос дал результат 0,595, мой - 0,062. На работе (там хорошая машина) мой отрабатывал за 0,0027 Сколько строк у Вас в столбце А?
почему-то не 300 имён из столбца Q взял для сортировки а 251
Обратите внимание на покраску розовым в моем файле. Это задвоения. Зачем Вам выводить дважды одинаковые показатели? У меня такие задвоения убираются, вот 49 значений и ушло
можно как-то делать перенос-разброс выделив нужную область данных (всегда 15 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его?
Каким Вы представляете себе алгоритм поиска нужного блока? Ведь у Вас есть блок с парой Yuichi Tommy для Yuichi и для Tommy. Если Вам нужно добавить только Tommy, то как Вы эти блоки различать будете?_Boroda_
Пока 7628 . Запускаю Ваш последний макрос и Excel подвисает с сообщением в диспетчере задач Не отвечает. Процессор 2 ядра по 2,70 GHz, во время выполнения макроса грузит ЦП на 50%. ОЗУ 4 ГБ тоже где до 50%.
Каким Вы представляете себе алгоритм поиска нужного блока?
Предлагаю такой вариант. В файлике добавил даты, цепляемся за них и таким образом определяем нужный блок. Например на листе zero уже есть часть таблицы за период 28.04.17-02.05.17 Теперь нужно пренести данные за 03.05.17 в лист zero. Может так получится реализовать хотелки.
Пока 7628 . Запускаю Ваш последний макрос и Excel подвисает с сообщением в диспетчере задач Не отвечает. Процессор 2 ядра по 2,70 GHz, во время выполнения макроса грузит ЦП на 50%. ОЗУ 4 ГБ тоже где до 50%.
Каким Вы представляете себе алгоритм поиска нужного блока?
Предлагаю такой вариант. В файлике добавил даты, цепляемся за них и таким образом определяем нужный блок. Например на листе zero уже есть часть таблицы за период 28.04.17-02.05.17 Теперь нужно пренести данные за 03.05.17 в лист zero. Может так получится реализовать хотелки.zegor
В этот раз 16 минут считался. Никаких задвоений. 995 уникальных имён в столбце BH, раскидал в лист zero сколько влезло пока столбцы не закончились (606 имён). Как с остальными 389 быть? Макрос же не имеет границ по 60-му столбцу (который BH). Мне необходим этот лимит в 300 имён по столбцу BH. Не всё в один лист zero будет отправляться, а первых 300 в лист zero, следующие в zero2 и так все 995 имён. Для этого макрос просто дважды/трижды в лист вставлю, с другими конечными адресами (листами). Один и тот же массив просто разными вариантами одного макроса буду бросать, у каждого свой набор 300 имён.
В этот раз 16 минут считался. Никаких задвоений. 995 уникальных имён в столбце BH, раскидал в лист zero сколько влезло пока столбцы не закончились (606 имён). Как с остальными 389 быть? Макрос же не имеет границ по 60-му столбцу (который BH). Мне необходим этот лимит в 300 имён по столбцу BH. Не всё в один лист zero будет отправляться, а первых 300 в лист zero, следующие в zero2 и так все 995 имён. Для этого макрос просто дважды/трижды в лист вставлю, с другими конечными адресами (листами). Один и тот же массив просто разными вариантами одного макроса буду бросать, у каждого свой набор 300 имён.zegor
Рядом будет ещё лист для которого zero источник данных. Может это и неправильно иметь базовый лист, таскать и сортировать ещё в один лист и всё это ради работы уже в третьем, но я так себе это представляю. Всё ради группировки данных по каждому имени с которыми потом можно работать.
Рядом будет ещё лист для которого zero источник данных. Может это и неправильно иметь базовый лист, таскать и сортировать ещё в один лист и всё это ради работы уже в третьем, но я так себе это представляю. Всё ради группировки данных по каждому имени с которыми потом можно работать.zegor
Привет, Excelworld. Есть макрос который я называю перенос-разброс. Отличный макрос. Проблема в том, что он каждый раз работает со всем объёмом исходных данных и заново переносит-разбрасывает их в конечный лист. Длится всё это около 20 минут. Может можно как-то делать перенос-разброс выделив нужную область данных (всегда 26 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его? С VBA не дружу от слова совсем.
В файл добавлены даты, может по ним будет проще это осуществить? Видимо перенос выделенной курсором области это совсем фантастика. _Boroda_ пытался помочь но что-то как-то не вышло к сожалению. В приложенном файле макрос "tt" от _Boroda_ из сообщений выше, ниже "perenos_razbros" с которым просил помощи изначально. Какой из вариантов будет реализован не принципиально (возможно именно Ваш).
Привет, Excelworld. Есть макрос который я называю перенос-разброс. Отличный макрос. Проблема в том, что он каждый раз работает со всем объёмом исходных данных и заново переносит-разбрасывает их в конечный лист. Длится всё это около 20 минут. Может можно как-то делать перенос-разброс выделив нужную область данных (всегда 26 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его? С VBA не дружу от слова совсем.
В файл добавлены даты, может по ним будет проще это осуществить? Видимо перенос выделенной курсором области это совсем фантастика. _Boroda_ пытался помочь но что-то как-то не вышло к сожалению. В приложенном файле макрос "tt" от _Boroda_ из сообщений выше, ниже "perenos_razbros" с которым просил помощи изначально. Какой из вариантов будет реализован не принципиально (возможно именно Ваш).zegor
Во вложении. Сделал: - ветхозаветную оптимизацию кода. - наглядную агитацию - работу по выделению. А если выделена одна ячейка, то обработаются все ячейки в столбце 17, как было у Вас.
Привет!
Во вложении. Сделал: - ветхозаветную оптимизацию кода. - наглядную агитацию - работу по выделению. А если выделена одна ячейка, то обработаются все ячейки в столбце 17, как было у Вас.InExSu
Здравствуйте, InExSu. Спасибо за предложенное вами решение. Был приятно удивлен новым сообщением в теме. Но к сожалению
Цитата
Может можно как-то делать перенос-разброс выделив нужную область данных (всегда 15 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его?
не решается.
Ваш макрос перезаписывает конечный лист zero в любом случае. Когда я выделяю нужный массив (в приложенном файле будет выделен красным шрифтом), запускаю Ваш код, получаю полностью перезаписанный конечный лист с данными только из выделенного массива. То есть макрос не добавляет эти данные в лист zero к уже имеющимся там а наглухо сносит "предшественников". К тому же работает с именами только из первого столбца, второй имеет такое же значение (по именам из него так же должны формироваться свои блоки в листе zero). Есть ещё момент- в случае если в выделенном массиве повторяется значение (имя из первого столбца), макрос принимает его как уникальное и делает, по сути, дубликат уже имеющегося блока для этого имени в листе zero. Например для Yuichi в листе zero есть три одинаковых блока, нужно что бы для каждого имени был только один блок.
Ещё раз спасибо за внимание к моей проблеме.
Здравствуйте, InExSu. Спасибо за предложенное вами решение. Был приятно удивлен новым сообщением в теме. Но к сожалению
Цитата
Может можно как-то делать перенос-разброс выделив нужную область данных (всегда 15 столбцов, количество строк разное) которая будет добавляться в конечный лист а не перезаписывать его?
не решается.
Ваш макрос перезаписывает конечный лист zero в любом случае. Когда я выделяю нужный массив (в приложенном файле будет выделен красным шрифтом), запускаю Ваш код, получаю полностью перезаписанный конечный лист с данными только из выделенного массива. То есть макрос не добавляет эти данные в лист zero к уже имеющимся там а наглухо сносит "предшественников". К тому же работает с именами только из первого столбца, второй имеет такое же значение (по именам из него так же должны формироваться свои блоки в листе zero). Есть ещё момент- в случае если в выделенном массиве повторяется значение (имя из первого столбца), макрос принимает его как уникальное и делает, по сути, дубликат уже имеющегося блока для этого имени в листе zero. Например для Yuichi в листе zero есть три одинаковых блока, нужно что бы для каждого имени был только один блок.