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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Ошибка в коде Exel to Access
 
 автор: Infog   (14.10.2009 в 21:07)   личное сообщение
 
 

Добрый вечер ув. форумчане.
Есть надобность экспортировать данные из файла xls в таблицу access.
Есть программа написана в Access 2003 с использованием форм и VBA.
Программа работает, данные через формы вносятся в одну единственную таблицу (contract).
Но нужно организовать экспорт данных из таблицы Exel. В моем случае таблица имеет несколько листов, но экспорт нужен из одного листа.
В нем необходимые данные начинаются с 5й строчки (1-4 описание столбцов), и 35 столбцов. Некоторые ячейки могут быть пустыми, это не важно.

Есть код который должен делать импорт, но он почему-то не работает. Я в VBA никаких знаний не имею, поэтому взываю вас к помощи. Вопрос жизни и смерти :)

Форма для выбора файла

Private Sub btnExcel_Click()
   Dim dlg As FileDialog
   Set dlg = FileDialog(msoFileDialogFilePicker)
   dlg.Filters.Clear
   dlg.Filters.Add "Òàáëèö³ Excel", "*.xls"
   dlg.AllowMultiSelect = False
   On Error Resume Next
   On Error GoTo 0
      dlg.ButtonName = "Çàâàíòàæåííÿ XLS ôàéëà"
      If dlg.Show Then
        edtFileXLS = Trim(dlg.SelectedItems.Item(1))
      Else
        MsgBox "Ôàéë íå âûáðàí"
    End If

End Sub


Код импортера

Private Sub btnImpExcel_Click()
   Dim xmlFile As String
   Dim InsCommandText As String
   Dim CntRow As String
   xmlFile = edtFileXLS
   CntRow = "A4:AI" & edtCntRow
   On Error GoTo ImpExlErr
   'On Error Resume Next ' Âûêëþ÷åíèå îáðàáîò÷èêà îøèáîê.
    DoCmd.DeleteObject acTable, "ExelTable"
    err = 0 ' Î÷èñòêà êîäà îøèáêè.
    DoCmd.TransferSpreadsheet acImport, 8, "ExelTable", xmlFile, True, CntRow  '"A4:AI6"
    'DoCmd.RunSQL "DELETE FROM ExelTable"
    InsCommandText = "INSERT INTO [contract](DECL_NUM,DECL_DATE,APP_NUMBER,CON_REG_DATE,EXECUTE_WORK_DATE" + _
    ",OWNER_NAME,OWNER_FIRST_NAME,OWNER_PATRONYMIC,OWNER_ID_CODE" + _
    ",KOATUU,ZONE,QUARTER,CAD_NUMBER, AREA, PURPOSE_CODE, PZ_ORGAN,PZ_NUMBER,PZ_DATE" + _
    ",DEV_REG_NUM,DEV_REG_DATE,TD_PERFORMER,DEV_EW_AKT_DATE" + _
    ",GA_SERIES,GA_NUMBER,GA_REG_DATE,GA_REG_NUM" + _
    ",REG_RETURN_DATE,REG_RETURN_NOTE) " + _
    "SELECT F1 & F2 as DECL_NUMBER,F3, F17,F18,F19, F4,F5,F6,F7" + _
    ",F8,F9,F10,F11, F12, F13, F14,F16,F15" + _
    ",F20,F21,F22,F23" + _
    ",F26,F27,F31,F32, F33,F34 " + _
    "FROM [ExelTable]"
        
     CurrentDb.Execute InsCommandText
ImpExlErr:
    err.Clear

End Sub

  Ответить  
 
 автор: snipe   (14.10.2009 в 22:00)   личное сообщение
 
 

а что в итоге получается?

вроде все правильно
импорт прописан с 4 строки по какую не знаю - не нашел где установлена переменная edtCntRow

  Ответить  
 
 автор: Infog   (14.10.2009 в 22:19)   личное сообщение
 
 

Прога спрашивает количество получаемых строк в edtCntRow.
В том и дело, что почти все правильно, но есть где-то ошибка.
В итоге как была пустая таблица с 35 полями так и осталась.

И еще меня смущает запрос SELECT , что это за F1, F2, F3...?

Код писал не я, но примерно для тех задач что нужны мне.

  Ответить  
 
 автор: snipe   (14.10.2009 в 22:25)   личное сообщение
 
 

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

