Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2009, 21:18   #1
infog
 
Регистрация: 30.05.2009
Сообщений: 8
Восклицание Ошибка в коде Exel to Access

Добрый вечер ув. форумчане.
Есть надобность экспортировать данные из файла 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_NUMBE R, AREA, PURPOSE_CODE, PZ_ORGAN,PZ_NUMBER,PZ_DATE" + _
",DEV_REG_NUM,DEV_REG_DATE,TD_PERFO RMER,DEV_EW_AKT_DATE" + _
",GA_SERIES,GA_NUMBER,GA_REG_DATE,G A_REG_NUM" + _
",REG_RETURN_DATE,REG_RETURN_NO TE) " + _
"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
infog вне форума Ответить с цитированием
Старый 14.10.2009, 22:40   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте infog.
хочу Вас огорчить задача, в представленном Вами виде, выполнена быть не может.
Всему виной "данные начинаются с 5й строчки", в прилинкованной таблице, а именно из неё Вы хотите получить данные, это недопустимо.
Решений может быть два:
1. привести исходную таблицу Excel, к "нормальному" табличному виду, с однотипными данными в полях (столбцах) и выполнять слияние запросом.
2. подключиться к таблице источнику с применением ADO, эта библиотека позволяет подключиться к данным любого диапазона таблицы Excel и перебором рекордсета передать данные в целевую таблицу.
других вариантов к сожалению нет.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 14.10.2009, 22:57   #3
infog
 
Регистрация: 30.05.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
Здравствуйте infog.
хочу Вас огорчить задача, в представленном Вами виде, выполнена быть не может.
Всему виной "данные начинаются с 5й строчки", в прилинкованной таблице, а именно из неё Вы хотите получить данные, это недопустимо.
Решений может быть два:
1. привести исходную таблицу Excel, к "нормальному" табличному виду, с однотипными данными в полях (столбцах) и выполнять слияние запросом.
2. подключиться к таблице источнику с применением ADO, эта библиотека позволяет подключиться к данным любого диапазона таблицы Excel и перебором рекордсета передать данные в целевую таблицу.
других вариантов к сожалению нет.
Евгений.
Евгений, благодарствую за ваше внимание и советы.
Меня интересует более простой вариант.
Как я понял, вы советуете сохранять нужный лист в отдельный файл и без использования каких либо заглавий ячеек таблицы?
Я убирал лишний текст, но не проверял хранение одной единственной таблицы в файле. Сейчас проверю.

Сам код верный? Он позволит построчно перенести всю таблицу в базу данных access?

Последний раз редактировалось infog; 14.10.2009 в 23:01.
infog вне форума Ответить с цитированием
Старый 14.10.2009, 23:52   #4
infog
 
Регистрация: 30.05.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
1. привести исходную таблицу Excel, к "нормальному" табличному виду, с однотипными данными в полях (столбцах) и выполнять слияние запросом.
Привел таблицу к нормальному виду, без лишних листов и ячеек.
Результат прежний...
infog вне форума Ответить с цитированием
Старый 15.10.2009, 20:02   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте infog.
"код который должен делать..." - код никому ничего не должен, тем более ответ на Ваш вопрос "Сам код верный?", ответ - нет неверный, даже без анализа VBA, синтаксис строки SQL явно неработоспособен:
"...,REG_RETURN_DATE,REG_RETURN_NO. .."
как минимум должно быть так:
"..., REG_RETURN_DATE, REG_RETURN_NO..."
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в коде. СИ Ver0nica Помощь студентам 2 02.10.2009 19:36
Ошибка в коде. fanyl Паскаль, Turbo Pascal, PascalABC.NET 10 21.09.2009 12:09
Ошибка в коде Revival001 PHP 11 12.07.2009 19:25
Ошибка в коде nikleb Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.03.2008 22:48