|
|
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Set xw = GetObject(CurrentProject.Path & "\contracts.xls", "Excel.sheet") For i = 5 To 1000 z1 = xw.ActiveSheet.Cells(i, 1) z2 = xw.ActiveSheet.Cells(i, 2) z3 = xw.ActiveSheet.Cells(i, 3) z4 = xw.ActiveSheet.Cells(i, 4) z5 = xw.ActiveSheet.Cells(i, 5) z6 = xw.ActiveSheet.Cells(i, 6) z7 = xw.ActiveSheet.Cells(i, 7) z8 = xw.ActiveSheet.Cells(i, 8) z9 = xw.ActiveSheet.Cells(i, 9) z10 = xw.ActiveSheet.Cells(i, 10) z11 = xw.ActiveSheet.Cells(i, 11) z12 = xw.ActiveSheet.Cells(2, 2) If z2 = "" Then GoTo 777 Set rst = CurrentDb.OpenRecordset("Поступления") rst.AddNew rst![Товар] = z1 rst![Наименование] = z2 rst![Категория] = z3 rst![Единицы] = z4 rst![Кол-во] = z5 rst![Себестоимость] = z6 rst![Себестоимость TMM] = z7 rst![Валюта] = z8 rst![Дата] = z9 rst![Поставщик] = z10 rst![Контра] = z12 rst![Цена] = z11 rst.Update rst.Close Next i Код работает, считывает из экса и вставляет как нужно, но немного, а иногда и долговато. Можно ли оптимизировать это для ускорения или есть другие методы экспорта из экса? DoCmd.TransferSpreadsheet пробывал, уже не надо. Вместо For вставлял While , но особой скорости не прибавилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2004, 21:26:22 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Set rst = CurrentDb.OpenRecordset("Поступления") z12 = xw.ActiveSheet.Cells(2, 2) For i = 5 To 1000 With xw.ActiveSheet z1 = .Cells(i, 1) z2 = .Cells(i, 2) z3 = .Cells(i, 3) z4 = .Cells(i, 4) z5 = .Cells(i, 5) z6 = .Cells(i, 6) z7 = .Cells(i, 7) z8 = .Cells(i, 8) z9 = .Cells(i, 9) z10 = .Cells(i, 10) z11 = .Cells(i, 11) End With If z2 = "" Then GoTo 777 rst.Close End If With rst .AddNew ![Товар] = z1 ![Наименование] = z2 ![Категория] = z3 ![Единицы] = z4 ![Кол-во] = z5 ![Себестоимость] = z6 ![Себестоимость TMM] = z7 ![Валюта] = z8 ![Дата] = z9 ![Поставщик] = z10 ![Контра] = z12 ![Цена] = z11 .Update End With Next i rst.Close То, что изменилось, я выделил красным. Правда, не обещаю, что это поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2004, 21:36:52 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Еще идея: Set rst = CurrentDb.OpenRecordset("Поступления",dbOpenDynaset,dbForwardOnly) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2004, 21:38:06 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
для сброса данных лучше использовать Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2004, 23:26:25 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Виктор, сколько лет, сколько зим! То, что ты предложил, - это из рекордсета в Эксель. А надо наоборот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2004, 23:53:37 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
честно говоря, надо видеть весь код. и наче остается мутное место с меткой 777 то, что "там" должно быть "здесь". Не зная что там, невозможно сказать - что делать, например, с - рекордсетом - закрывать или так оставить. Без учета 777 И соображений о скорости, (про скорость - ничего не скажу), а только принимая во внимание компактность, я бы написал так Код: 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 00:19:56 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Сильно!!! Сейчас попробую! Объясняю "777" Дело в том, что я не знаю, сколько строк займут данные в экселе. Я знаю, что начинаются они с 5 строки и заканчиваются черт знает где. Т.е. может быть это будет 10 строк с информацией, а в следующий раз 980 . Поэтому и использую с запасом 1000 в ячейке экселя z2 = xw.ActiveSheet.Cells(i, 2) заполняются наименования товара и поэтому в идеале они не должны быть пустыми (иначе это проблемы пользователя, т.к. согласитесь товар без наименования - это...). Поэтому я деляю проверку на наличие пустой ячейки, (z2="")т.е. если она пустая, то все работу прекратить. Так что за 777 ничего нет просто стоят ряд функций, которые не влияют на результат (мои вспомогательные) А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 00:37:31 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Ukraina А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк? http://sql.ru/forum/actualthread.aspx?tid=77517 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 00:46:50 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Victosha! Поразительно! Восхитительно! Вот это ДА! Здорово! Прекрасно!... (далее см. любой словарь русского языка в топиках о словах, выражающие восхищение). Сработало, да еще как. Для 390 записей время сократилось с 12 секунд до 3 секунд. Обалдеть!!! И где Вы всему этому учились? Спасибо, простое человеческое спасибо. Желаю дальнейших успехов и талантливых учеников! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 01:19:35 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Саныч! Посмотрел я ссылку. Думал, что понял, но на самом деле нет. В моей задаче я использую цикл For i=1 to 1000 Для того, чтобы уменьшить этот цикл мне и нужно получить последнюю строку экса. Пробывал многое, но выдает различные ошибки. Как можно вклинить это в цикл типа For i=1 to xs.Range("B5").End(xlDown).Select , где xs.Range("B5").End(xlDown).Select будет равняться скажем 60 Т.е. как получить число строк в какой-нибудь переменной для использования в цикле ну к примеру так что ли? y=xs.Range("B5").End(xlDown) for i=1 to y ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 02:08:06 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
UkrainaВ моей задаче я использую цикл For i=1 to 1000 dim r as excel.range set r=xw.ActiveSheet.usedrange for i=r.row to r.rows.count-r.row+1 Правда, пустые строки все равно могут попадаться, поэтому надо проверять, не пустая ли строка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 11:58:54 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Если после К следующий столбец - пустой, и в интересующем нас диапазоне нет пустых строк, то получение массива будет таким v = cw.ActiveSheet.Range("A5:K5").CurrentRegion.Value при этом проверка на пустоту в цикле исчезнет, т.к. все полученные "строки" - нужные. -------------------- 2 Ukraina скорость получилась сама собой - как следствие сокращения к-ва обращений к Ексель. Можно придумать более одной стратегии оптимизации скорости, но 1) до опыта у меня нет предпочтений 2) потенциальный объем кодирования не обнадеживает эффективностью полученного результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 17:22:17 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
опять проврался v = cw.ActiveSheet.Range("A5:K5").CurrentRegion.Value сработает, если 4-я строка пустая. Если перед 5-й строкой есть несколько строк заголовков, то они все попадут в массив. Обойти можно двумя путями. 1) пропустить лишние строки в полученном массиве, начав обработку с нужной 2) вычислить позицию последней строки LastRowPos = cw.ActiveSheet.Range("A5:K5").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2004, 18:26:14 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
автор А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк? appXls.wkbXls.wksXls.Cells.SpecialCells(xlCellTypeLastCell) возвращает последний элемент ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2004, 01:48:11 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
Владимир СанычВиктор, сколько лет, сколько зим! То, что ты предложил, - это из рекордсета в Эксель. А надо наоборот... Н-да :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2004, 09:08:50 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
стоит попробовать TransferSpreadsheet: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2004, 10:41:17 |
|
||
|
Можно ли оптимизировать этот код?
|
|||
|---|---|---|---|
|
#18+
к Марван!!! Работает, но все-таки почему-то медленнее, чем предложенный Виктошей!? Плюс ко всему6 возникла таже проблема (проподание данных), но уже при использовании национальной раскладки клавы (в данном случае туркменской). Полностью игнорирует отличительными (от латиницы) литерами. Почему такое могет быть? Может все-таки в установках Офиса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2004, 23:26:23 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32632255&tid=1672769]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 216ms |
| total: | 357ms |

| 0 / 0 |
