И вам это удобнее и понятнее чем макросом? xD Я когда такие формулы вижу мне плохо становится) [moder]Для оффтопа есть специальный тег[/moder]
И вам это удобнее и понятнее чем макросом? xD Я когда такие формулы вижу мне плохо становится) [moder]Для оффтопа есть специальный тег[/moder]excelhelprus
Сообщение отредактировал Pelena - Пятница, 24.04.2015, 10:30
excelhelprus, конечно формула длинная, хотел бы в ней разобраться.
Главное проблема решена и работает
А в макросах есть проблема, они нагружают систему сильнее, чем стандартные формулы.
Но если для данного примера, Вы сможете написать макрос, то буду также весьма благодарен. Было бы очень интересно)) Век живи - хоть немного поучись...
excelhelprus, конечно формула длинная, хотел бы в ней разобраться.
Главное проблема решена и работает
А в макросах есть проблема, они нагружают систему сильнее, чем стандартные формулы.
Но если для данного примера, Вы сможете написать макрос, то буду также весьма благодарен. Было бы очень интересно)) Век живи - хоть немного поучись...Baykal
Сообщение отредактировал Baykal - Пятница, 24.04.2015, 11:13
в макросах есть проблема, они нагружают систему сильнее, чем стандартные формулы (с) Совершенно ошибочное мнение. Все ровно наоборот. Если вы растянете эту формулу здоровую на 10 тысяч строк и несколько столбцов - ваш комп умрет. А если делать макросом - то он разок посчитает, зато потом все будет быстро работать [vba]
Код
Sub asdjas() lastrow1 = Sh1.Range("E" & Rows.Count).End(xlUp).Row lastrow2 = Sh1.Range("F" & Rows.Count).End(xlUp).Row lastrow3 = Sh1.Range("G" & Rows.Count).End(xlUp).Row If lastrow1 > 1 Then For i = 2 To lastrow1 Название1 = Sh1.Cells(i, "E") If lastrow2 > 1 Then For j = 2 To lastrow2 Название2 = Название1 & " " & Sh1.Cells(j, "F") If lastrow3 > 1 Then For k = 2 To lastrow3 Sh1.Cells(Sh1.Range("H" & Rows.Count).End(xlUp).Row + 1, "H") = Название2 & " " & Sh1.Cells(k, "G") Next End If Sh1.Cells(Sh1.Range("H" & Rows.Count).End(xlUp).Row + 1, "H") = Название2 Next End If Sh1.Cells(Sh1.Range("H" & Rows.Count).End(xlUp).Row + 1, "H") = Название1 Next End If End Sub
[/vba]
в макросах есть проблема, они нагружают систему сильнее, чем стандартные формулы (с) Совершенно ошибочное мнение. Все ровно наоборот. Если вы растянете эту формулу здоровую на 10 тысяч строк и несколько столбцов - ваш комп умрет. А если делать макросом - то он разок посчитает, зато потом все будет быстро работать [vba]
Код
Sub asdjas() lastrow1 = Sh1.Range("E" & Rows.Count).End(xlUp).Row lastrow2 = Sh1.Range("F" & Rows.Count).End(xlUp).Row lastrow3 = Sh1.Range("G" & Rows.Count).End(xlUp).Row If lastrow1 > 1 Then For i = 2 To lastrow1 Название1 = Sh1.Cells(i, "E") If lastrow2 > 1 Then For j = 2 To lastrow2 Название2 = Название1 & " " & Sh1.Cells(j, "F") If lastrow3 > 1 Then For k = 2 To lastrow3 Sh1.Cells(Sh1.Range("H" & Rows.Count).End(xlUp).Row + 1, "H") = Название2 & " " & Sh1.Cells(k, "G") Next End If Sh1.Cells(Sh1.Range("H" & Rows.Count).End(xlUp).Row + 1, "H") = Название2 Next End If Sh1.Cells(Sh1.Range("H" & Rows.Count).End(xlUp).Row + 1, "H") = Название1 Next End If End Sub
Serge_007, заранее прошу прощения за глупый вопрос, пользовательская функция и макрос - одно и тоже или нет?
Это в продолжении тормозов. Может не правильно выразился. Написали свою формулу "ВПР", но на 60000 строках она не сработала(зависла программа), а обычная "ВПР" спустя 5 мин сделала то, что от нее требовали.
Serge_007, заранее прошу прощения за глупый вопрос, пользовательская функция и макрос - одно и тоже или нет?
Это в продолжении тормозов. Может не правильно выразился. Написали свою формулу "ВПР", но на 60000 строках она не сработала(зависла программа), а обычная "ВПР" спустя 5 мин сделала то, что от нее требовали.Baykal
Написали свою формулу "ВПР", но на 60000 строках она не сработала(зависла программа), а обычная "ВПР" спустя 5 мин сделала
Весь вопрос именно с написали свою UFD "ВПР". Если был выбран неверный алгоритм поиска (например, полный перебор с начала списка по каждому значению, без предварительной оптимизации данных, неиспользование regexp и т.д.) - то, конечно, такая "ВПР" может считать до конца столетия. Дело в том, что "встроенные" функции все же оптимизированы для конкретных условий (незря они имеют многие ограничения), плюс способны общаться с исходными данными в большинстве случаев намного быстрее, чем "стандартно доступные/вычитанные в инете" пользователю кусочки макросов. И просто "запрограммировать выдуманный из головы свой метод" не так-то легко. Другое дело, что профессионалы уже много чего по этой теме обычно знают, и в конкретном приложении к конкретной структуре ваших данныхправильно написанные макросы будут выигрывать всегда (по общей нагрузке на систему/затратам времени на пересчеты), особенно на больших объемах данных. Другое дело, что для UDF приходится ещё придумывать интерфейс использования (ведь надо же код как-то вызвать, да ещё и пользователю это должно быть удобно, понятно и "прозрачно" в каждый момент), в отличие от встроенных средств формул, с которыми конечный пользователь более-менее знаком.
Написали свою формулу "ВПР", но на 60000 строках она не сработала(зависла программа), а обычная "ВПР" спустя 5 мин сделала
Весь вопрос именно с написали свою UFD "ВПР". Если был выбран неверный алгоритм поиска (например, полный перебор с начала списка по каждому значению, без предварительной оптимизации данных, неиспользование regexp и т.д.) - то, конечно, такая "ВПР" может считать до конца столетия. Дело в том, что "встроенные" функции все же оптимизированы для конкретных условий (незря они имеют многие ограничения), плюс способны общаться с исходными данными в большинстве случаев намного быстрее, чем "стандартно доступные/вычитанные в инете" пользователю кусочки макросов. И просто "запрограммировать выдуманный из головы свой метод" не так-то легко. Другое дело, что профессионалы уже много чего по этой теме обычно знают, и в конкретном приложении к конкретной структуре ваших данныхправильно написанные макросы будут выигрывать всегда (по общей нагрузке на систему/затратам времени на пересчеты), особенно на больших объемах данных. Другое дело, что для UDF приходится ещё придумывать интерфейс использования (ведь надо же код как-то вызвать, да ещё и пользователю это должно быть удобно, понятно и "прозрачно" в каждый момент), в отличие от встроенных средств формул, с которыми конечный пользователь более-менее знаком.
Просто информацию по "тормозам" не из головы взял, не просто в интернете прочитал комментарии новичков. Данная проблема описана в умной книге, одного американского программиста VBA.
Главный его совет звучит примерно так: "Если есть возможность решить проблему при помощи стандартных возможностей Excel, то не нужно изобретать велосипед, а изучайте лучше Excel"
Но Ваш комментарий наоборот подталкивает на более глубокое изучение VBA. Спасибо) Надеюсь хватит ума, смекалки и логики.
AndreTM, спасибо за развернутый ответ.
Просто информацию по "тормозам" не из головы взял, не просто в интернете прочитал комментарии новичков. Данная проблема описана в умной книге, одного американского программиста VBA.
Главный его совет звучит примерно так: "Если есть возможность решить проблему при помощи стандартных возможностей Excel, то не нужно изобретать велосипед, а изучайте лучше Excel"
Но Ваш комментарий наоборот подталкивает на более глубокое изучение VBA. Спасибо) Надеюсь хватит ума, смекалки и логики.Baykal
Baykal, тут как раз этот программист может быть и неправ. Хотя, возможно, это читатели неверно интерпретируют его слова. Первое - как пользователь может сделать вывод о том, что проблему можно решить средствами Excel, если он не знает этих средств или возможностей? Второе - недопонимание пользователями области применимости методов. Например, автор говорит "мы можем одной функцией =СУММ() быстро просуммировать 100500 разных ячеек листа, и получить результат (в одну ячейку)". Пользователь же начинает думать, что так же быстро должны работать 100500 результирующих ячеек с формулой =СУММ(), в качестве ргументов для которых выступают всего по несколько ячеек...
Baykal, тут как раз этот программист может быть и неправ. Хотя, возможно, это читатели неверно интерпретируют его слова. Первое - как пользователь может сделать вывод о том, что проблему можно решить средствами Excel, если он не знает этих средств или возможностей? Второе - недопонимание пользователями области применимости методов. Например, автор говорит "мы можем одной функцией =СУММ() быстро просуммировать 100500 разных ячеек листа, и получить результат (в одну ячейку)". Пользователь же начинает думать, что так же быстро должны работать 100500 результирующих ячеек с формулой =СУММ(), в качестве ргументов для которых выступают всего по несколько ячеек...AndreTM
Сравнится. В моем примере (скажем, когда надо просуммировать 10 столбцов по каждой строке, на миллионе строк) может оказаться быстрее использование ADO с соответствующим запросом. Не говоря уже о случаях, когда нужно получать данные из кучи закрытых книг. Кроме того, на больших объемах - вступает в силу проблема перенасыщения книги формулами. Вообще, хороший метод проверки - запустить книгу с фомулами на офисе03 и селероне десятилетней давности... и убедиться, что скорость работы макросов (правильных) почти не отличается, а вот расчёта формул...
Сравнится. В моем примере (скажем, когда надо просуммировать 10 столбцов по каждой строке, на миллионе строк) может оказаться быстрее использование ADO с соответствующим запросом. Не говоря уже о случаях, когда нужно получать данные из кучи закрытых книг. Кроме того, на больших объемах - вступает в силу проблема перенасыщения книги формулами. Вообще, хороший метод проверки - запустить книгу с фомулами на офисе03 и селероне десятилетней давности... и убедиться, что скорость работы макросов (правильных) почти не отличается, а вот расчёта формул... AndreTM
AndreTM, честное слово заинтриговали))) Повторюсь я в этом не то что новичок, а салага и то это не то слово) И возможно, что несу бред и только не подумайте, что хочу что-то доказать или оспорить) Просто тема интересная.
Вот что пишет этот человек. Цитата из книги:
"Функция СУММ обрабатывает все типы аргументов: -ссылка на одну ячейку -символьное значение -строка, которая выглядит как числовое значение -логическое значение ИСТИНА -выражение, использующее другую функцию -ссылка на диапазон."
Ниже он пишет код в VBA и говорит, что его формула также обрабатывает все типы аргументов, но по скорости выполнения она в сотни раз медленнее.
Прокомментируйте пожалуйста данную фразу)
Спасибо.
AndreTM, честное слово заинтриговали))) Повторюсь я в этом не то что новичок, а салага и то это не то слово) И возможно, что несу бред и только не подумайте, что хочу что-то доказать или оспорить) Просто тема интересная.
Вот что пишет этот человек. Цитата из книги:
"Функция СУММ обрабатывает все типы аргументов: -ссылка на одну ячейку -символьное значение -строка, которая выглядит как числовое значение -логическое значение ИСТИНА -выражение, использующее другую функцию -ссылка на диапазон."
Ниже он пишет код в VBA и говорит, что его формула также обрабатывает все типы аргументов, но по скорости выполнения она в сотни раз медленнее.