без вот этой переменной edtCntRow Акс не может определить диапазон импортирования (вот и ругается)
по идее это должно быть число - последняя строчка импорта и где-то оно должно задаваться или вводиться

  Ответить  
 
 автор: Infog   (14.10.2009 в 22:35)   личное сообщение
 
 

Никто и не ругается. Просто данные не заносятся в таблицу.
А по поводу части запроса, дак это я вижу в коде. Я думаю, может быть F1, F2, F3.. это выборка данных из тех ячеек, но выбор должен происходить из A5, B5, C5.... A6, B6, C6... тоесть по горизонтали, взяли 5 строку, и выбрали все 35 ячеек, переместились на 6 строку, забрали 35 ячеек....

А edtCntRow берется из поля ввода на форме. Оно есть, и берется. Пытался задавать различные значения, от 4 до 10, разницы никакой.

  Ответить  
 
 автор: snipe   (14.10.2009 в 22:52)   личное сообщение
 
 

у вас хитрость всего вашего кода на импорт следующая
сначала удаляется таблица ExelTable
далее импортируются данные из файла во вновь созданную таблицу ExelTable
после чего должен отработать запрос за добавление записей InsCommandText
возможно этот запрос и не отрабатывает

попробуйте импортировать данные далее посмотрите какие данные хранятся в таблице ExelTable - если те которые должны быть значит Акс затащил к себе данные

если это так попробуйте создать запрос на добавление данных (при помощи конструктора)

проверив работоспособность запроса зайдите в режиме конструктора и переведите его в режим SQL осталось только сравнить

  Ответить  
 
 автор: Infog   (14.10.2009 в 23:00)   личное сообщение
 
 

Мне нужно импортировать из Exel в Access.
Скажите пожалуйста как проверить работоспособность запроса? Я мало смыслю в Access'e

  Ответить  
 
 автор: snipe   (14.10.2009 в 23:19)   личное сообщение
 
 

вам и так импортируется из Excel в Акс
все необходимые команды для этого прописаны
вполне вероятно что не отрабатывает запрос на добавление записей из таблицы куда был произведен импорт в вашу рабочую таблицу

тогда так....
импортируйте из акса таблицу contract в Excel теперь под Excel удалите все строки кроме 1(мне нужны только названия столбцов)
тоже самое с таблицей ExelTable

теперь эти 2 файла зажмите любым архиватором в один файл и выложите тут архив

  Ответить  
 
 автор: Infog   (14.10.2009 в 23:37)   личное сообщение
 
 

Подскажите пожалуйста, как экспортировать только таблицу contract.

  Ответить  
 
 автор: snipe   (14.10.2009 в 23:42)   личное сообщение
 
 

находите таблицу кликаете по ней правой кнопкой выбираете Export запустится стандартное окно сохранения выбираете куда обзываете файл и не забудте выбрать формат файла

  Ответить  
 
 автор: Infog   (14.10.2009 в 23:46)   личное сообщение
5 Кб.
 
 

Вот, пожалуйста.

  Ответить  
 
 автор: snipe   (14.10.2009 в 23:57)   личное сообщение
 
 

а таблицу ExelTable

  Ответить  
 
 автор: Infog   (15.10.2009 в 00:04)   личное сообщение
 
 

Там две таблицы, одна экспорт contract. И "Книга1" - это упрощенный вариант той таблицы, которую нужно перегнать в contract.

  Ответить  
 
 автор: snipe   (15.10.2009 в 00:16)   личное сообщение
 
 

Теперь все понятно

DoCmd.TransferSpreadsheet acImport, 8, "ExelTable", xmlFile, True, CntRow '"A4:AI6"

тут True говорит о том что во вновь создаваемую таблицу ExelTable из файла формата .xls расположенного по пути xmlFile будет импортирован диапазон CntRow причем первая строка будет являться заглавием столбцов

диапазон начинается с 4 строки (нужные вам данные с 5)

а далее идет запрос который берет данные из таблицы ExelTable (столбцы называются F1 F2 и т.д. ) и пытается добавить их в таблицу contract если названия столбцов в исходной или конечной таблице не совпадают с теми что указаны в запросе то импорта не будет

так как называются столбцы в таблице ExelTable (вот это я у вас и просил)

  Ответить  
 
 автор: Infog   (15.10.2009 в 00:24)   личное сообщение
 
 

