|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
День добрый! Есть функция, которая ищет данные в массиве. Если передавать массив с заданным диапазоном (имею ввиду такой диапазон "A1:C10", то функция работает нормально. Но если пытаюсь передать "A:C". то функция не работает. Как исправить, подскажите, пожалуйста Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 09:40 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Почемучка-220, я бы сказал, что эта функция может работать нормально только при удачном стечении обстоятельств :) И чем Вас не устраивает обычная функция листа ВПР с тем же первым аргументом "*"&txt&"*" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 10:09 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
вероятно потому, что переменная i имеет тип Integer ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 10:09 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Shocker.Proвероятно потому, что переменная i имеет тип Integerразве Код: vbnet 1.
будет vbInteger ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 10:50 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
hclubmk, откуда ж я знаю, я не вижу ее объявления. А автор считает, что по фразе "то функция не работает" мы все дружно догадались, какая у него возникает ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 11:01 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Shocker.Pro, MSDN LBound Function Returns a Long containing the smallest available subscript for the indicated dimension of an array. Почемучка-220, Не лучше ли для перебора использовать конструкцию Код: vbnet 1.
? ну и соответственно, исходя из того, что Код: vbnet 1.
продолжать свои вычисления ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 11:13 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
hclubmkНе лучше ли для перебора использовать конструкциюлучше вообще не пользоваться перебором для такого огромного диапазона, Find будет работать гораздо быстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 11:27 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Хороший вариант. Но я бы вообще отвязался от работы с Range, и работал бы с массивом (если уж речь зашла о больших диапазонах с данными) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 12:15 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
hclubmk, Хороший, вариант. Обязательно попробую. Ошибки как таковой нет, просто висннт компьютер и все... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 12:55 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
kos20просто висннт компьютер и все..просто подождите подольше, он не виснет, он перебирает, а это очень долго ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 13:04 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
kos20, Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 13:39 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
И сколько памяти сожрет массив в несколько миллионов строк? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 13:57 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Shocker.ProИ сколько памяти сожрет массив в несколько миллионов строк? ))исходя из размерности типа Variant. Если работать с цифровыми значениями - тогда несколько десятков мегабайт, если со строками - тут уж от длин строк зависит. Если речь идет об экономичном расходовании/выделении памяти - никто не против - жертвуйте процессорным (и своим кстати тоже) временем: каждому своё. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 14:36 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
В любом случае, я думаю, что вряд ли будут заполнены все доступные несколько миллионов ячеек, так что устраивать подобный цикл (по ячейкам или по массиву) - непродуктивный расход времени, поэтому Find кажется тут наиболее оптимальным вариантом. Ну или, как вариант, соотноситься с UsedRange (собственно, несложно добавить Intersect) или останавливаться после некоторого количества пустых значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 15:16 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Shocker.ProIntersect...точнее Union (или как его там) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 15:17 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Ну уж не знаю. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68.
у меня find проиграл во всех случаях заполнения таблицы. Единственный недостаток, который в общем-то никто и не отрицает - это большой объем расходуемой памяти (но об этом было выше). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 16:56 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
У тебя область заполнения и область обработки совпадают. Я же немножко о другом. Обрати внимание:Почемучка-220Но если пытаюсь передать "A:C"то есть автор пытается просматривать в цикле полностью столбец. При этом реально заполнено может быть ну пусть несколько тысяч строк. И вот тут уже fooFind тут дает фору на порядок И еще момент - ты пытаешься искать среди чисел. Когда я заполнил ячейки текстом (а, полагаю, у автора именно текст), метод fooFind стал работать в два раза быстрее )) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 18:00 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Немного изменил: заполняем каждую 10-ю ячейку; заполняем текстом; ищем в диапазоне "A:C" Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
в процедурах FooFind и LikeInArray в качестве подстроки для поиска использовал "t0,123" результат: Immediate1003,906msec in fooFind 753,9063msec in likeInArrayи этот результат (проигрыш find) повторяется, как ни заполняй и исследуй диапазон. По карайней мере - у меня.Shocker.ProКогда я заполнил ячейки текстом (а, полагаю, у автора именно текст), метод fooFind стал работать в два раза быстрее )) для меня это остается загадкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2015, 10:21 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
hclubmkи этот результат (проигрыш find) повторяется, как ни заполняй и исследуй диапазон. По карайней мере - у меня.ты создаешь UsedRange с миллионом строк и почти весь его обрабатываешь. Есть строк десять тысяч - то Find будет работать на порядок быстрее, если тысяча - на два порядка. Но Find добивается такой скорости за счет внутреннего анализа UsedRange, я полагаю. Так что оптимальным будет твой алгоритм с массивом, который предварительно усекает диапазон до UsedRange. hclubmkдля меня это остается загадкой.почему? Find-у не приходится делать лишнее преобразование числа в текст для каждой ячейки ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2015, 12:48 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
10000 строк Immediate39,0625msec in fooFind 19,53125msec in likeInArray1000 строкImmediate7,8125msec in fooFind 3,90625msec in likeInArrayЗагадка кроется в том, что по твоим утверждениям, вызов методов объектной модели ExcelApplication происходит быстрее, чем работа напрямую с массивом. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2015, 13:33 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
Вообще даже в начальном варианте функции очень напрашивается Exit For после этой строки: dd = v(i, j + ColumnCount) hclubmkвызов методов объектной модели ExcelApplication происходит быстрее не совсем верно. Вызов будет медленнее, чем обращение с массивом. Но вот сам поиск значения через Find на таких массивах будет быстрее. Тем более, что здесь надо искать только одно значение и завершать цикл. Плюс Shocker.Pro правильно упомянул про память. Дело в том, что не все ПК(особенно 32-разрядные) могут выделить достаточно памяти под большой массив вроде A:C. Что вызовет ошибку Out of memory и как следствие выход из функции с ошибкой #ЗНАЧ! Если же массив определяется заданной размерностью или хотя бы так: Код: vbnet 1. 2. 3. 4.
и при этом надо вернуть более одного совпадения - то массивы несомненно выигрывают. Особенно, если учесть тот факт, что FindNext не работает при вызове из функций листа :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2015, 10:02 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
The_PristThe_Pristhclubmkвызов методов объектной модели ExcelApplication происходит быстрее вырвано из контекста, и теперь выглядит как неверно истолкованное. Без отрыва же от контекста - смысловая нагрузка лежит на том, что стоило бы усомниться в быстродействии методов, предложенных оппонентом, который настаивает на том, что ты процитировал. О памяти и о размерности массивов обсуждалось выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2015, 13:47 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
hclubmk, из какого же контекста я вырвал? Вот весь текст того сообщения: hclubmkЗагадка кроется в том, что по твоим утверждениям, вызов методов объектной модели ExcelApplication происходит быстрее, чем работа напрямую с массивом . И чего я здесь вырвал не так? Или я этой цитатой кого-то в чем-то обвинял? Нет. Я вырвал ровно ту фразу, которую хотел процитировать, без обращения к кому-то конкретно. Что до этой фразы и контекста. Само твое толкование мыслей Shocker.Pro не очень верное(могу ошибаться). Вызов модели Excel из VBA никак не может быть быстрее обращения к массиву, это не секрет. Суть-то в ином: обращение идет ОДИН РАЗ для вызова метода, т.к. найти надо только одно значение. Перебор же массива смешанных данных может значительно проиграть в скорости, даже с форой в виде времени, затраченного на вызов из объектной модели Excel. И Shocker.Pro говорил про то, что перебор миллиона строк будет медленнее, чем Find, если заполненных строк всего 200. Перебираешь-то ты весь массив, даже если большая часть там пуста. Плюс неверно приведен текст fooFind, т.к. туда зачем-то цикл воткнут Do While, что не отвечает изначальным условиям поиска только первого найденного. Процедура должна выглядеть так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А общий текст процедур с поиском по тексту такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
В таком виде можете убедиться сами в том, что для поиска первого(одного) совпадения Find вполне себе выигрывает. Подчеркну: для поиска первого совпадения . Для поиска всех в любом случае будет лучше подходить перебор массива(но на больших массивах у ПК может просто не хватить памяти для обработки сразу всего массива). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 11:19 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
The_Pristиз какого же контекста я вырвал?Сравни:hclubmkвызов методов объектной модели ExcelApplication происходит быстрееhclubmk по твоим утверждениям , вызов методов объектной модели ExcelApplication происходит быстрееЧувствуешь разницу? Если нет, значит нет. The_PristВообще даже в начальном варианте функции очень напрашивается Exit For после этой строки: Исходя из этого Exit For ты ставишь под сомнение ход предыдущих решений. Согласен, Exit For напрашивается с вероятность ~50%, но где об этом сказано у ТС, что ему нужно найти первое соответствие? Тут можно сказать, что ТС хотел найти последнее значение, и возразить: если бы последнее, то почему тогда не пошел по пути обратного цикла Step -1? И т.д и т.п. В общем, всё в стиле: небезызвестный персонажОстальное додумаете сами. Я исходил из тех условий задачи, которые озвучил прописал ТС, ничего не додумывая. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 14:46 |
|
Почему возникает ошибка при пеердаче пареметра A:A
|
|||
---|---|---|---|
#18+
hclubmkЧувствуешь разницу?Почувствую, когда ты наконец прочитаешь то, что написано, а не то, что ты пытаешься додумать. Я ни к кому в своем сообщении не обращался. Или тебя задело, что я не оставил в цитате твои домыслы об утверждениях Shocker.Pro, тем самым посчитав, что я тебе приписываю фразу "вызов методов объектной модели ExcelApplication происходит быстрее"? Таких мыслей не было, я читал переписку и видел кто что пишет. Я хотел подчеркнуть именно то предложение, которое планировал обсудить. Я написал, что никто не оспаривал тот факт, что обращение к объектной модели медленнее обращения к массиву. Shocker.Pro тебе другое вроде как хотел донести - глянь на мой код в последнем сообщении - я попытался наглядно там показать. Предлагаю обсуждать это, а не друг за друга выдумывать домыслы и утверждения :-) hclubmkИсходя из этого Exit For ты ставишь под сомнение ход предыдущих решенийЯ в отличие от тебя ничего не ставлю. Я лишь написал, что там напрашивается выход из цикла при нахождении совпадения, исходя из текста процедуры. И никаких утверждений о необходимости не делал. Я это автору темы написал, а не чтобы какие-то там сомнения создавать. hclubmkЯ исходил из тех условий задачи Я из них же. Но т.к. в любом случае возвращается одно значение - то Find можно вызывать один раз: Код: vbnet 1.
или Код: vbnet 1.
и тогда скорость значительно увеличится. И это будет более правильное сравнение Find и массивов для поиска и возврата одного значения. А про все значения я еще в первом сообщении написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 16:22 |
|
|
start [/forum/topic.php?fid=60&msg=39055973&tid=2155791]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 132ms |
0 / 0 |