|
|
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
В фирме 43 моб. телефона. Для удобства вместо длинных номеров (например 5264857) используем короткие (например 4987). Распечатка переговоров приходит ежемесячно на мыло с длинными номерами. Обычно от 18000 до 25000 звонков (строк) в формате EXCEL. Подстановку т.е. замену длинных номеров на короткие делаю в лоб в цикле ( 2 цикла, один вложен в другой). Т.е. на втором листе таблица соответствия длинный короткому. Код молотит 45-60 минут. Может есть идеи как заменять/подменять один текст на другой по другому, не тупым перебором? Ведь цикл происходит в среднем 43*20000 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 12:18:28 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Да, простой перебор работает очень долго, проверено. Воспользуйся методами .Find и .FindNext, для того чтобы найти длинные номера и заменить их короткими из таблицы соответсвия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:21:24 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Мысли вслух: а формулами низя? ИМХО быстрее должно рулить... +вопрос:эхо отображение небось включено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:54:40 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
А я подобную задачу решал так: Оба списка запихнул в массивы, их сравнил и прописал соответсвие. И взад выгрузил вместе с соответствием. Работает ужас какбыстро. Графический интерфейс же не привязан, все операции чисто в памяти проходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 15:12:49 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Letter_DА я подобную задачу решал так: Оба списка запихнул в массивы, их сравнил и прописал соответсвие. И взад выгрузил вместе с соответствием. Работает ужас какбыстро. Графический интерфейс же не привязан, все операции чисто в памяти проходят. Можно ПОПОДРОБНЕЕ. Или примерчик. Или на talgat@bsr.ee ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 16:11:54 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
SinnerМысли вслух: а формулами низя? ИМХО быстрее должно рулить... +вопрос:эхо отображение небось включено? Формулами не получилось. Что то громоздкое создал но толком не получилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 16:13:25 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Пользователь2Да, простой перебор работает очень долго, проверено. Воспользуйся методами .Find и .FindNext, для того чтобы найти длинные номера и заменить их короткими из таблицы соответсвия. Find использую в этой программке для определения конца списков ( распечатки и таблицы соответствия). А про findNext даже и не слыхал. Ща будем смотреть ! СпасибА ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 16:17:58 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
По поводу Find: использую при поиске так например Set r = ActiveSheet.Range(B3:B1000") Set g = r.Find(What:=искомое_значение) А как используется FindNext ? В helpe чого то все о поиске файлов пишется. Подскажитееее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 17:08:22 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
talgatМожно ПОПОДРОБНЕЕ. Или примерчик. Или на talgat@bsr.ee Ну, я не знаю, как поподробнее. Типа описываешь массив по количеству ячеек, там (30000,3), например. Или через Redim Preserve, если не знаешь, сколько их там будет. По одному циклу загоняешь ячейки в массив. Имя_Массива(i,j)=Sheets("bla-bla").Cells(i,j) И второй массив так же. Далее все оперции с только массивами, можно даже легко сделать глобальную замену в модуле Sheets("bla-bla").Cells(i,j) на Имя_Массива(i,j) , синтаксис такой же! Чтобы не переписывать ручками. А в конце получившийся массив выгружаешь назад в ячейки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 17:21:05 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Letter_D talgatМожно ПОПОДРОБНЕЕ. Или примерчик. Или на talgat@bsr.ee Ну, я не знаю, как поподробнее. Типа описываешь массив по количеству ячеек, там (30000,3), например. Или через Redim Preserve, если не знаешь, сколько их там будет. По одному циклу загоняешь ячейки в массив. Имя_Массива(i,j)=Sheets("bla-bla").Cells(i,j) И второй массив так же. Далее все оперции с только массивами, можно даже легко сделать глобальную замену в модуле Sheets("bla-bla").Cells(i,j) на Имя_Массива(i,j) , синтаксис такой же! Чтобы не переписывать ручками. А в конце получившийся массив выгружаешь назад в ячейки. Идею понял. Классный метод и очень простой. ВОПРОС ЗАКРЫТ. ВСЕМ БОЛЬШОЕ СПАСИБО !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 17:27:18 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#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. Попробуй с массивами, возможно время выполнения уменьшится. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 17:44:26 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Private Sub CommandButton1_Click() Dim r As Range, g As Range Dim p As Variant '' определение последней строки на Sheet1 Worksheets("Sheet1").Activate Set r = ActiveSheet.Range("A3:A30000") Set g = r.Find(What:="") kon1 = g.Row '' определение последней строки на Sheet3 Set r = Range("A3:A300") Set g = r.Find(What:="") kon2 = g.Row ''Определяем массивчик нужной размерности Dim m1(3 To 20000) As Variant Dim m2(1 To 50, 1 To 2) As Variant ''Загружаем таблицу соответствий в массив М2 For i = 1 To kon2 m2(i, 1) = Range("A" & i) m2(i, 2) = Range("B" & i) Next i ''Загружаем длинные номера в массив М1 For i = 3 To kon1 m1(i) = ActiveSheet.Range("A" & i) Next i ''Сравниваем For i = 3 To kon1 For j = 1 To kon2 If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) Next j Next i ''вставляем на место длинных короткие For i = 3 To kon1 ActiveSheet.Range("A" & i) = m1(i) Next i MsgBox ("ГОТОВО!!!") End Sub У меня получилось около 5 секунд на P366 !!! Большое всем спасибо ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 18:14:07 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Ну вы только прикиньте, что значит ФОРУМ. С 1 часа с помощью Вас всех перешел на 5 секунд. Я просто балдею ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 18:18:12 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
А еще рекомендуется ставить Exit For Т.е. вместо If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) написать If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) :Exit For Совпадение уже найдено, зачем дальше сравнивать??? Будет еще быстрее, думаю я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 10:38:02 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Letter_DА еще рекомендуется ставить Exit For Т.е. вместо If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) написать If m2(j, 2) = m1(i) Then m1(i) = m2(j, 1) :Exit For Совпадение уже найдено, зачем дальше сравнивать??? Будет еще быстрее, думаю я. Нет не так. Совпадений может быть неизвестное кол-во раз. Т.е. с одного номера за месяц звонят не 1 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 11:33:46 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
а можно и текст процедуры подсократить:) Private Sub CommandButton1_Click() Dim kon1 As Long, kon2 As Long, i As Long, j As Long ''Определяем массивчик нужной размерности Dim m1 As Variant, m2 As Variant '' определение последней строки на Sheet1 Worksheets("Лист1").Activate kon1 = ActiveSheet.Range("A3:A30000").Find(What:="").Row '' определение последней строки на Sheet3 kon2 = Worksheets("Лист3").Range("A3:A300").Find(What:="").Row ''Загружаем таблицу соответствий в массив М2 m2 = Worksheets("Лист3").Range("A3:B" & kon2) ''Загружаем длинные номера в массив М1 m1 = ActiveSheet.Range("A3:A" & kon1) ''Сравниваем For i = 1 To kon1 - 3 For j = 1 To kon2 - 3 If m2(j, 1) = m1(i, 1) Then m1(i, 1) = m2(j, 2) Next j Next i ''вставляем на место длинных короткие ActiveSheet.Range("A3:A" & kon1) = m1 MsgBox ("ГОТОВО!!!") End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 11:37:57 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
sergeyvgа можно и текст процедуры подсократить:) Точно так. Но на скорость это не влияет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 11:51:11 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Можно ли реализовать такую же функцию поиска и замены, только чтобы поиск производился по части ячейке? Например: найти: *Аренда* Заменить: Аренда помещения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 19:19:00 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Подобную операцию СУБД делает за долю секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 19:33:55 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
А в excel'e это возможно сделать? Какие СУБД делают такую операцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 20:07:51 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Напишите пожалуйста, какие СУБД делают такие операции за секунды?! Т.е. мне надо, чтобы слова для поиска находились не в коде, а на отдельном листе. Например: на листе1, есть столбец который содержит по ячейкам разную информацию:одна ячейка - (бла..бла...Аренда..бла...бла), надо найти слово Аренда и заменить всю ячейку на слово Аренда. Все точно так как, вышеописанный код, но он не ищет по части ячейки. Помогите, если кто сталкивался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 07:54:28 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
нужно поменять значение LookAt:=xlWhole на LookAt:=xlPart тогда будет искать ячейку не целиком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 09:36:33 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
Любая СУБД быстро сделает такую операцию. Только они хранят данные не на листах, как Excel, а в таблицах. Именно это (благодаря табличным функциям и языку SQL) и ускоряет обработку данных в десятки раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 10:15:58 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
talgat Подстановку т.е. замену длинных номеров на короткие делаю в лоб в цикле ( 2 цикла, один вложен в другой). Т.е. на втором листе таблица соответствия длинный короткому. ребята, че ж Вы так себя мучаете - функцию ВПР() посмотри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 10:24:21 |
|
||
|
Подстановка значений
|
|||
|---|---|---|---|
|
#18+
KuskovSА в excel'e это возможно сделать? Какие СУБД делают такую операцию?все, могут, это простое соединение таблиц. В access это вроде этого: вариант для фрагмента строки Код: plaintext 1. вариант для полного соответсвия Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 11:00:28 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=33320573&tid=2183209]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 324ms |

| 0 / 0 |
