none
オブジェクトの挿入で埋め込んだAccessファイルでSQL実行 RRS feed

  • 質問

  • お世話になります。

    Excel2010を利用しています。

    「オブジェクトの挿入」で、Excelシート内に埋め込んだAccessファイルに対し、

    Excel VBAを用いてSQLを実行、その結果をシートに表示したいと考えております。

    ネットで検索したり、色々試行錯誤しましたが、うまく実行することが出来ませんでした。

    方法をご存じの方がおりましたら、ご教示頂きたくお願い申し上げます。

    2015年8月6日 7:14

回答

  • オブジェクトを一度ファイルに出力すれば、あとはそれをADO/DAOで読み込めばOKですね。
    オブジェクトは、コピーするとTEMPフォルダに書き込んでくれますのでそれを使えばOK <== ここがミソですね

    次のサンプルは
    ・挿入したオブジェクトのDB名はDB1.accdbです
    ・Sheet2に挿入しました
    ・オブジェクト名は、Object 1
    ※ Access2013の場合は、ACE.OLEDB.15.0 になります。
    ※ ActiveX Data Objectの参照を忘れずに

    Sub Button1_Click()

        Const DBName = "DB1.accdb"
        Dim DBPath As String
        Dim db As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim SQL As String
        Dim wSheetName  As String
        Dim i As Integer
       
        DBPath = Environ("TEMP") & "\" & DBName
       
        Sheets("Sheet2").Select
        ActiveSheet.Shapes.Range(Array("Object 1")).Select
        Selection.Copy '<== ここがミソ
        Sheets("Sheet1").Select
     
        wSheetName = ActiveSheet.Name
       
        db = DBPath
        db.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & DBPath
        db.Open
        SQL = "SELECT * FROM Broadcast;"
        rs.Open SQL, db, adOpenDynamic
     
        i = 3 ' Start Line
     
        Do Until rs.EOF
            With Worksheets(wSheetName)
                .Cells(i, 1).Value = rs(0)
                .Cells(i, 2).Value = rs(1)
            End With
            i = i + 1
            rs.MoveNext
        Loop
     
        rs.Close
        db.Close
        Set rs = Nothing
        Set db = Nothing

    End Sub

    • 回答としてマーク msnr_a 2015年8月15日 15:21
    • 回答としてマークされていない msnr_a 2015年8月15日 15:21
    • 回答としてマーク msnr_a 2015年8月15日 15:23
    2015年8月6日 9:24

すべての返信

  • オブジェクトを一度ファイルに出力すれば、あとはそれをADO/DAOで読み込めばOKですね。
    オブジェクトは、コピーするとTEMPフォルダに書き込んでくれますのでそれを使えばOK <== ここがミソですね

    次のサンプルは
    ・挿入したオブジェクトのDB名はDB1.accdbです
    ・Sheet2に挿入しました
    ・オブジェクト名は、Object 1
    ※ Access2013の場合は、ACE.OLEDB.15.0 になります。
    ※ ActiveX Data Objectの参照を忘れずに

    Sub Button1_Click()

        Const DBName = "DB1.accdb"
        Dim DBPath As String
        Dim db As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim SQL As String
        Dim wSheetName  As String
        Dim i As Integer
       
        DBPath = Environ("TEMP") & "\" & DBName
       
        Sheets("Sheet2").Select
        ActiveSheet.Shapes.Range(Array("Object 1")).Select
        Selection.Copy '<== ここがミソ
        Sheets("Sheet1").Select
     
        wSheetName = ActiveSheet.Name
       
        db = DBPath
        db.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & DBPath
        db.Open
        SQL = "SELECT * FROM Broadcast;"
        rs.Open SQL, db, adOpenDynamic
     
        i = 3 ' Start Line
     
        Do Until rs.EOF
            With Worksheets(wSheetName)
                .Cells(i, 1).Value = rs(0)
                .Cells(i, 2).Value = rs(1)
            End With
            i = i + 1
            rs.MoveNext
        Loop
     
        rs.Close
        db.Close
        Set rs = Nothing
        Set db = Nothing

    End Sub

    • 回答としてマーク msnr_a 2015年8月15日 15:21
    • 回答としてマークされていない msnr_a 2015年8月15日 15:21
    • 回答としてマーク msnr_a 2015年8月15日 15:23
    2015年8月6日 9:24
  • ご返信拝見させて頂きました。

    このような方法があるとは思いもつきませんでした。

    本日からお盆休みなので、試してみたいと存じます。

    ありがとうございました。

    2015年8月15日 15:23