Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с Excel
 
 автор: snipe   (04.06.2012 в 07:38)   личное сообщение
 
 

Ни че не понимаю

Доброго времени суток

Ситуация следующая
надо импортировать порядка 90 файлов xls

прежде чем загрузить инфу в файле нужно подправить (несоответствие форматов)
цепляюсь к файлу через CreateObject
запускаю цикл
и вот тут начинаются интересные вещи
из одних файлов инфу обрабатывает быстро а из других еле еле - душа в теле
записей в файлах в среднем по 1.5 тыс
при быстрой загрузке уходит примерно 30 сек при медленной около 20 минут

цикл приводит всю инфу в к текстовому формату

после обработки
быстро грузится в акс

экспортируемые файлы находятся у меня в компе

откуда беруться тормоза?

Заранее спасибо

  Ответить  
 
 автор: osmor   (04.06.2012 в 09:25)   личное сообщение
 
 

а структура файлов одинаковая?
Сталкивался с тем что если в файле много всякого форматирования (объединенных ячеек, внедренные картинки) то даже при небольшом объеме файл открывается долго.
как вариант использовать:
1. Доступ к excel файлу через ADO/DAO
2. вместо цикла использовать copy -> смена формата ячеек -> paste
3. сохранение в другой формат средствами excel (например файл с разделителями) и уже его в access.

а вообще можно проанализировать где конкретно тормоза? на открытие? или при перемещении?

  Ответить  
 
 автор: snipe   (04.06.2012 в 09:31)   личное сообщение
 
 

тормоза
именно на преобразовании
в первом блоке
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 сейчас попробую

  Ответить  
 
 автор: osmor   (04.06.2012 в 10:33)   личное сообщение
 
 

а реально именно так данные в таблицу закидываются?
может есть смысл так


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


  Ответить  
 
 автор: snipe   (04.06.2012 в 11:09)   личное сообщение
 
 

попробую и таким образом

через копи-пасте шустро получилось
спасибо

тормоза убрались
а вот почему так было - так и не понял
да и хрен с ним

старый анекдот про программеров
Папа, а почему солнце на востоке всходит и на западе заходит
Сынок, ты проверял перепроверял
да, папа
сынок, ни чего не трогай - работает и пускай работает

  Ответить  
 
 автор: Дядя Федор   (04.06.2012 в 11:20)   личное сообщение
 
 


работает и пускай работает


Это верно. Седня с утра еще один глюк был.
В одной из форм (старой, давно не троганной) начали блокироваться кнопочки "добавить".
И так и эдак искали - нулем.
Потом скопировал форму из недельной давности копии.
Все заработало!

Форму не трогали точно.Че было? Лень сверять.


работает и пускай работает

  Ответить  
 
 автор: Анатолий (Киев)   (05.06.2012 в 15:18)   личное сообщение
 
 


прежде чем загрузить инфу в файле нужно подправить (несоответствие форматов)

ado\dao пока не приведешь к формату (нормальному) вываливается ошибка

Какое, собственно, несовпадение форматов и какая ошибка?
JET определяет тип поля по значениям в первых 8 ячейках колонки. Если у вас в каждой колонке, в этих 8 ячейках встречается текстовое значение, то подправлять ничего не надо. Надо выполнить запрос на добавление с листа в таблицу акса, а в строке подключения указать параметр IMEX=1. В этом случае тип поля будет текстовым.

Теперь по вашему коду...
1. Зачем вы переприсваимаете ячейкам их же значения, если затем берете эти значения из ячеек и вставляете в Recordset? Ведь драйвер здесь не участвует. Это, между прочим 1500 х 6 х 2 = 18000 обращений к OLE-серверу. Причем перерасчет листа после каждого изменения вы не отключили.
2. Вместо цикла по ячейкам при записи в Recordset правильнее - прочитать Value всего диапазона в переменную типа Variant (получите двухмерный массив Строки-Столбцы) и далее цикл уже по массиву.

  Ответить  
 
 автор: snipe   (05.06.2012 в 15:51)   личное сообщение
 
 

в том то и бяка была что в одном из столбцов забиты ИНН
и в записях где численный формат где текстовый - вообщем общий
из-за этой неразберихи импорт (через docmd) не получался - инфа терялась (акс просто ее не подгружал)
В екселе бывает что изменить формат ячеек не получается (через правую кнопку мыши по ячейке) - сколько раз было такое, что вроде формат поменял, а он не поменялся, а через цикл - дешево и сердито, шаблонность сыграла злую шутку.

по пункту 1 применил совет osmor-а и стал действовать не через цикл а диапазон ячеек (вообщем быстро)
по пункту 2 - не знал - попробую на практике применить

Все равно - спасибо

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList