Ошибки импорта excel в access

Badya1991

0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

1

20.01.2017, 04:02. Показов 11382. Ответов 23

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день, есть запрос на добавление данных из файла excel, выгруженного из 1С, в базу данных MS Access, по столбцам в существующую таблицу:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
INSERT INTO БДР ( Организация,
 Подразделение,
 Субконто2,
 Контрагент,
 СчетДт, СчетКт )
SELECT [TDSheet$].Организация,
 [TDSheet$].Подразделение,
 [TDSheet$].Субконто2,
 [TDSheet$].Контрагент,
 [TDSheet$].СчетДт,
 [TDSheet$].СчетКт
FROM [Excel 12.0 XML;HDR=YES;IMEX=1;DATABASE=C:Users...БДР.xlsx].[TDSheet$];

Проблема: MS Access при загрузке данных путем этого запроса определяет тип данных по первым 8 строкам, в столбце СчетДт первые 8 строк содержат число 20 (20 счет), далее есть счет 90.01.1 и тд, эти данные он не понимает и выдает ошибку #Число!, как можно решить эту проблему и загрузить это поле сразу текстовым, то есть по умолчанию задать тип данных текст?

Добавлено через 1 час 0 минут
Я искал уже но не нашел, вот типа в этой теме примерно такая же ошибка, Как изменить тип данных поля при импорте, но суть в том что ошибка возникает на этапе выборке то есть в запросе, то есть таблица уже обновляется данными с ошибкой, получается импортировать если создается новая таблица через мастер импорта и экспорта но я там не знаю как преобразуются данные на этапе запроса.



0



4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 04:12

2

надо в excel этот столбец сделать текстовым до загрузки

Добавлено через 59 секунд
или же в запросе воткнуть по этому столбцу функцию преобразования данных в строку
Cstr()



0



0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 04:20

 [ТС]

3

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



0



snipe

4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 04:23

4

Наверное так

SQL
1
2
3
INSERT INTO БДР ( Организация, Подразделение, Субконто2, Контрагент, СчетДт, СчетКт )
SELECT a1.Организация, a1.Подразделение, a1.Субконто2, a1.Контрагент, CStr(a1.СчетДт) AS СчетДТ1, a1.СчетКт
FROM [Excel 12.0 XML;HDR=YES;IMEX=1;DATABASE=C:Users...БДР.xlsx].[TDSheet$] AS a1;



0



Badya1991

0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 04:24

 [ТС]

5

SQL
1
2
3
INSERT INTO БДР ( Организация, Подразделение, Субконто2, Контрагент, СчетДт, СчетКт )
SELECT [TDSheet$].Организация, [TDSheet$].Подразделение, [TDSheet$].Субконто2, [TDSheet$].Контрагент, Cstr([TDSheet$].СчетДт) AS СчетДТ1, [TDSheet$].СчетКт
FROM [Excel 12.0 XML;HDR=YES;IMEX=1;DATABASE=C:Users...БДР.xlsx].[TDSheet$] AS [TDSheet$];

Написал такой запрос пишет ошибка преобразования данных 97 значениям присвоено значение null

ЗЫ: Уже делал так.



0



4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 04:31

6

столбец то называть надо

Добавлено через 1 минуту
а почему именно 97 значений обNULLилось

Добавлено через 2 минуты
попробуйте для начала просто импортировать таблицу excel
прелесть этого метода в том что при импорте не правильные значения в новую таблицу не вносятся и данные о неправильных значениях попадают в отдельную таблицу (точнее координаты этих данных)

Добавлено через 37 секунд
можно будет просто посмотреть в excel чего с этими данными не так



0



0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 04:36

 [ТС]

7

Я выше писал, что первые значения число 20 (20 счет в бухгалтерии), а то значение которое не попало : 90.01.1, он не может распознать как число, и таких значений 97 штук.

Если я в самом первом значении ставлю 20. (с точкой) тогда нет проблем с загрузкой.



0



snipe

4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 04:49

8

а можно файлик excel увидеть

