概要
VBAでFileMakerのデータを扱いたかったのですが
ODBCでエクセルメニューのデータ→外部データの取り込み
あたりの情報しか出てこずADOで接続しSQLでデータを抽出したかったので同じ悩みを抱えている方がいたらこの説明で助けになれば嬉しいです。
前提
@tyumaさんがFileMakerのODBC設定について詳しく説明して下さっている
【FileMaker】もうエクスポートはしない。ExcelからFileMakerのデータを持ってくる!
の**[ODBCデータソース(DSN)を作成する]**までの作業が終わっている前提でご説明します。
VBAコードは下記のサイトを参考にしました。
データベース(Oracle)に接続する(ODBC を使用)
サンプルVBAソース
Sub Sample_ODBC_oracle()
Dim oraCon As ADODB.Connection
Dim oraRs As ADODB.Recordset
Dim constr As String
Dim strSQL As String
Dim col As Long
Dim row As Long
Const DSN = "ODBC For Fm" 'データソース名
Const USERNAME = "test" '接続するデータベースのユーザー名
Const PASSWORD = "test" 'パスワード
Set oraCon = New ADODB.Connection
'データソース名を指定する
constr = "DSN=" & DSN
constr = constr & ";UID=" & USERNAME
constr = constr & ";PWD=" & PASSWORD
oraCon.ConnectionString = constr
oraCon.Open
'※テーブル名やカラム名が日本語の場合はダブルコーテーション(")で囲わないといけないです
'1、テーブルから全てのカラムのデータを取得
strSQL = "SELECT * FROM ""テーブル1"""
'2、結合して全てのカラムのデータを取得
strSQL = "SELECT * FROM ""テーブル1"" INNER JOIN ""テーブル2"" ON ""テーブル1"".""カラム1"" = ""テーブル2"".""カラム2"""
Set oraRs = New ADODB.Recordset
oraRs.Open strSQL, oraCon
With Worksheets("Sheet1")
.Cells.Clear
'フィールド名
For col = 0 To oraRs.Fields.count - 1
.Cells(1, col + 1) = oraRs(col).Name
Next col
'レコード
Do Until oraRs.EOF
For col = 0 To oraRs.Fields.count - 1
.Cells(row + 2, col + 1) = oraRs(col).Value
Next col
row = row + 1
oraRs.MoveNext
Loop
End With
oraRs.Close
oraCon.Close
Set oraCon = Nothing
End Sub
FileMakerで作成した仮想テーブルも1、や2、のSQLと同じような書き方でデータを取得できます。
##注意点
ただ残念なことが1つ。FileMakerからデータを取得するにはデータを取得したいFileMakerのファイルを起動していないと取得することができません。
なのでFileMakerのファイルを暗号化したとしてもファイルを開いてからでないとVBAで取得できないので暗号化してもこのコードで問題ありません。