|
|
|
| Ни че не понимаю
Доброго времени суток
Ситуация следующая
надо импортировать порядка 90 файлов xls
прежде чем загрузить инфу в файле нужно подправить (несоответствие форматов)
цепляюсь к файлу через CreateObject
запускаю цикл
и вот тут начинаются интересные вещи
из одних файлов инфу обрабатывает быстро а из других еле еле - душа в теле
записей в файлах в среднем по 1.5 тыс
при быстрой загрузке уходит примерно 30 сек при медленной около 20 минут
цикл приводит всю инфу в к текстовому формату
после обработки
быстро грузится в акс
экспортируемые файлы находятся у меня в компе
откуда беруться тормоза?
Заранее спасибо | |
|
| |
|
|
|
| а структура файлов одинаковая?
Сталкивался с тем что если в файле много всякого форматирования (объединенных ячеек, внедренные картинки) то даже при небольшом объеме файл открывается долго.
как вариант использовать:
1. Доступ к excel файлу через ADO/DAO
2. вместо цикла использовать copy -> смена формата ячеек -> paste
3. сохранение в другой формат средствами excel (например файл с разделителями) и уже его в access.
а вообще можно проанализировать где конкретно тормоза? на открытие? или при перемещении? | |
|
| |
|
|
|
| тормоза
именно на преобразовании
в первом блоке
Dim asd As String
For i = Me.Поле1 To Me.Поле3
For j = 1 To 6
asd = dfr.Cells(i, j)
dfr.Cells(i, j) = asd
Me.Поле6 = i
DoEvents
Next j
Next i
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("База2")
For i = Me.Поле1 To Me.Поле3
rs.AddNew
rs.Fields("f1") = dfr.Cells(i, 1)
rs.Fields("f2") = dfr.Cells(i, 2)
rs.Fields("f3") = dfr.Cells(i, 3)
rs.Fields("f4") = dfr.Cells(i, 4)
rs.Fields("f5") = dfr.Cells(i, 5)
rs.Fields("f6") = dfr.Cells(i, 6)
rs.Update
Next i
специально воткнул Me.Поле6 = i что бы видеть в каком месте находится обработка
ado\dao пока не приведешь к формату (нормальному) вываливается ошибка
а вот п. 2 сейчас попробую | |
|
| |
|
|
|
| а реально именно так данные в таблицу закидываются?
может есть смысл так
Dim asd As String
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("База2")
For i = Me.Поле1 To Me.Поле3
rs.AddNew
For j = 1 To 6
rs.Fields("f" & i) = cstr(dfr.Cells(i, i))
'Me.Поле6 = i
'DoEvents
Next j
rs.Update
Next i
|
| |
|
| |
|
|
|
| попробую и таким образом
через копи-пасте шустро получилось
спасибо
тормоза убрались
а вот почему так было - так и не понял
да и хрен с ним
старый анекдот про программеров
Папа, а почему солнце на востоке всходит и на западе заходит
Сынок, ты проверял перепроверял
да, папа
сынок, ни чего не трогай - работает и пускай работает | |
|
| |
|
|
|
|
работает и пускай работает
|
Это верно. Седня с утра еще один глюк был.
В одной из форм (старой, давно не троганной) начали блокироваться кнопочки "добавить".
И так и эдак искали - нулем.
Потом скопировал форму из недельной давности копии.
Все заработало!
Форму не трогали точно.Че было? Лень сверять.
работает и пускай работает
|
| |
|
| |
|
|
|
|
прежде чем загрузить инфу в файле нужно подправить (несоответствие форматов)
ado\dao пока не приведешь к формату (нормальному) вываливается ошибка
| Какое, собственно, несовпадение форматов и какая ошибка?
JET определяет тип поля по значениям в первых 8 ячейках колонки. Если у вас в каждой колонке, в этих 8 ячейках встречается текстовое значение, то подправлять ничего не надо. Надо выполнить запрос на добавление с листа в таблицу акса, а в строке подключения указать параметр IMEX=1. В этом случае тип поля будет текстовым.
Теперь по вашему коду...
1. Зачем вы переприсваимаете ячейкам их же значения, если затем берете эти значения из ячеек и вставляете в Recordset? Ведь драйвер здесь не участвует. Это, между прочим 1500 х 6 х 2 = 18000 обращений к OLE-серверу. Причем перерасчет листа после каждого изменения вы не отключили.
2. Вместо цикла по ячейкам при записи в Recordset правильнее - прочитать Value всего диапазона в переменную типа Variant (получите двухмерный массив Строки-Столбцы) и далее цикл уже по массиву. | |
|
| |
|
|
|
| в том то и бяка была что в одном из столбцов забиты ИНН
и в записях где численный формат где текстовый - вообщем общий
из-за этой неразберихи импорт (через docmd) не получался - инфа терялась (акс просто ее не подгружал)
В екселе бывает что изменить формат ячеек не получается (через правую кнопку мыши по ячейке) - сколько раз было такое, что вроде формат поменял, а он не поменялся, а через цикл - дешево и сердито, шаблонность сыграла злую шутку.
по пункту 1 применил совет osmor-а и стал действовать не через цикл а диапазон ячеек (вообщем быстро)
по пункту 2 - не знал - попробую на практике применить
Все равно - спасибо | |
|
| |