Добавлено через 9 минут
Ну или напишите макрос и запустите его в excel
только запускайте в копии файла и выставьте свои значения констант

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub macro1()
dim i#, j#, k#, m#
' i - строка с которой начинается таблица заголовки столбцов не брать, судя по всему у вас это вторая строка
' j - номер столбца по которому двигаться a-1 b-2 c-3 d-4 и т.д предположу что наш корявый столбец 5
' k - последняя строка таблицы
' m- переменная цикла
i=2: j=5: k=100
for m=i to k
Cells(m,j)=CStr(Cells(m,j))
next m
msgbox "Готово"
end sub

Добавлено через 2 минуты
перед запуском макроса выделите столбец полностью и установите в нем формат ячеек Текстовый



0



0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 04:50

 [ТС]

9

Desktop.rar Вот база и пример excel, только в запросе отредактируйте свой путь.



0



4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 04:51

10

к сожалению у меня на работе нет акса
а файлик excel сейчас гляну



0



Badya1991

0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 04:52

 [ТС]

11

Цитата
Сообщение от snipe
Посмотреть сообщение

а можно файлик excel увидеть
Добавлено через 9 минут
Ну или напишите макрос и запустите его в excel
только запускайте в копии файла и выставьте свои значения констант

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Sub macro1()
dim i#, j#, k#, m#
' i - строка с которой начинается таблица заголовки столбцов не брать, судя по всему у вас это вторая строка
' j - номер столбца по которому двигаться a-1 b-2 c-3 d-4 и т.д предположу что наш корявый столбец 5
' k - последняя строка таблицы
' m- переменная цикла
i=2: j=5: k=100
for m=i to k
Cells(m,j)=CStr(Cells(m,j))
next m
msgbox "Готово"
end sub

Добавлено через 2 минуты
перед запуском макроса выделите столбец полностью и установите в нем формат ячеек Текстовый

Это нужно будет заходить в excel ждать пока строки переформатируются, а хотелось бы на этапе запроса, я так понимаю что это сделать можно, если через мастер импорта добавлять новую таблицу там без проблем



0



4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 04:55

12

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



0



0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 05:00

 [ТС]

13

Нет, чтобы в Excel переделать формат из числа в текст вручную надо выделить столбец и потом выделять каждую ячейку и жать Enter



0



Эксперт MS Access

7267 / 4469 / 288

Регистрация: 12.08.2011

Сообщений: 13,512

20.01.2017, 05:57

14

Цитата
Сообщение от Badya1991
Посмотреть сообщение

чтобы поменять число в текст нужно выделить ячейку выбрать формат текст потом выбрать ячейку и нажать enter

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

Добавлено через 1 минуту

Цитата
Сообщение от Badya1991
Посмотреть сообщение

Нет, чтобы в Excel переделать формат из числа в текст вручную надо выделить столбец и потом выделять каждую ячейку и жать Enter

у меня без всяких махинаций меняет сразу число на текст



0



4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

20.01.2017, 06:11

15

alvk,
ох не знаю
дома у меня офис 10 так там проблем нету и на работе офис 2016 — тоже нету
а вот раньшее в 2003 — так там как мне помнится (или уже кажется) такая проблема существовала



0



Эксперт MS Access

7267 / 4469 / 288

Регистрация: 12.08.2011

Сообщений: 13,512

20.01.2017, 06:23

16

Было сложно поменять текст на число, а не наоборот. Тогда нужно было умножать специальной вставкой на 1. Но тут на оборот же!



0



0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 06:44

 [ТС]

17

Цитата
Сообщение от alvk
Посмотреть сообщение

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

Я не огорчен, потому что как вы написали так не получится, нужно чтобы в Excel было число как текст, и чтобы это получилось нужно сначала поменять формат, зайти в редактирование ячейки и нажать enter, в итоге появится такой треугольник в углу зеленый который покажет что число как текст, после этого в access загрузится, по вашему методу будет таже ошибка.
Если есть сомнения, скачайте архив поменяйте путь к файлу пример в запросе, сделайте как вы предлагаете и посмотрите что получится.



0



Эксперт MS Access

7267 / 4469 / 288

Регистрация: 12.08.2011

Сообщений: 13,512

20.01.2017, 07:30

18

Цитата
Сообщение от Badya1991
Посмотреть сообщение

Если есть сомнения, скачайте архив поменяйте путь к файлу пример в запросе, сделайте как вы предлагаете и посмотрите что получится.

У меня есть сомнения, что вы прочли мою подпись, я её не для красоты сделал.

Файл экселя открыл, столбец поменял на текст, без проблем, никаких энтеров не нажимал.



