PowerPoint Accessと接続
Access に接続してデータの取り出し
ダイヤログで Access ファイルを選択後、データを取り出す処理のコードは次のようになります。
プロシージャ ConnectDB を新規に作成します。
'----------------------------------------- '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」を次のように書き換えます。
'----------------------------------------- 'ボタン「ダイヤログ」のクリック 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
フォーム内のみでグローバルに扱うことができる変数を追加します。
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) ですから、私はスムーズに扱うために軸を入れ替える変換しています。