|
|
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Есть полностью рабочий кода. Но работает медленно, но уверенно. Прошу подсказки - как сделать быстрее. Код: plaintext 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. Таким образом входящие - имя листа, индекс колонки и значение переменной. Исходящие - координаты ячейки. Колонки могут меняться местами по этому различаю колонки по индексам, т.е. по содержимому первой строки колонки. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 12:34:30 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Сначала я бы впихнул всю таблицу в массив нужной размерности, а потом обрабатывал. Получится порядка в 300 раз быстрее будет выполнятся код. Рыба ищет-где глубже, человек-где больше рыбы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 12:44:52 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
используй Find вместо пробега по колонкам и строкам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 12:51:33 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Не обижайся, замечания не только по ускорению: 1. для того чтоб было ясно все-таки, что делает функция, объясни, что "такое индекс объекта", "переменная" и т.д. 2. используй with Sheets(list) ... end with 3. вместо GoTo Lab1 , в частности лучше exit for . также и остальные goto нужно убрать. читать будет легче. 4. действительно, как написал vkodor , используй find (хотя это может случиться и медленнее, но попробовать стоит) 5. зачем iRow = Sheets(list).UsedRange.Row + Sheets(list).UsedRange.Rows.Count - 1 , а потом For i = 1 To iRow + 1 - лишнии операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 13:19:57 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
vbapro 4. действительно, как написал vkodor , используй find (хотя это может случиться и медленнее, но попробовать стоит) практика показывает что через Find быстрее интересно посмотреть случае когда медленей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 14:11:49 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
vkodor vbapro 4. действительно, как написал vkodor , используй find (хотя это может случиться и медленнее, но попробовать стоит) практика показывает что через Find быстрее интересно посмотреть случае когда медленей писал одно, думал другое :), find быстре, примера обратного у меня нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 14:40:01 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
To vkodor vkodorиспользуй Find вместо пробега по колонкам и строкам Я бы с радостью, но что - то у меня не получается. То-ли параметры не так задаю, то-ли что-то еще. Может есть какой примерчик (я не смог использовать тот, что в хелпе) To vbapro vbapro"индекс объекта" - если прочитать коментарии немного дальше, то становится ясно, - индекс это любой текст, находящийся в первой ячейке данной колонки. Поскольку места колонок могут меняться, то нужно (без задания именованых масивов) узнавать где-какая колонка. vbapro"переменная" - набор букв и цифр, который может принимать любое значение в заданных типом переменной пределах. В данном конкретном случае это то значение, которое содержит объект. vbapro"Объект"-в данном конкретном случае - ячейка на листе Итого - задача (написано в самом низу в первом посте) зная лист, значение первой ячейки в столбце и значение, которое находится внутри ячейки узнать абсолютные координаты ячейки, а именно номер столбца и номер строки. vbaproиспользуй with Sheets(list) ... end with Хорошо. А дает ли это ускорение или какие-то другие преимущества кроме более структурированного листинга? По поводу вашего пункта 3 - учту и сделаю По поводу пункта 4 смотрите выше По поводу пункта 5, действительно - лишняя операция. Не заметил. To k-nike k-nikeА еще у вас комментарии про колонки и столбцы перепутаны. Непонятно. Вместо авторrem Зная колонку ищем теперь столбец Читать Код: plaintext To All У меня есть пример, когда осуществляется поиск данных, и потом работа с ними, но примера с поиском данных, а потом получением координат этих данных на листе у меня нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 18:19:56 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Попробовал следующую конструкцию (по вашим образцам) для поиска текста в первой строке листа и определения его координат. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Все великолепно. Запускается, но находит "Empty" хотя данные точно есть. Та процедура, что была описана в начале поста великолепно их находит С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 18:49:00 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
To talgat talgatСначала я бы впихнул всю таблицу в массив нужной размерности, а потом обрабатывал. Получится порядка в 300 раз быстрее будет выполнятся код. Да-аа. Хочу посмотреть на массив во весь лист Excel, при том что листы всегда разные, и на листе до 600 столбцов и до 5000 строк. (бывают больше, бывают меньше). И это только для того, чтобы найти координаты ОДНОЙ ячейки на листе ? Быстрее процедура работать не станет, а вот медленнее точно. При том что на листе могут быть ка цифровые так и текстовые данные. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 18:55:47 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
vbaproНе обижайся, замечания не только по ускорению: 1. для того чтоб было ясно все-таки, что делает функция, объясни, что "такое индекс объекта", "переменная" и т.д.Это не надо объяснять. Надо имена переменным давать осмысленные. Не index, а IndexOfColumn или IndexOfValueInsideColumn. Писать чуть-чуть дольше, разбираться на порядок проще и ошибок меньше. vbapro2. используй with Sheets(list) ... end with Наоборот, не стоит это использовать. Когда в одном макросе много работаешь с With потом фиг поймешь к какому из объектов относится данная строка, приходится постоянно бегать вверх-вниз по тексту к with чтобы понять от чего мы собственно говоря берем with. А уж если начнешь делать вложеные with - получается такая каша... vbapro3. вместо GoTo Lab1 , в частности лучше exit for . также и остальные goto нужно убрать. читать будет легче.С этим согласен. vbapro4. действительно, как написал vkodor , используй find (хотя это может случиться и медленнее, но попробовать стоит)Стоит, стоит. Получится быстрее точно. vbapro5. зачем iRow = Sheets(list).UsedRange.Row + Sheets(list).UsedRange.Rows.Count - 1 , а потом For i = 1 To iRow + 1 - лишнии операции.Ну циклы там вообще не нужны.... 2betepon: 6. Если возвращаешь из процедуры значение через параметр - всегда указывай его явно ByRef. 7. Если нужно чего-то возвращать лучше делать функцию а не процедуру. 8. Использовать MsgBox внутри процедуры не очень хорошо. Если ты попытаешься искать несколько значений в цикле через свою процедуру, то на каждый чих пользователю прийдется нажимать кнопку. Лучше возвращать текст или объект, а потом при нужде либо показывать его на экран сразу через MsgBox или склеить несколько текстов от разных запусков процедуры и показать их все разом. На, развлекайся: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 19:49:00 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
если уж пошел разбор фрагмента чуть шире, чем просили :), то в процедуре есть еще подводный камень - индекс строк Integer. нужно всегда для строк делать Long без раздумий: память не экономится, а размера типа может нехватить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2006, 22:40:46 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Вроде разобрался - все не так сложно. Но есть вопрос по строке Код: plaintext Хочу разобраться. Я так понял что в этой строке создается Range из одной строки с номером 1, в котором производится поиск ColumnName. А зачем EntireColumn, и что оно такое. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 09:57:06 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Вроде разобрался - как оно работает - решил проверить. Ваш пример колонку не обнаруживает, хотя точно известно, что она есть. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 10:31:09 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Нет - все нормально. Разобрался - все работет. Ошибся при подгонке макроса к программе. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 10:37:25 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Вопрос по Код: plaintext не отменяю. (хочу научится) С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 10:38:56 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
т. к. rColumn обьявлен как range EntireColumn - возвращает столбец т.е. допустим ColumnName найдено в столбце "D" диапозона ws.UsedRange.Rows(1). следовательно rColumn = ws.Range("D:D") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 10:45:52 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Ага. Спасибо. Теперь понял. Огромное спасибо всем откликнувшимся. Стало работать заметно быстрее. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 13:16:31 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
beteponВроде разобрался - все не так сложно. Но есть вопрос по строке Код: plaintext Я так понял что в этой строке создается Range из одной строки с номером 1, в котором производится поиск ColumnName. А зачем EntireColumn, и что оно такое. Вопрос "что оно такое" надо смотреть во встроенном хелпе. Там все четко и ясно написано. Запускаешь VBA, нажимаешь F1 и ищешь непонятное слово. А вообще, пойми одну простую вещь - любой Range это множество. И как любое множество, ты можешь разбить на маленькие множества, так и любой Range, ты можешь разбить на маленькие Range. При этом адресация ячеек внутри Range всегда соответсвет самому Range от которого берется, а не листу! В данном случае: UsedRange дает тебе область на листе в которой есть данные. UsedRange.Rows(1) даст тебе первую строку области в которой есть данные. Причем это не полная строка! Если у тебя UsedRange имеет адрес относительно листа C3:F10, то UsedRange.Rows(1) даст область с адресом относительно листа C3:F3. UsedRange.Rows(1).Find(ColumnName) - даст одну (первую) ячейку в области первая строка, занятого диапазона. EntireColumn - (как и братский метод EntireRow) в отличие от методов Rows, Columns, Cells и Range возвращают область относительно листа а не Range от которого берутся. Поэтому UsedRange.Rows(1).Find(ColumnName).EntireColumn даст полную колонку листа. В принципе, чтобы не заставлять эксель искать в пустых ячейках до и после реально заполненых. Можно после: Set rColumn = ws.UsedRange.Rows(1).Find(ColumnName).EntireColumn добавить еще одну строку Set rColumn = Intersect(ws.UsedRange, rColumn) Тогда rColumn вместо области D:D станет описывать область D3:D10 и поиск значения ускорится еще чуть-чуть. Заодно, если ищешь пустую ячейку, то получишь пустую ячейку внутри таблицы с данными, а не первую ячейку колонки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 18:52:00 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
А как в Find можно управлять направлением поиска. Например мне надо узнать значение первой не пустой ячейки слева от текущей. т.е. Есть лист. На нем много строк и много столбцов. В первой ячейке каждого столбца находится дата. задача следующая - 1. определить все даты, которые входят в промежуток -30 дней от текущей (это я сделал) 2. За дату перебрать все строки в этой колонке до конца листа. Если встретилась не пустая ячейка, тогда в этой строке ищем первое число левее текущего. Если нашли - вычитаем его из текущего. Полученную разницу суммируем с разницей по предидущей строке (если она была) Таким образом к концу листа накапливаем сумму всех разниц. Проблема в следующем 1. Строк много - хотелось бы игнорировать пустые строки (в данный моммент действую полным перебором) 2. быстрее находить первое число левее текущего, либо приходить к выводу, что его нет (т.е. оно равно 0) Первую задачу я почти решил методом Find - по аналогии с предидущей. А вот как заставить find искать в обратную сторону (справа на лево) и не конкретное значение, а первое не пустое (игнорируя при этом значения нулевые, если таковые встретятся.) С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 10:24:44 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. After:=Range("E23") - отвечает за начало поиска SearchOrder:=, SearchDirection:= SearchOrder:=xlByRows, SearchDirection:=xlNext - двигаться в право потом вниз SearchOrder:=xlByColumns, SearchDirection:=xlNext двигаться в вниз потом право SearchOrder:=xlByRows, SearchDirection:=xlPrevious двигаться в влево потом вверх SearchOrder:=xlByColumns, SearchDirection:=xlPrevious двигаться в вверх потом влево а еще есть функция End для нахождения первой пустой ячейки очень хорошо подходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 10:58:36 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
А как найти первую не пустую ? Not End? С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 12:23:06 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Поиск последней ячейки в Excel ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 12:46:22 |
|
||
|
прошу помоши
|
|||
|---|---|---|---|
|
#18+
Все. Сам разобрался. Там было просто. А поиск последней ячейки мне не нужен. Но за ссылку спасибо. Воспользуюсь. Допишу и покажу, что получилось. С уважением BETEPON --------------------------- Ну вот собственно и ВСЕ. Подпись:Смерть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 15:33:52 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=34063412&tid=2184075]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 345ms |

| 0 / 0 |