0



0 / 0 / 0

Регистрация: 19.02.2016

Сообщений: 14

20.01.2017, 07:44

 [ТС]

19

Цитата
Сообщение от alvk
Посмотреть сообщение

Файл экселя открыл, столбец поменял на текст, без проблем, никаких энтеров не нажимал.

Вы теперь загрузите в access через запрос эти данные, и увидите что это не текст.

Тема актуальна, решения не нашел, желательно бы без махинаций в excel



0



mobile

Эксперт MS Access

26777 / 14456 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

20.01.2017, 08:08

20

Лучший ответ Сообщение было отмечено Badya1991 как решение

Решение

Badya1991, измените параметр HDR на HDR=No. Первая строка будет именем, текстом и запрос пройдет

SQL
1
2
3
INSERT INTO Таблица1 ( a1 )
SELECT f1 
FROM [Excel 12.0 XML;HDR=NO;IMEX=1;DATABASE=C:путьПример.xlsx].[Лист1$];

Потом удаляете строку с именем поля и все идет без ошибок.

Кстати, параметр XML в драйвере необязательный, он нужен для файлов с программируемой структурой, типа xlsm. Но можно и оставить

Добавлено через 8 минут
Да даже в самом запросе можно не брать строку с именем

SQL
1
2
3
4
INSERT INTO Таблица1 ( a1 )
SELECT f1 
FROM [Excel 12.0 XML;HDR=NO;IMEX=1;DATABASE=C:путьПример.xlsx].[Лист1$]
WHERE f1<>"a1"



1



I have a 2010 Excel file with a sheet that spans 34864 rows and 1387 columns. I’m trying to import it into Access 2010 with the import wizard, but when I select that sheet, Access goes unresponsive, and after several seconds gives me a

«Unexpected error from external database driver (1)»

Is this due to the size of the sheet or is there something in the cells that stops it from working. Other sheets from the same file import with no problem.

Dyrandz Famador's user avatar

asked May 2, 2012 at 21:20

user1251858's user avatar

2

You may experience this error after installing security patch KB4041681. See this MSDN entry.
In my case, replacing Microsoft.Jet.OLEDB.4.0 provider with Microsoft.ACE.OLEDB.12.0 helped.

Adil B's user avatar

Adil B

14.1k11 gold badges61 silver badges74 bronze badges

answered Oct 25, 2017 at 12:41

BusinessAlchemist's user avatar

0

I just experienced this problem too and found a very simple, easy solution. I noticed that my spreadsheet had a custom name so I decided to see if that was causing the problem. I changed it to the default name of «Sheet1» and, sure enough, it worked!!

answered Dec 5, 2014 at 17:19

RHiggins's user avatar

Download and install the Microsoft Access Database Engine 2010 Redistributable, and then modify the DB connection strings in Microsoft Excel to use ACE as a provider.

Change (example):

Provider=Microsoft.Jet.OLEDB.4.0

to:

Provider=Microsoft.ACE.OLEDB.12.0.

Microsoft is working on a resolution and will provide an update in an upcoming release.

Axel's user avatar

Axel

3,28511 gold badges38 silver badges58 bronze badges

answered Oct 22, 2017 at 18:59

akshay saravanan's user avatar

1

Use this

OleDbConnection conObj = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\a.XLS;Extended Properties=Excel 8.0;")

instead of this

OleDbConnection conObj = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\a.XLS;Extended Properties=Excel 8.0;")

Marian Nasry's user avatar

answered Oct 25, 2017 at 8:02

alexey's user avatar

alexeyalexey

7631 gold badge7 silver badges19 bronze badges

Save your Excel sheet to a ‘Comma delimited’ .CSV file, and then upload it as Text File. For me, this works fine.

The problem is that in .xls(x) all kind of lay-out issues are present. Converting it into .CSV removes all lay-out related mark up and converts in into ‘raw’ data.

all the best!

answered Dec 29, 2015 at 8:45

Tobias's user avatar

Along the lines of RHiggins answer:

In my case Jet OleDb.4.0 threw this error (oledbconnection.open()) because the name of a worksheet in a workbook (.xls) was too long.

answered May 17, 2016 at 16:28

jb_'s user avatar

A solution that has worked for me when tackling this issue is to have the Excel File where the Import / Export is being executed open when the Import & Export is happening.

