Импорт данных из access в excel


Импорт данных из Access в Excel. Unaccessible Value

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2005.06.29;Скачать: [xml.tar.bz2];

Вниз

Импорт данных из 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]

кстати, вынеси XLApp.Visible:=true после этих циклов

sniknik ©   (2005-05-19 14:19) [3]

> Программа импортирует данные из базы данных 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. У файла не проставлен аттрибут "только чтение". Dim Cnn As ADODB.Connection Dim tmp_RS As ADODB.Recordset Set Cnn = New ADODB.Connection Cnn.Open "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DriverId=790;FirstRowHasNames=Yes;TypeGuessRows=5;ImportMixedTypes=Text;ReadOnly=True;" & _ "DBQ=" & файл_для_импорта & ";" Set tmp_RS = New ADODB.Recordset strSQL = "SELECT txt_NFSCode_SU_Constr AS Obj_Code, '' AS Branch, txt_StatusHomeInSUFD_Tr_Constr as Activation_Date, '' AS Life_Length " & _ " FROM [бла-бла$] WHERE num_Year_Tr_Constr='2015/1' OR num_Year_Tr_Constr='2015/2';" Debug.Print strSQL tmp_RS.Open strSQL, Cnn, adOpenStatic, adLockReadOnly, adCmdText И рекордсет замечательно открывается.

Таперь открываю файл_для_импорта у себя в Excel и запускаю скрипт заново.Получаю ошибку: "Несоответствие типов данные в условии отбора."

Microsoft Excel Driver воспринимает поле num_Year_Tr_Constr как дату. (В файле там действительно 2 первые строки текстовые, а потом год 2010, который воспринимается драйвером как 07.02.1905).

Теперь закрываю файл, ставлю ему аттрибут "Только чтение", открываю его заново, вуаля, все работает.

Понятно, что можно пользователю в скрипте запретить открывать экселевский файл_для_импорта, но это не всегда удобно.

Господа, у кого-нибудь есть знания по проблеме?При запуске драйвера указал ImportMixedTypes=Text, что по-идее должно заставить драйвер читать все данные как текст, но вот так не происходит.

P/S/Скрипт запускается из Excel, офис 2007, win7

Ответ: An12, на самом деле я уже это сделал:Lockpickup
При запуске драйвера указал ImportMixedTypes=Text, что по-идее должно заставить драйвер читать все данные как текст, но вот так не происходит.
Microsoft Excel Driver положил на мои пожелания с прибором.

Я попробовал использовать другой драйвер:

Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & sourse_file & ";" & _ "Extended Properties=Excel 12.0;HDR=YES;IMEX=1;" но у меня и у пользователей на машинах он не установлен и вылазит ошибка "невозможно найти установленный ISAM"

forundex.ru