2

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 を使用しています。

4

2 に答える 2

2

コンパイル エラーは、次の 2 行が原因です。

Dim cnt As DAO.Database
cnt.Open sConnect

DAO.Databaseオブジェクトにはメソッドがありません。これは、「メソッドまたはデータ メンバーが見つかりません.Open」を説明しています。多くの場合、エラー メッセージはややあいまいで、あまり役に立ちません。ただし、この場合、エラー メッセージがこれ以上明確になるとは考えられません。

さらにわからないことがあります。 sConnectADO 接続文字列のように見えます。しかしcntDAO (データベース) オブジェクトです。このように 2 つのオブジェクト モデルを 1 つのステートメントでマッシュアップすることはできません。

アクティブな変数宣言の直前にこれがあります:

'Dim cnt As New ADODB.Connection

その後、手順の後半で、次のようになります。

'Close the ADO objects
cnt.Close

したがって、最初はオブジェクトにするつもりcntで、ADO.Connectionオブジェクトに切り替えた後、コードの残りの部分を適応させなかった可能性がありDAO.Databaseます。

DAO と ADO の混乱を整理するためにコードを修正し、問題が残っている場合は新しいコードを提示することをお勧めします。また、解決したい問題を再現するために必要な最小限のテスト済みコードのみを示してください。TIAさん、ご検討ください。

于 2012-06-28T16:28:46.590 に答える
0

私はExcelファイルを開くAccessデータベースしか持っていません(逆ではなく)が、私のコードを見ると、これに直行する必要があると思います:

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

これはhttp://support.microsoft.com/kb/190195でも見つかりました。

これは役に立ちますか?

于 2012-06-28T04:28:01.593 に答える