2012-06-27 12 views
2

У меня есть таблица в файле Excel с некоторыми данными, и я хочу экспортировать эти данные в свою базу данных по Access (в конкретной таблице в моей базе данных под названием «Качество воды») с помощью VBA кода, чтобы не открывать мою базу данных каждый раз, когда я хочу представить на ней больше данных.Экспорт данных из Excel в Access с помощью VBA

На данный момент у меня есть этот код, но он не работает ...

Sub Button14_Click() 

' Macro purpose: To add record to Access database using ADO and SQL 
' NOTE: Reference to Microsoft ActiveX Data Objects Libary required 

' Exports data from the active worksheet to a table in an Access database 

'Dim cnt As New ADODB.Connection 
'Dim rst As New ADODB.Recordset 
Dim cnt As DAO.Database 
Dim rst As Recordset 
Dim dbPath As String 
Dim tblName As String 
Dim rngColHeads As Range 
Dim rngTblRcds As Range 
Dim colHead As String 
Dim rcdDetail As String 
Dim ch As Integer 
Dim cl As Integer 
Dim notNull As Boolean 
Dim sConnect As String 

'Set the string to the path of your database as defined on the worksheet 
dbPath = "C:\Documents and Settings\Administrador\Mis documentos\MonEAU\modelEAU Database V.2.accdb" 
tblName = "Water Quality" 
Set rngColHeads = ActiveSheet.Range("tblHeadings") 
Set rngTblRcds = ActiveSheet.Range("tblRecords") 

'Set the database connection string here 
sConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & dbPath & "';"  'For use with *.accdb files 
' sConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath & ";"  'For use with *.mdb files 

'Concatenate a string with the names of the column headings 
colHead = " (" 
For ch = 1 To rngColHeads.Count 
    colHead = colHead & rngColHeads.Columns(ch).Value 
    Select Case ch 
     Case Is = rngColHeads.Count 
      colHead = colHead & ")" 
     Case Else 
      colHead = colHead & "," 
    End Select 
Next ch 

'Open connection to the database 
cnt.Open sConnect 
'Begin transaction processing 
On Error GoTo EndUpdate 
cnt.BeginTrans 

'Insert records into database from worksheet table 
For cl = 1 To rngTblRcds.Rows.Count 
    'Assume record is completely Null, and open record string for concatenation 
    notNull = False 
    rcdDetail = "('" 

    'Evaluate field in the record 
    For ch = 1 To rngColHeads.Count 
     Select Case rngTblRcds.Rows(cl).Columns(ch).Value 

       'if empty, append value of null to string 
      Case Is = Empty 
       Select Case ch 
        Case Is = rngColHeads.Count 
         rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL)" 
        Case Else 
         rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL,'" 
       End Select 

       'if not empty, set notNull to true, and append value to string 
      Case Else 
       notNull = True 
       Select Case ch 
        Case Is = rngColHeads.Count 
         rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "')" 
        Case Else 
         rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "','" 
       End Select 
     End Select 
    Next ch 

    'If record consists of only Null values, do not insert it to table, otherwise 
    'insert the record 
    Select Case notNull 
     Case Is = True 
      rst.Open "INSERT INTO " & tblName & colHead & " VALUES " & rcdDetail, cnt 
     Case Is = False 
      'do not insert record 
    End Select 
Next cl 

EndUpdate: 
'Check if error was encounted 
If Err.Number <> 0 Then 
    'Error encountered. Rollback transaction and inform user 
    On Error Resume Next 
    cnt.RollbackTrans 
    MsgBox "There was an error. Update was not succesful!", vbCritical, "Error!" 
Else 
    On Error Resume Next 
    cnt.CommitTrans 
End If 

'Close the ADO objects 
cnt.Close 
Set rst = Nothing 
Set cnt = Nothing 
On Error GoTo 0 

End Sub 

В настоящее время проблема, когда я отладки кода, появляется сообщение об ошибке компиляции: «Метод или данные члена не найдено "по функции" cnt.Open sConnect ".

Если это возможно, любая помощь будет принята с благодарностью.

Примечание: Я использую Office 2010.

+0

Теперь ошибка появляется в этой строке, когда я отлаживаю код: Недопустимое использование New Keybord – meikse

ответ

0

У меня есть только доступ к базам данных, которые открывают файл Excel (вместо наоборот), но с просматривал мой код, я думаю, вы должны идти прямо к этому:

`Set cnt = OpenDatabase_ 
     (dbPath, False, True, "Access 8.0;") 

Найдено по http://support.microsoft.com/kb/190195.

Помогает ли это?

+0

Ошибка по-прежнему существует, та же ошибка в той же строке ... – meikse

2

Ваша ошибка компиляции из-за этих 2-х линий:

Dim cnt As DAO.Database 
cnt.Open sConnect 

DAO.Database объект не имеет .Open метод, объясняющий «метод или член данных не найден». Слишком часто сообщения об ошибках могут быть несколько расплывчатыми и просто не очень полезными. Однако в этом случае я не могу представить, как сообщение об ошибке может быть более ясным.

Есть что-то еще, чего я не понимаю. sConnect выглядит как строка соединения ADO. Но cnt является объектом DAO (база данных). Вы не можете объединить две объектные модели в одном из них.

Вы это как раз перед вашим активным объявлением переменного:

'Dim cnt As New ADODB.Connection 

Тогда позже в вашей процедуре, у вас есть:

'Close the ADO objects 
cnt.Close 

Так, возможно, вы изначально предназначены cnt быть ADO.Connection объектом и Бесполезными 't адаптировать остальную часть кода после того, как вы переключили его на объект DAO.Database.

Предлагаю вам пересмотреть свой код, чтобы разобраться в путанице DAO и ADO, а затем показать нам новый код, если у вас остались проблемы. И, пожалуйста, покажите нам только минимальный проверенный код, необходимый для воспроизведения проблемы, которую вы надеетесь решить. TIA для вашего рассмотрения.

+1

Спасибо! Я мог бы решить эту проблему ... Было замешательство между DAO и ADO, как вы сказали. Теперь есть другие проблемы, сначала я должен проверить, что сейчас не удается. – meikse

Смежные вопросы