The issue appears to be caused by the Patch preventing data transaction from occurring between CLOSED .xls files and other external database applications. Having the excel file open addresses this issue.

Some sample code examples below to highlight what works and what doesn’t with VBA:

FAILS

wbTarget.SaveAs strFilename, xlExcel8
wbTarget.Close    
ExportSheetToDB strFilename, strSheetName, "tblTemp"

WORKS

wbTarget.SaveAs strFilename, xlExcel8
ExportSheetToDB strFilename, strSheetName, "tblTemp"
wbTarget.Close

answered Nov 3, 2017 at 22:50

user2627727's user avatar

There seems to be a bug between Excel and Access. In some instances, I have to open the Excel file, click save, and then close the file. Then I can import it without error into Access.

I have yet to find a work around for this for VBA automation.

Jeremy Caney's user avatar

Jeremy Caney

6,95959 gold badges50 silver badges76 bronze badges

answered Sep 13, 2021 at 19:53

PorchMonkey's user avatar

In my case the spreadsheet was linked to another spreadsheet. I was importing a subset of the original sheet. I created a new sheet and copied the data column by column to notepad and then to the new sheet removing the links.
There was something in the links which was causing the problem.
BTW: it was this one set of data since I’ve done this import sequence from this one spreadsheet to this database more than 50 times. Halving the data worked for the first (larger) half of the data, but not for the second.

answered Apr 20, 2015 at 15:57

Dave's user avatar

DaveDave

1,23413 silver badges24 bronze badges

hi I am also facing this error when import .xlsb file. After that i copied the contents to another xlsx file then import this xlsx file.

answered Apr 5, 2016 at 5:02

Singaravelan's user avatar

SingaravelanSingaravelan

7793 gold badges18 silver badges32 bronze badges

I was getting this error when importing from a XLSB file, save the file as XLSX file and then import, should work

answered Feb 14, 2017 at 11:21

bharat1010's user avatar

bharat1010bharat1010

351 silver badge6 bronze badges

Another issue that is discovered is if the excel file is saved as a binary excel worksheet just resave it as an excel workbook and it loaded fine.

answered Feb 15, 2017 at 16:04

Bob's user avatar

I had the exact same error.
The spreadsheet was created from another software (SAP). Since it was not created by Office, Excel was not able to read it (!?!).
I have to open them in Excel, save it, and then load it in Access and it works!
As a worst case scenario, let’s say you have dozens of files, you could just open and close them by VBA code before import.

answered Mar 10, 2017 at 20:58

Séb Cô's user avatar

Séb CôSéb Cô

891 silver badge8 bronze badges

Solved for Windows 7:

Uninstall Security Update KB4041681 and KB4041678 both(Related to Excel and Jet/ACE provider)

rene's user avatar

rene

41.1k78 gold badges118 silver badges150 bronze badges

answered Oct 31, 2017 at 9:39

Diksha's user avatar

In my case (I has the same error) the problem was that I had the Access DB stored on a network drive which ran out of space (not enough free space for the import to finish). I freed up space and compacted the DB; the error didn’t appear again.

answered Apr 27, 2018 at 8:31

Maciej Lipinski's user avatar

I had same issue, after getting a security update in Windows7 this error occurred. We have too many excel files to perform an open/close operation so I decided to try other ways.

  1. Return a restore point when Access worked fine: It did not work in my case. The only change in software configuration is a security update and it seems security update still causes problem.

  2. Reducing rows, columns etc: It did not work for me; first file that access tried to reach had 10k rows, reducing this rows to 3 was not the solution.

  3. Trying to modify connection string: It did not work for me, it is not very reasonable as well; connection has been working for years, suddenly why would it stop? In some cases it does but not this time.

  4. Uninstalling most recent security update worked for in my case. Here is the uninstalled security update.

Screen shot of uninstalled security update

Good luck with solving.

Jeremy Caney's user avatar

Jeremy Caney

6,95959 gold badges50 silver badges76 bronze badges

answered Oct 31, 2017 at 6:40

Tuncermuncer's user avatar

Я’импортирую электронную таблицу из Excel 2003 в Access 2003 с помощью ADO (Provider = "Microsoft.Jet.OLEDB.4.0"). Однако у меня есть несколько текстовых записей в поле даты. Они передаются как значения #Num!, как и следовало ожидать.