DoCmd.TransferSpreadsheet acImport, 8, "ExelTable", xmlFile, True, CntRow '"A4:AI6"

и так, вы говорите что первая строка будет являться заглавием столбцов. Где это определено?
Мне в идеале нужно пропустить 4 первых строки.

Этот кусок '"A4:AI6", я так понимаю закомментирован?

И как я думал струтура не верна. В экселе разметка такова:
АБС....Ф....
1
2
3
4

Выходит что импортироваться будет только один столбец? Ф??
Мне нужно каждую строку импортировать 1А, 1Б, 1С, ... 1Ф..
2А, 2Б, 2С
3А, 3Б, 3С

  Ответить  
 
 автор: snipe   (15.10.2009 в 00:29)   личное сообщение
 
 

True - это слово определяет что первая строка название полей
Да этот кусок закорентирован однако есть переменная CntRow которая ранее определена и является диапазоном импорта

нет не выходит из таблицы excel будут импортированы столбцы от A до Ai
c 4 строки по ту которую укажут

  Ответить  
 
 автор: snipe   (15.10.2009 в 00:34)   личное сообщение
 
 

вполне возможно что в исходном файле 4 строка имеет вид
F1 F2 F3 F4 F5 ............F35

  Ответить  
 
 автор: Infog   (15.10.2009 в 00:42)   личное сообщение
 
 

Строка никак не может иметь вид F1-Fi, поскольку это столбец.

  Ответить  
 
 автор: Infog   (15.10.2009 в 00:34)   личное сообщение
 
 

Почти все узнал.
Тоесть в том коде ячейки будут выбираться от А1-Аi ?
Или А1-V1
A2-V2
A3-V3..?

А если и будут, почему импорт не происходит? И что означает F1, F2, F3, F4... ?

  Ответить  
 
 автор: snipe   (15.10.2009 в 00:45)   личное сообщение
 
 

CntRow = "A4:AI" & edtCntRow
вот эта строчка определяет какой диапазон будет импортирован
в идеале должно быть примерно так A4:AI55 (столбцы от А до AI строки от 4 до 55)
а тут вместо последней цифры стоит переменная edtCntRow

F1 F2 F3 - это названия столбцов которые должны быть прописаны в 4 строке, т.е. в ячейке А4 должно быть написанр F1 в ячейке В4 -F2 C4 - F3

  Ответить  
 
 автор: Infog   (15.10.2009 в 00:50)   личное сообщение
 
 

Спасибо большущее за помощь, время и терпение!
Завтра с утра попытаюсь снова заимпортить.

  Ответить  
 
 автор: snipe   (15.10.2009 в 00:52)   личное сообщение
 
 

вот это
CntRow = "A4:AI" & edtCntRow

поменяйте вот на это
CntRow = "A5:AI" & edtCntRow

а вот это
DoCmd.TransferSpreadsheet acImport, 8, "ExelTable", xmlFile, True, CntRow '"A4:AI6"
на вот это
DoCmd.TransferSpreadsheet acImport, 8, "ExelTable", xmlFile, false, CntRow '"A4:AI6"

и все должно заработать

  Ответить  
 
 автор: Infog   (15.10.2009 в 11:02)   личное сообщение
 
 

Заменил строки, привел таблицу в нормальный вид, указывал разное количество экспортируемых строк... Результат прежний.

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

что значит - привел таблицу в нормальный вид

  Ответить  
 
 автор: Infog   (15.10.2009 в 11:12)   личное сообщение
 
 

ну всмысле то, что я вчера присылал, "книга 1". Таблица без названий столбцов и лишних книг.

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

выложите таблицу ExelTable (интересуют только названия столбцов)

  Ответить  
 
 автор: Infog   (15.10.2009 в 11:20)   личное сообщение
 
 

По всей видимости ExelTable, это временная таблица в которую данные переносятся из моего экспортируемого файла?
В Exel'е ведь нету конкретных названий столбцов. Там есть своя разметка. А у меня главное прогнать все ячейки, если есть данные внести, если нет, таблица contract позволяет иметь пустые ячейки..

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

вот и именно
если производить импорт без указания названия столбцов то Акс начинает их обзывать по своему а именно F1 F2 F3 F4
на основе этого запрос на добавление в таблице ExelTable должен видеть эти поля и соответственно добавить в таблицу contract

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