2012-02-01 4 views
1

Я пытаюсь использовать команду INSERT INTO для записи данных в файл Access 2007 из файла excel 2010. Данные содержатся в рабочем листе «NewProj» в файле excel Tool_Selector.xlsm, и его необходимо записать в файл «Tool_Database.mdb», но, к сожалению, я получил несколько разных ошибок. Это то, что у меня есть сейчасИспользование INSERT INTO для записи данных в базу данных доступа

Sub AddData() 
    Dim Cn As ADODB.Connection 
    Set Cn = New ADODB.Connection 

    Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Tools_Dev\_Tool_Selector\Tool_Selector.xlsm;Extended Properties=Excel 8.0;" _ 
     & "Persist Security Info=False" 

    Cn.Execute "INSERT INTO Project_Names IN 'D:\Tool_Database\Tool_Database.mdb' SELECT * FROM Worksheets("NewProj").Range("A2").Value" 

    Cn.Close 
    Set Cn = Nothing 
End Sub 

Я получил код этой темы: Insert Data from Excel into Access using VBA

мне просто нужно передать значение отдельных клеток.

Спасибо.

+0

Я знаю, что это Cn.Execute "INSERT INTO Project_Names в 'D: \ Tool_Database \ Tool_Database.mdb' SELECT * FROM Таблицах (" NewProj ") Range. (" A2 ") находится где Value." breaks ... Как я могу выбрать конкретную ячейку или строку ячеек? – thebiglebowski11

+2

Смотрите, если это поможет: http://stackoverflow.com/questions/5122582/run-access-query-from-excel-and-pass-paramerts-to-the-query/5122667#5122667 – Fionnuala

+0

феноменальный, вы хороший человек. – thebiglebowski11

ответ

2

Проблема в том, что вы используете код VBA в инструкции SQL. Следующая строка компилируется но не при исполнении:

Cn.Execute "INSERT INTO Project_Names IN 'D:\Tool_Database\Tool_Database.mdb' SELECT * FROM Worksheets("NewProj").Range("A2").Value" 

Это терпит неудачу, потому что вы все еще в ЗЕЬЕСТЕ, когда вы делаете использовать функции VBA из Таблиц(), .Range и .Value. IIRC, вы должны иметь возможность использовать синтаксис SQL для выбора определенного диапазона из листа. Правильный синтаксис для этого должен быть:

"SELECT * FROM [Sheet$]" 

Если вы хотите определенный диапазон, то вы бы попробовать:

"SELECT * FROM [Sheet$A1:C20]" 

Там в статье Microsoft по этому адресу: http://support.microsoft.com/kb/257819, если вы ищете более информацию об использовании ADO с Excel. Сценаристы также писали приличную статью, которая помогла мне понять это несколько лет назад: http://technet.microsoft.com/en-us/library/ee692882.aspx.

Надеюсь, это поможет вам решить вашу проблему. Однако я оставлю вас одним словом предупреждения. Я помню, что сталкивался с некоторыми действительно странными проблемами при запросе уже открытой таблицы Excel, когда я впервые использовал этот код. Если бы я запрашивал электронную таблицу Excel, которая была уже открыта, я столкнулся бы с проблемой, из-за которой произошла утечка памяти, и Excel в конечном итоге исчерпал бы память. Единственный способ решить проблему - закрыть Excel полностью. Также не имело значения, были ли ссылки ADO надлежащим образом закрыты/очищены или нет.

На самом деле, я просто попытался проверить его дважды, и вот статья об ошибке: http://support.microsoft.com/default.aspx?scid=kb;en-us;319998&Product=xlw.

0

Это звучит похоже на проблемы, я когда-то при обновлении с Office 2003 по 2007

Мое решение было изменения поставщика в строке подключения. Так как вы используете современную офисную версию я думаю, что это должно быть:

Provider=Microsoft.Ace.OLEDB.12.0; 

Вы можете посмотреть в эту Расширенную собственность. Я знаю, что Excel 8.0 является файлом Excel'97. И Excel 2010 составляет 14,0