Что я хотел бы сделать, так это обернуть поля с ошибками в нечто вроде IIf(IsDate(FIELDNAME),FIELDNAME,#1/1/1900#). Однако это все равно приводит к результату #Num!. Также как и проверка IsDate(), IsDate(CVar()), IsError(), IsError(CDat()), и VBAFunctionThatReturns0GivenAnyValue(FIELDNAME).

У кого-нибудь есть идеи, какую функцию-обертку я могу использовать, которая выполнит эту работу? Я более или менее в своем уме?

Обратите внимание: у меня нет никакого контроля над импортированными данными, поэтому я не могу исправить таблицу, как бы мне этого не хотелось. Я также хотел бы избежать специфического хакинга в самой функции импорта (например, использовать TransferSpreadsheet вместо нее). Цель состоит в том, чтобы использовать тот же подход к вводу данных, просто игнорировать те части, которые не работают.

Также следует отметить, что здесь уместно отбрасывать значения без даты. Импорт в виде текста — это то, чего я хотел бы избежать, поскольку это вызовет множество других ошибок в дальнейшем.

EDIT: Добавил условие, 2003. Я также должен отметить, что версия .Net framework, установленная в среде, не включает (или, похоже, не включает) провайдера ACE.12.0.

Edit 2: Как и просили, вот (слегка очищенная) версия SQL, который я выполняю. Обратите внимание, что это не точный запрос, но его выполнение на той же таблице вызывает те же проблемы:

Проблему можно увидеть, убрав предложение INTO и посмотрев на значения для [Date]. Если любое из них равно #Num! Тогда даже выполнение следующих действий приводит к `#Num!« для всех Test1-5, что скорее демонстрирует проблему..:

На днях столкнулся с ошибкой «Run-time error ‘2391’», на которую потратил кучу времени, не говоря уже о нервах =)

Суть проблемы в следующем:

Допустим, нужно импортировать данные таблички из Excel в Access. Для этого имеем такую вот структуру в Excel (см.рисунок).

error_2391_excel

Для того, чтобы импорт свершился нужно создать такую же табличку с такими же заголовками полей в Access.

error_2391_access

Все, структура данных в Excel есть, таблица для импорта в Access создана. Фактически, теперь все приготовления закончены. А теперь при помощи вот такой вот строки в коде должен произойти импорт данных из нашей таблички Excel в табличку table_1 в Access:

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, «table_1», «путь_к_файлу_Excel», True, «Имя_листа_Excel$»

И вроде бы все должно работать, ан нет! Получаем примерно следующее заявление:

error_2391

Конечно, первое, что приходит на ум — проверить соответствие названий столбцов в Excel и в таблице Access. Чаще всего находятся наименования, которые не соответствуют друг другу. В этом случае исправляем их, чтобы названия были идентичными, и — вуаля! — все работает.

А если все поля друг другу соответствуют, но ошибка все равно возникает? А вот тут может иметь место следующий нюанс. Excel при импорте, так сказать проверяет наличие информации в ячейках и составляет для себя таблицу импорта. Технически может быть по-другому, но для понимания удобней всего такое сравнение.

Так вот, возвращаясь к примеру выше, если вдруг в ячейке столбца «F» или «G» затесался какой-нибудь невидимый символ, например пробел, то Excel автоматом включит эти столбцы в свою таблицу импорта. Естественно, что этих столбцов в таблице Access не предусмотрено. То есть получится, что из Excel импортируется больше столбцов, чем есть в результирующей таблице table_1. Именно по этой причине нам в этом случае и выдается ошибка 2391.

Для того, чтобы все наладить, нужно удалить пустые столбцы справа от таблицы. Макросом это можно сделать вот так:

Columns(«F:G»).Select
Selection.Delete Shift:=xlToLeft

или так:

Columns(«G:I»).Delete Shift:=xlToLeft

В крайнем случае, всегда можно проделать данную операцию вручную, выбрав нужные столбцы -> правой кнопкой мыши -> «Удалить».

Понравилась статья? Поделить с друзьями:
  • Ошибки в ячейках excel все
  • Ошибки в электронной таблице excel
  • Ошибки в формулах excel примеры
  • Ошибки в формулах excel 2010
  • Ошибки в интерфейсе word