Импорт данных из access в excel
Импорт данных из Access в Excel. Unaccessible Value
Вниз
Импорт данных из Access в Excel. Unaccessible Value
Phoenix9000 © (2005-05-19 14:05) [0]Доброго времени суток, уважаемые мастера.
Я столкнулся с проблеммой и все никак не могу ее решить.
Программа импортирует данные из базы данных ACCESS в Excel.
Используется компонент dataset, в котором записан запрос.
При установки фильтра на данный компонент и дальнейшее импортирование данных в одном столбце набора данных стоят данные даты: например "01.01.1900". Все это работает. Но в одной строке таблицы в бд вместо нормального написания даты стоит значение "01.01.900". Пропущена единица в годе. В этом случае программа вылетает.
Фрагмент кода и значения переменных в момент вылета:
for i:=2 to a do begin for j:= 1 to b do begin
if form1.adodataset3.Fields[j-1].Value <> Null then XLApp.Workbooks[1].WorkSheets[1].Cells[i,j]:=form1.adodataset3.Fields[j-1].Value; XLApp.Visible:=true; end; form1.adodataset3.Next;end;
Значения до вылета в form1.adodataset3.Fields[j-1].Value - 01.01.1900
При следующей итерации цикла значение form1.adodataset3.Fields[j-1].Value - Inaccessible Value
Как раз сдесь программа вылетает.
Я учел что если значение не нулевое, тогда запись в ячейку Excel не идет. (if form1.adodataset3.Fields[j-1].Value <> Null then ...)
Но как можно "объяснить" программе, что если она натыкается на подобное значение, она должна его либо пропустить, либо записать в Excel как есть.
Откликнитесь, кто может.приемлемы любые решения.
Заранее спасибо.
lexer © (2005-05-19 14:16) [1]Долго пытался вникнуть в вопрос, никак не пойму, у тебя что в БД дата в чаре хранится?Как вариант:for i:=2 to a dobegin for j:= 1 to b do try if form1.adodataset3.Fields[j-1].Value <> Null then XLApp.Workbooks[1].WorkSheets[1].Cells[i,j]:=form1.adodataset3.Fields[j-1].Value; XLApp.Visible:=true; except {чтоб программа не вылетатла} end; form1.adodataset3.Next;end;
Lexer © (2005-05-19 14:17) [2]> Программа импортирует данные из базы данных ACCESS в Excel.можно простоSELECT * INTO Table1 IN "D:\ExelBook.xls" "Excel 8.0;" FROM Table1книга екселя (ExelBook.xls) может и не существовать, сама создастся.
запишет (должно) именно "как есть"
yk © (2005-05-19 14:19) [4]Возможно проблема в типе ячеик в Excel
Phoenix9000 © (2005-05-19 14:31) [5]Большое спасибо всем.
To Lexer
Я думал о том же, записать просто не мог. :)а XLApp.Visible:=true я написал для того, чтобы было видно , на какой записи в Excel прогу клинит. В базе потом очень быстро найти можно где косяк.
to Sniknik
Этот способ опробую. Он работать быстрее бутет.
Еще раз всем большое спасибо!!!!!!!!!!
Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2005.06.29;Скачать: [xml.tar.bz2];Наверх
Память: 0.75 MBВремя: 0.11 c
www.delphimaster.net
Выгрузка данных из Access в шаблон Excel
В шаблоне Excel уже ненужно создавать поля как в Word, так как здесь мы уже будем ориентироваться по адресам ячеек.
Существует несколько способов, как заполнять Excel шаблон, я опишу два, первый это тогда когда Вам просто необходимо проставить несколько полей, т.е. в источнике данных будет всего одна строка с несколькими полями и второй это когда строк будет уже несколько, причем Вы не знаете, сколько именно (в зависимости от каких то условий), но в шаблоне по умолчанию отведено для этого все пару строк, поэтому мы будем нужные нам строки добавлять, для того чтобы наши данные не накладывалась на строки ниже (допустим там примечание, подпись руководителя и т.д.). И совет, я здесь для примера использую всего один источник данных, а вы, если Вам необходимо заполнить шапку, примечание и некое количество строк (т.е. область данных) то для этих задач используйте несколько источников (Recordset).
Также добавьте кнопку на форму (я ее назвал testexcel) и вставляем следующий код в событие «нажатие кнопки»
Private Sub testexcel_Click()
'Объявляем переменные
Dim XL As Object
Dim XLT As Object
Dim newrow As Object
Dim rsd As ADODB.Recordset
Dim strSQL As String
Set rsd = New ADODB.Recordset
'Запрос к базе данных
strSQL = "select * from dbo.table where kod = " & Me.kod & ""
rsd.open strSQL, CurrentProject.Connection
'Создаем необходимые объекты
Set XL = CreateObject("Excel.Application")
'для примера показываю, как можно сразу загружать шаблон без выбора
Set XLT = XL.Workbooks.open("C:\testfile.xls")
'1 способ если источнике данных всего одна строка
With XLT.Worksheets("Лист1")
.[a1] = rsd.Fields("field1")
.[b1] = rsd.Fields("field2")
.[c1] = rsd.Fields("field3")
.[d1] = rsd.Fields("field4")
End With
'2 способ если строк в источнике несколько
'причем мы учтем то, что у нас есть шапка и примечание в Excel
'и мы не знаем, сколько строк у нас вставится
'и поэтому строки будем добавлять в случае необходимости
'зададим, с какой строки будем начинать вставлять данные
Rowss = 10
'для нумерации
numrow = 1
'запускаем цикл до тех пор, пока не закончатся строки в нашем источнике
While Not (rsd.EOF)
'смотрим, если строк больше чем мы задали в шаблоне
If Rowss >= 12 Then
'то добавляем строку
XLT.Worksheets("Лист1").Rows(Rowss).Insert
'Запомним нашу строку
Set newrow = XLT.Worksheets("Лист1").Rows(Rowss)
'и вставим туда копию предыдущей строки
'для того если вдруг у вас там есть объединенные ячейки или какие-то нужные данные
'так как новая строка создастся без всяких объединений и значений
XLT.Worksheets("Лист1").Rows(Rowss - 1).Copy newrow
'это просто для примера как можно очистить некий диапазон внутри документа
'XLT.Worksheets("Лист1").Range("A10:F10").ClearContents
'динамически формируем адрес нужной ячейки
cell = "a" & Rowss
'и задаем ей значение
XLT.Worksheets("Лист1").Range(cell) = numrow
cell = "b" & Rowss
XLT.Worksheets("Лист1").Range(cell) = rsd.Fields("field5").Value
'переходим на следующую строку
Rowss = Rowss + 1
'переходим на следующую строку в источнике данных
rsd.MoveNext
Else
'а это выполняется до тех пор, пока не закончатся заданные строки в шаблоне
'т.е. если строк в источнике всего 1 то в код, который выше мы даже не попадем
cell = "a" & Rowss
XLT.Worksheets("Лист1").Range(cell) = numrow
cell = "b" & Rowss
XLT.Worksheets("Лист1").Range(cell) = rsd.Fields("field5").Value
Rowss = Rowss + 1
rsd.MoveNext
End If
'для нумерации
numrow = numrow + 1
'конец цикла
Wend
'это просто пример как можно удалить строку целиком
'XLT.Worksheets("Лист1").Rows(20).Delete
'делаем Excel видимым
XL.Visible = True
'Очищаем переменные
Set XL = Nothing
Set XLT = Nothing
Set newrow = Nothing
End Sub
Здесь я также все подробно прокомментировал, но если есть вопросы, то задавайте их в комментариях к данной статье.
Для сведения я здесь при создании объекта и Word.Application и Excel.Application использовал позднее связывание, для того чтобы не добавлять необходимые библиотеки и обеспечить совместимость. Надеюсь, мои примеры Вам помогут!
webhamster.ru
Импорт данных из Access в Excel
Вопрос: Импорт данных из Excel. Интересный глюк или фича.
Таперь открываю файл_для_импорта у себя в Excel и запускаю скрипт заново.Получаю ошибку: "Несоответствие типов данные в условии отбора."
Microsoft Excel Driver воспринимает поле num_Year_Tr_Constr как дату. (В файле там действительно 2 первые строки текстовые, а потом год 2010, который воспринимается драйвером как 07.02.1905).
Теперь закрываю файл, ставлю ему аттрибут "Только чтение", открываю его заново, вуаля, все работает.
Понятно, что можно пользователю в скрипте запретить открывать экселевский файл_для_импорта, но это не всегда удобно.
Господа, у кого-нибудь есть знания по проблеме?При запуске драйвера указал ImportMixedTypes=Text, что по-идее должно заставить драйвер читать все данные как текст, но вот так не происходит.
P/S/Скрипт запускается из Excel, офис 2007, win7
Ответ: An12, на самом деле я уже это сделал:При запуске драйвера указал ImportMixedTypes=Text, что по-идее должно заставить драйвер читать все данные как текст, но вот так не происходит. |
Я попробовал использовать другой драйвер:
Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & sourse_file & ";" & _ "Extended Properties=Excel 12.0;HDR=YES;IMEX=1;" но у меня и у пользователей на машинах он не установлен и вылазит ошибка "невозможно найти установленный ISAM"