2010-11-19 10 views
3

Я сделал некоторый код для вставки данных из таблицы первенствовать в к базе данных доступа - мой код выглядит следующим образом:Вставка данных из Excel в Access с помощью VBA

Sub AddData() 

Dim Cn As ADODB.Connection 

Set Cn = New ADODB.Connection 

'lets connect to the workbook first, I tested this, it works for me 
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sample.xls;Extended Properties=Excel 8.0;" _ 
& "Persist Security Info=False" 

' Append data from Sheet1 of workbook to Table1 of mydb.mdb: 
Cn.Execute "INSERT INTO tblSales IN 'C:\Users\User\Documents\access.mdb' SELECT * FROM [datasheet]" 

Cn.Close 
Set Cn = Nothing 

End Sub 

Моя проблема при выполнении этого I получить сообщение об ошибке «Microsoft Jet Engine не смог найти путь к объекту». Технический паспорт - это просто имя листа, на котором находятся данные в моей книге. Любая помощь очень ценится.

ответ

1

Что произойдет, если вы положите знак $ после имени листа вот так [техническое описание $] ?

+0

Пробовал, что до сих пор не работает :( – user319940

+0

это будет, если вы AFDD полного имени файла. – Fionnuala

-1

Оператор SELECT запускается в самой базе данных, но вы хотите отправить значения из EXCEL. Таким образом, вы должны использовать

cn.Execute "INSERT .... VALUES (" & excelcell_or_variable & ");" 

в конечном итоге в цикле, чтобы ее обрабатывать все строки/столбцы и т.д.

Надежда, что помогает

удачи

EDIT ... не забудьте котировку знаки, окружающие CHAR и интернационализации; Я использую

' .... 
' .... "...VALUES (" & T(Q(MyStringCell)) & T(MyNumCell) & Q(MyLastTextCell) & ");" 
' .... 

' surrounds a string by single quotes 
Private Function Q(Arg as String) As String 
    Q = "'" & Arg & "'" 
Return 

' appens a comma to a string 
Private Function T(Arg as String) As String 
    T = Arg & "," 
Return 

EDIT 2 Я предполагаю, что в EXCEL значения, которые вы хотите вставить в БД все в 1 ряд ...

Предположим, у вас есть source_range, который содержит более 1 строку, вы должны запустить инструкцию INSERT для каждой строки в этом диапазоне. Вы используете свойство .Rows для возврата одной строки из диапазона. И вы посылаете несколько столбцов в отчете INSERT в той же строке, используя .Cells(1, 1), .Cells(1,2) .... и так далее

пример:

Sub Test() 
Dim MyRange As Range, MyRow As Range 

    Set MyRange = Range([B4], [C8]) ' source range 

    For Each MyRow In MyRange.Rows ' get one row at the time from source range 
     Debug.Print MyRow.Cells(1, 1), MyRow.Cells(1, 2) 
     ' replace the above by your INSERT statement 
    Next MyRow 

End Sub 
+0

см. Мое редактирование ... обратите внимание на тип данных, получающий вставку; и, конечно, ваша вставка должна удовлетворять всем ограничениям таблицы (т.не нулевые, ссылки и т. д.) и быть в формате (даты !!) БД хочет увидеть его – MikeD

+0

Спасибо за помощь - как это будет работать, если я захочу выбрать диапазон? например A: E? – user319940

+0

ahhh .... так что я рад, что у вас есть цитаты и взаимозависимости прямо сейчас ... хорошо, так что ... для остальных см. Мой EDIT 2 ... надеюсь, что это поможет :-) – MikeD

0

Я думаю, что вы не можете выполнить запрос только на любой открытой книге , Он ДОЛЖЕН быть запущен против файла, это означает, что вам необходимо предоставить полный путь к вашему листу, включая имя файла. Если ваша рабочая книга «грязная», вам нужно сначала ее сохранить. я предпочел бы

  • петли на рабочем лист линии и добавить записи один на один
  • или использовать код, который вы только что написали из Access (если он подходит)
+0

Looping медленный, ADO быстрый. Вам не нужна открытая книга, но вы можете запустить ADO против текущей книги, если, как вы говорите, вы сохранили. – Fionnuala

0

Все, что отсутствуют, насколько я могу судить, это путь к источнику данных и строка на таблицу:

Data Source=sample.xls; 

Следует читать, например:

Data Source=c:\docs\sample.xls; 

И:

SELECT * FROM [datasheet$] 
Смежные вопросы