web-dev-qa-db-ja.com

Accessからデータを受け取るためのExcel VBAの作成

仕事用にAccessデータベースから取得するExcelアプリケーションを書いています。ユーザーがExcelツールを開くと、作成したAccessデータベースからワークシートの1つをデータテーブルに入力する必要があります。 ExcelでVBAコードを記述していて、実行時エラー "429" ActiveXコンポーネントがオブジェクトを作成できません。

他の質問はすべてAccessから作成されていますが、このコードはExcelブックファイルから作成する必要があると思います。私が書いたコードはWorkbook_Open()関数内にあるため、ユーザーがファイルを開くとすぐにデータが収集されます。助けてくれてありがとう。ところで、私はAccess 2007とExcel 2010を使用しています。

Private Sub Workbook_Open()
    'Will fill the first listbox with data from the Access database
    Dim DBFullName As String
    Dim TableName As String
    Dim FieldName As String
    Dim TargetRande As String

    DBFullName = "D:\Tool_Database\Tool_Database.mdb"

    Dim db As DAO.Database, rs As Recordset
    Dim intColIndex As Integer

    Set TargetRange = Range("A1")
    Set db = OpenDatabase(DBFullName)
    Set rs = db.OpenRecordset("SELECT * FROM ToolNames WHERE Item = 'Tool'", dbReadOnly)

    ' Write the field names
    For intColIndex = 0 To rs.Fields.Count - 1
        TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
    Next

    ' Write recordset
    TargetRange.Offset(1, 0).CopyFromRecordset rs

    Set rs = Nothing
    db.Close
    Set db = Nothing
End Sub
10

タイラー、このコードを試していただけませんか?エラーが発生した場合は、メッセージボックスが表示されます。メッセージボックスのスナップショットを投稿するだけです。

'~~> Remove all references as the below code uses Late Binding with ADO.

Private Sub Workbook_Open()
          Dim cn As Object, rs As Object
          Dim intColIndex As Integer
          Dim DBFullName As String
          Dim TargetRange As Range

10        DBFullName = "D:\Tool_Database\Tool_Database.mdb"

20        On Error GoTo Whoa

30        Application.ScreenUpdating = False

40        Set TargetRange = Sheets("Sheet1").Range("A1")

50        Set cn = CreateObject("ADODB.Connection")
60        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"

70        Set rs = CreateObject("ADODB.Recordset")
80        rs.Open "SELECT * FROM ToolNames WHERE Item = 'Tool'", cn, , , adCmdText

          ' Write the field names
90        For intColIndex = 0 To rs.Fields.Count - 1
100           TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
110       Next

          ' Write recordset
120       TargetRange.Offset(1, 0).CopyFromRecordset rs

LetsContinue:
130       Application.ScreenUpdating = True
140       On Error Resume Next
150       rs.Close
160       Set rs = Nothing
170       cn.Close
180       Set cn = Nothing
190       On Error GoTo 0
200       Exit Sub
Whoa:
210       MsgBox "Error Description :" & Err.Description & vbCrLf & _
             "Error at line     :" & Erl & vbCrLf & _
             "Error Number      :" & Err.Number
220       Resume LetsContinue
End Sub
8
Siddharth Rout

DAOとADOにはレコードセットオブジェクトタイプが含まれていますが、互換性はありません。rsオブジェクト変数の宣言があいまいです。

_Dim db As DAO.Database, rs As Recordset
_

潜在的な問題は、プロジェクトにADOへの参照が含まれていて、その参照の優先順位がDAO参照よりも高い場合、rsがADOレコードセットとしてではなく、 DAOレコードセット。

これが、表示されているエラーの原因かどうかはわかりません。ただし、rsはDAOレコードセットを返すため、rsがADOレコードセットの場合、OpenRecordsetdb.OpenRecordset(something)に設定すると失敗します。

宣言を次のように変更する必要があると思います。

_Dim db As DAO.Database, rs As DAO.Recordset
_

その変更で問題が解決しない場合でも、レコードセットオブジェクト変数を宣言するときに、型を修飾してalwaysにすることをお勧めします...あいまいさを避けるためです。

これで問題が解決しない場合は、コードのどの行で現在のエラーが発生しているのかをお知らせください。

これは別の危険信号です。

_Dim TargetRande As String
_

後であなたは持っています:

_Set TargetRange = Range("A1")
_

モジュールの宣言セクションに_Option Explict_を追加します。次に、VBエディターのメインメニューから[デバッグ]-> [コンパイル]を選択します。これにより、スペルミスのある変数名が強調表示され、構文エラーも警告されます。

3
HansUp

私のマシンでは問題なく動作します(ただし、フィールド名はデータの最初の行で上書きされます-フィールド名については、おそらくTargetRange.Offset(0、intColIndex)を意味します)。

Microsoft DAO 3.6 Object Libraryへのツール->参照...はありますか?

おそらく64ビット版のExcel 2010を使用していますか(「Microsoft Excelについて」セクションの「ファイル」->「ヘルプ」で確認してください)?その場合、古いバージョンのDAOライブラリは機能せず、64ビットで利用可能な64ビットのACE DAOライブラリをインストールする必要があります。

0
Govert