はじめに
Excel VBAを使用してMySQL(MariaDB)からデータ取って来るまでの記事です。
今回は以下のバージョンで動作確認しました。
調べてみると同様の記事が多くて恥ずかしいのですが、これは自分用に・・・備忘として投稿します。
- OS
- Windows10
- DB
- MariaDB DB-10.4.14
- Excel
- Microsoft 365(64bit)
ODBCドライバーをインストール
「ODBC MySQL」などの文言で検索してください。
下記のサイトが見つかると思います。
ダウンロードする際、64bitと32bitがありますが、Excelの版に合わせてください。
Excelが64bit版なら、64bitのドライバーを選びます。
VCランタイムをインストール
ODBCをインストールしようとすると、VCランタイムが無いよ!とエラーが表示されることがあります。
「visual c++ runtime」などの文言で検索してください。
例えば、下記のサイトからダウンロードします。
Excelが64bit版ならX64、Excelが32bit版なら、X86を使用します。
上の例ではバージョンは2013ですが、なるべく新しいものを使った方が良いかと思います。
MySQLでの準備
予めMySQLにhugaというユーザーを作成し、パスワードはhogeにしています。
テスト用のデータベースtestを作成し、sampleというテーブルを追加。データを用意しておきます。
ユーザーhuga君に、データベースtestへのアクセス権限を与えます。
Excel VBA から MySQL へ接続
ADOを使用しています。接続の所で用いられる接続文字列は「ADO 接続文字列」で検索すると色々出てきます。
Function testMysql()
Dim cn As Object ' ADOコネクション
Dim rs As Object ' ADOレコードセット
Dim r As Range
Dim i As Long
' ADOコネクションを作成
Set cn = CreateObject("ADODB.Connection")
On Error GoTo errorTrap
' 接続
cn.Open _
"DRIVER={MySQL ODBC 8.0 Unicode Driver};" & _
"SERVER=localhost;" & _
"DATABASE=test;" & _
"UID=huga;" & _
"PWD=hoge;"
' SQLの実行
Set rs = cn.Execute("SELECT * FROM sample")
' 出力開始セル
Set r = Range("A1")
Do Until rs.EOF ' レコード数だけループ
For i = 0 To rs.fields.Count - 1 ' フィールド数だけループ
r.Offset(0, i).value = rs.fields(i) ' セルへ出力
Next
Set r = r.Offset(1, 0) ' 出力セルを一行下へ
rs.MoveNext ' 読取レコードも次の行へ
Loop
' 解放
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Exit Function
' エラー時の処理
errorTrap:
MsgBox (Err.Description)
Set rs = Nothing
Set cn = Nothing
End
End Function