|
|
|
| Добрый вечер ув. форумчане.
Есть надобность экспортировать данные из файла 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
|
| |
|
| |
|
|
|
| а что в итоге получается?
вроде все правильно
импорт прописан с 4 строки по какую не знаю - не нашел где установлена переменная edtCntRow | |
|
| |
|
|
|
| Прога спрашивает количество получаемых строк в edtCntRow.
В том и дело, что почти все правильно, но есть где-то ошибка.
В итоге как была пустая таблица с 35 полями так и осталась.
И еще меня смущает запрос SELECT , что это за F1, F2, F3...?
Код писал не я, но примерно для тех задач что нужны мне. | |
|
| |
|
|
|
| Вы увидели часть запроса на добавление - я про select
без вот этой переменной edtCntRow Акс не может определить диапазон импортирования (вот и ругается)
по идее это должно быть число - последняя строчка импорта и где-то оно должно задаваться или вводиться | |
|
| |
|
|
|
| Никто и не ругается. Просто данные не заносятся в таблицу.
А по поводу части запроса, дак это я вижу в коде. Я думаю, может быть F1, F2, F3.. это выборка данных из тех ячеек, но выбор должен происходить из A5, B5, C5.... A6, B6, C6... тоесть по горизонтали, взяли 5 строку, и выбрали все 35 ячеек, переместились на 6 строку, забрали 35 ячеек....
А edtCntRow берется из поля ввода на форме. Оно есть, и берется. Пытался задавать различные значения, от 4 до 10, разницы никакой. | |
|
| |
|
|
|
| у вас хитрость всего вашего кода на импорт следующая
сначала удаляется таблица ExelTable
далее импортируются данные из файла во вновь созданную таблицу ExelTable
после чего должен отработать запрос за добавление записей InsCommandText
возможно этот запрос и не отрабатывает
попробуйте импортировать данные далее посмотрите какие данные хранятся в таблице ExelTable - если те которые должны быть значит Акс затащил к себе данные
если это так попробуйте создать запрос на добавление данных (при помощи конструктора)
проверив работоспособность запроса зайдите в режиме конструктора и переведите его в режим SQL осталось только сравнить | |
|
| |
|
|
|
| Мне нужно импортировать из Exel в Access.
Скажите пожалуйста как проверить работоспособность запроса? Я мало смыслю в Access'e | |
|
| |
|
|
|
| вам и так импортируется из Excel в Акс
все необходимые команды для этого прописаны
вполне вероятно что не отрабатывает запрос на добавление записей из таблицы куда был произведен импорт в вашу рабочую таблицу
тогда так....
импортируйте из акса таблицу contract в Excel теперь под Excel удалите все строки кроме 1(мне нужны только названия столбцов)
тоже самое с таблицей ExelTable
теперь эти 2 файла зажмите любым архиватором в один файл и выложите тут архив | |
|
| |
|
|
|
| Подскажите пожалуйста, как экспортировать только таблицу contract. | |
|
| |
|
|
|
| находите таблицу кликаете по ней правой кнопкой выбираете Export запустится стандартное окно сохранения выбираете куда обзываете файл и не забудте выбрать формат файла | |
|
| |
|
5 Кб. |
|
| Вот, пожалуйста. | |
|
| |
|
|
|
|
| Там две таблицы, одна экспорт contract. И "Книга1" - это упрощенный вариант той таблицы, которую нужно перегнать в contract. | |
|
| |
|
|
|
| Теперь все понятно
DoCmd.TransferSpreadsheet acImport, 8, "ExelTable", xmlFile, True, CntRow '"A4:AI6"
тут True говорит о том что во вновь создаваемую таблицу ExelTable из файла формата .xls расположенного по пути xmlFile будет импортирован диапазон CntRow причем первая строка будет являться заглавием столбцов
диапазон начинается с 4 строки (нужные вам данные с 5)
а далее идет запрос который берет данные из таблицы ExelTable (столбцы называются F1 F2 и т.д. ) и пытается добавить их в таблицу contract если названия столбцов в исходной или конечной таблице не совпадают с теми что указаны в запросе то импорта не будет
так как называются столбцы в таблице ExelTable (вот это я у вас и просил) | |
|
| |
|
|
|
| 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С | |
|
| |
|
|
|
| True - это слово определяет что первая строка название полей
Да этот кусок закорентирован однако есть переменная CntRow которая ранее определена и является диапазоном импорта
нет не выходит из таблицы excel будут импортированы столбцы от A до Ai
c 4 строки по ту которую укажут | |
|
| |
|
|
|
| вполне возможно что в исходном файле 4 строка имеет вид
F1 F2 F3 F4 F5 ............F35 | |
|
| |
|
|
|
| Строка никак не может иметь вид F1-Fi, поскольку это столбец. | |
|
| |
|
|
|
| Почти все узнал.
Тоесть в том коде ячейки будут выбираться от А1-Аi ?
Или А1-V1
A2-V2
A3-V3..?
А если и будут, почему импорт не происходит? И что означает F1, F2, F3, F4... ? | |
|
| |
|
|
|
| CntRow = "A4:AI" & edtCntRow
вот эта строчка определяет какой диапазон будет импортирован
в идеале должно быть примерно так A4:AI55 (столбцы от А до AI строки от 4 до 55)
а тут вместо последней цифры стоит переменная edtCntRow
F1 F2 F3 - это названия столбцов которые должны быть прописаны в 4 строке, т.е. в ячейке А4 должно быть написанр F1 в ячейке В4 -F2 C4 - F3 | |
|
| |
|
|
|
| Спасибо большущее за помощь, время и терпение!
Завтра с утра попытаюсь снова заимпортить. | |
|
| |
|
|
|
| вот это
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"
и все должно заработать | |
|
| |
|
|
|
| Заменил строки, привел таблицу в нормальный вид, указывал разное количество экспортируемых строк... Результат прежний. | |
|
| |
|
|
|
| что значит - привел таблицу в нормальный вид | |
|
| |
|
|
|
| ну всмысле то, что я вчера присылал, "книга 1". Таблица без названий столбцов и лишних книг. | |
|
| |
|
|
|
| выложите таблицу ExelTable (интересуют только названия столбцов) | |
|
| |
|
|
|
| По всей видимости ExelTable, это временная таблица в которую данные переносятся из моего экспортируемого файла?
В Exel'е ведь нету конкретных названий столбцов. Там есть своя разметка. А у меня главное прогнать все ячейки, если есть данные внести, если нет, таблица contract позволяет иметь пустые ячейки.. | |
|
| |
|
|
|
| вот и именно
если производить импорт без указания названия столбцов то Акс начинает их обзывать по своему а именно F1 F2 F3 F4
на основе этого запрос на добавление в таблице ExelTable должен видеть эти поля и соответственно добавить в таблицу contract | |
|
| |