|
|
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
Вот мой код: Private Sub CommandButton1_Click() Set sh58 = ThisWorkbook.Sheets("58 счет") Set sh76 = ThisWorkbook.Sheets("76 счет") Set sh = ThisWorkbook.Sheets("Сравнения") sh.Cells.Clear sh.Cells(1, 1) = "Вексель" sh.Cells(1, 2) = "Дебет 58" sh.Cells(1, 3) = "Кредит 58" sh.Cells(1, 4) = "Дебет 76" sh.Cells(1, 5) = "Кредит 76" l = 1 For i = 2 To 51568 txt58 = sh58.Cells(i, 1) l0 = l For k = 2 To 10139 txt76 = sh76.Cells(k, 1) If txt58 = txt76 Then l = l + 1 sh.Cells(l, 1) = txt58 sh.Cells(l, 2) = sh58.Cells(i, 2) sh.Cells(l, 3) = sh58.Cells(i, 3) sh.Cells(l, 4) = sh76.Cells(k, 2) sh.Cells(l, 5) = sh76.Cells(k, 3) Exit For End If Next k If l0 = l Then sh58.Cells(i, 4) = "нет" Next i End Sub Он сравнивает данные одного листа с данными другого. Совпадающие выносит на лист Совпадения, а те которые не совпадают то на листе 58 счет проставляет нет. Данных на одном листе более 50000 строк, на другом более 10000. Проблема в том, что это все очень долго обрабатывается. Может кто подскажет как оптимизировать прогшраммный код, чтобы программа работала быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 08:59 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
fantomm А можно конкретный пример приложить, а то из кода ничего не ясно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 09:18 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
в начале кода не помешает написать Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 09:25 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
Программист Дёня fantomm А можно конкретный пример приложить, а то из кода ничего не ясно Конечно! Вот он! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 10:22 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
fantomm Программист Дёня fantomm А можно конкретный пример приложить, а то из кода ничего не ясно Конечно! Вот он! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 10:22 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
в вашем случае я бы посоветовал вам, если форма эксель листа не объязательна то целесообразнее использовть эксель как бд и проверять соответсвие через ADO+sql запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 10:53 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
TIKOв вашем случае я бы посоветовал вам, если форма эксель листа не объязательна то целесообразнее использовть эксель как бд и проверять соответсвие через ADO+sql запрос Именно что форма эксель листа обязательна! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 11:44 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 12:18 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
+ условия на пустые значения Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 12:28 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
TIKOтакой вариант попробуйте Код: 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. Все так же долго работает, до сих пор не выполнилось! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 12:30 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
TIKO, с твоим кодом быстрее программа работает, но данных нашла гораздо меньше, а это не правильно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 12:44 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
этот код на моей машине обрабатывает около 20 секунд при полном соответствии двух кононок более 10000 совпадений, это по моему вполне бытрая обработка, по крайней мере один цикл на все сколько на ваше машине идет обработка данного кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 12:48 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
TIKOэтот код на моей машине обрабатывает около 20 секунд при полном соответствии двух кононок более 10000 совпадений, это по моему вполне бытрая обработка, по крайней мере один цикл на все сколько на ваше машине идет обработка данного кода? Около 15 - 20 минут. Но я то имел в виду, что мой код выдавал более 4000 совпадений, а ваш всего около 2500. Может мой не правильно работал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 12:54 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
fantomm TIKOэтот код на моей машине обрабатывает около 20 секунд при полном соответствии двух кононок более 10000 совпадений, это по моему вполне бытрая обработка, по крайней мере один цикл на все сколько на ваше машине идет обработка данного кода? Около 15 - 20 минут. Но я то имел в виду, что мой код выдавал более 4000 совпадений, а ваш всего около 2500. Может мой не правильно работал? У тебя: Код: plaintext Код: plaintext Я бы советовал всё-таки обратить внимание на ADODB, т.к. структура листов у тебя табличная, будет гораздо быстрее работать. Если надо, примерчик могу набросать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 13:10 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
PA fantomm TIKOэтот код на моей машине обрабатывает около 20 секунд при полном соответствии двух кононок более 10000 совпадений, это по моему вполне бытрая обработка, по крайней мере один цикл на все сколько на ваше машине идет обработка данного кода? Около 15 - 20 минут. Но я то имел в виду, что мой код выдавал более 4000 совпадений, а ваш всего около 2500. Может мой не правильно работал? У тебя: Код: plaintext Код: plaintext Я бы советовал всё-таки обратить внимание на ADODB, т.к. структура листов у тебя табличная, будет гораздо быстрее работать. Если надо, примерчик могу набросать... То РА точно перепутал тогда Set f = Sheets("76 счет").Range("a1:a10139").Find(strValue, LookIn:=xlValues) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 13:15 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
TIKO, действительно быстрее работает! Посмотрим результат, как доделает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 13:32 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
Быстрее всего должен сработать подход с ADO/XML. Посмотрите мой пример: http://www.sql.ru/forum/actualthread.aspx?tid=412817 В вашем случае надо будет, видимо, в первую очередь, написать свой SQL запрос, достаточно простой, вместо того, что в примере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 15:05 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
Чтобы быстро решить такую задачу, необходимо поменять алгоритм сравнения двух массивов Для примера, представьте, что вам надо сравнить 2 массива, и найти совпадающие(отсутствующие) элементы (3 7 22 -4 34 2) и (-60 33 -2 22 1). У вас написана 2 цикла - сравнить каждый с каждым. Если в первой последовательноти М, а во второй Н элементов, то всег М умножить на Н сравнений, что очень долго для VBA. Теперь попробуйте сравнить отсортированные последовательности (-4 2 3 7 22 34) и (-60 -2 1 22 33). В этом случае не надо сравнивать каждый с каждым - надо последовательно пройти каждый элемент один раз, в данном случае 1) сравниваем -60 и -4 как первые элементы - они не совпадают 2) так как -60 меньше чем -4, то выбираем следующий элемент из второй последовательности -2 3) Сравниваем -2 и -4. Теперь -4 меньше чем -2, и поэтому выбираем следующий элемент из первой поледовательноти 2 4) Сравниваем 2 и -2. Теперь -2 меньше чем 2, так что следующей элемент берем из второй последовательности 1 5) Сравниваем 1 и 2. Так как 1 меньше 2, то берем следующий элемент из второй последовательности 22 6) Сравниваем 22 и 2. Так как 2 меньше 22, то берем следующий из первой 7) 22 и 3 8) 22 и 7 9) 22 и 22. Теперь результаты совпали. Тут вопрос, могут ли в последовательности быть повторяющиеся значения. Будем считать что нет, но в любом случае берем следующие значения из обеих последовательностей 10) 22 и 33 11) 33 и 34 Как видно, в таком случае каждый элемент проверяется только один раз, и требуется М + Н проверок если м 50000 н 10000 то вы проводили 500 000 000 проверок, а я же предлагаю 60 000, и на сортировку потребуетя то же какое то время, можете проверить сколько именно. Ну и само собой, день потребуется вам на программирование. Так что успехов в программировании эффективных алгоритмов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 17:56 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
По поводу копирования не только номера векселя, но и дебита , кредита ... Прежде всего я бы завел два новых листа с копиями вашего первого и второго листов и отортировал бы каждый из литов по векселю помощью метода sort или еще какой нибудь встроенной в эксель функцией, главное не писать сортировку самому Потом уже сделать сравнение по указанному в предыдущем моем ответе алгоритму(кстати, это не я его придумал, он используется в сортировке слиянием). Наконец, вопрос, как вернуть исходный порядок счетов в листе сравнения... это несколько по сложнее, но тем не менее тоже решается достаточно легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 18:03 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
Решил проверит вариант с ADO: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 18:05 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
То РА если уж решаемся на ADO то грех не использовать все возможности скул запросов а именно Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 07:25 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
еще вариант 1-2 сек без циклов и прокрутки рекодсета Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. но в первом и втором особенно варианте не учтено обновление поля не соответствий словом "Нет" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 08:14 |
|
||
|
оптимизация программного кода
|
|||
|---|---|---|---|
|
#18+
TIKOно в первом и втором особенно варианте не учтено обновление поля не соответствий словом "Нет" GetFromRecordset - одной командой заполняем третий лист. Аналогично делается выборка и под колонку со словом "Нет" для второго листа - там запрос только другой будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 11:21 |
|
||
|
|

start [/forum/topic.php?fid=60&fpage=229&tid=2163832]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 409ms |

| 0 / 0 |
