Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

PowerPoint Accessと接続

Access に接続してデータの取り出し

ダイヤログで Access ファイルを選択後、データを取り出す処理のコードは次のようになります。

プロシージャ ConnectDB を新規に作成します。

copy

'-----------------------------------------
'Access に接続してデータを配列に取得します。
Private Sub ConnectDB(ByVal strFileName As String)
    Dim ADOCn               As Object
    Dim ADORs               As Object
    Dim Data()              As Variant
    Dim mySQL               As String
    Dim myDate              As String
    Dim I                   As Long
    Dim J                   As Long

    'ADODBコネクションオブジェクトを作成します。
    Set ADOCn = CreateObject("ADODB.Connection")

    'Access ファイルに接続します。
    ADOCn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source = " & strFileName & ";"

    '今日の日を判定日とします。
    myDate = Format(Date, "yyyy-mm-dd")

    'SQL文の作成
    '条件は、判定日が開始日以降で、終了日以前もしくは終了日が空の場合とします。
    'A.終了日を SWITCH 関数で場合分けします。
    mySQL = "SELECT A.区画ID"
    mySQL = mySQL & ", B.登録番号"
    mySQL = mySQL & ", C.氏名"
    mySQL = mySQL & " FROM (MT_区画 AS A"
    mySQL = mySQL & " LEFT JOIN MT_契約 AS B"
    mySQL = mySQL & " ON A.区画ID = B.区画ID)"
    mySQL = mySQL & " LEFT JOIN MT_契約者 AS C"
    mySQL = mySQL & " ON B.契約者ID = C.契約者ID"
    mySQL = mySQL & " WHERE B.開始日 <= '" & myDate & "'"
    mySQL = mySQL & " AND SWITCH(B.終了日 IS NULL , '9999-12-31'"
    mySQL = mySQL & ", B.終了日 = '', '9999-12-31'"
    mySQL = mySQL & ", TRUE, B.終了日) >= '" & myDate & "'"
    mySQL = mySQL & ";"

    'レコードセットを作成します。
    Set ADORs = CreateObject("ADODB.Recordset")
    ADORs.Open mySQL, ADOCn, adOpenStatic, adLockReadOnly

    'フィールド名とインデックスを対応させたハッシュテーブルを作成します。
    Set FieldsDict = New Dictionary
    With FieldsDict
        For I = 0 To ADORs.Fields.Count - 1
            .Add ADORs.Fields(I).Name, I
        Next I
    End With

    'データを書き出す配列を作成します。
    ReDim Data(ADORs.Fields.Count - 1, ADORs.RecordCount - 1)

    'レコードセットのデータを配列に書き出します。
    Data = ADORs.GetRows

    'データを取得したので切断します。
    ADORs.Close
    Set ADORs = Nothing

    ReDim myData(UBound(Data, 2), UBound(Data, 1))
    For I = 0 To UBound(Data, 2)
        For J = 0 To UBound(Data, 1)
            myData(I, J) = Data(J, I)
        Next J
    Next I

End Sub

プロシージャ「buダイヤログ_Click」を次のように書き換えます。

copy

'-----------------------------------------
'ボタン「ダイヤログ」のクリック
Private Sub buダイヤログ_Click()
    Dim FilePath            As String

    FilePath = getFileName("Accessを選択")

    If FilePath = "" Then
        Exit Sub
    End If

    Call ConnectDB(FilePath)

    'FieldsDict を作成したのは配列の Column 値を名称で扱うためです。
    MsgBox myData(0, FieldsDict("氏名")) & " : " & myData(0, FieldsDict("登録番号"))

End Sub

フォーム内のみでグローバルに扱うことができる変数を追加します。

copy

Option Explicit

'// 64bit版
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" _
        (ByVal hwnd As LongPtr) As Long
'// 32bit版
#Else
    Private Declare Function SetForegroundWindow Lib "user32" _
        (ByVal hwnd As Long) As Long
#End If

Private xlApp               As Object

Private FieldsDict          As Dictionary
Private myData()            As Variant

Access のデータ

接続の対象となる Access のデータは次のようになっています。

このデータから期待される結果は、「大阪 一郎 : 品川300-2000」です。

実行結果

期待通りの結果です。

2次元配列

レコードセットの GetRows 関数で書き出される配列を次のように、私は理解しています。
配列のデータ構造は、下の図の上のように塊ごとに順番に1列に並んでいます。
そして、塊の中も同様に順に並んでいます。これを2次元に表現したものがその下にあります。
この規則に従って、GetRows 関数はレコード単位で順に一塊ごとに(下図の上)R[Column][Row]形式で配列に書き出すようです。
したがって、EXCEL でよく使う2次元配列の形式は R(Row, Column) ですから、私はスムーズに扱うために軸を入れ替える変換しています。