だいぶ前からまとめてみたいとは思っていたのですが、書きたいことのボリュームがどんどん増えてゆき、シリーズものになってしまいました…。できるだけ分かりやすく書けるようがんばります!
関連記事
- 第1回 Excelからデータベースへの接続 ←NOW!
- 第2回 テーブル設計とシート&コードの準備
- 第3回 SQLを使った読み書きの処理
- 第4回 条件を絞ってデータを読み込む
- 第5回 レコードの編集・削除
- 第6回 トランザクション処理
連携させるメリット
小規模なデータ量ならExcelだけでもなんとかなるし、Accessだって単体でアプリケーションも作れます。が、敢えてAccessのデータベースをExcelから操作する(私にとっての)メリットについて。
グラフ化が容易
私は製造業を営む会社に勤めておりまして、しかも数年前まで品質保証課にいました。1/1000mm単位の膨大な量の測定データを毎日毎日Excelに溜め込んでいってたんですねー。Excelにデータを格納すると、グラフのテンプレートさえ作っておけば、自動でグラフに描写されていくので便利なんです。
でも、データを溜めれば溜めるほどファイルサイズは大きく、動作も重くなる…。結局、ある程度の期間でファイルを新規にし、またそこへデータを溜めていく日々。どうなのこれ…。
そこで、
- Excelのシート上に測定データを入力
- データをAccessのデータベースへ格納
- データを見たいときはExcelへ読み込んでグラフ化
という方式へたどり着きました。Excel自体にデータは格納されないので、ファイルサイズは増えないし動きもサクサク。いろんな条件で絞り込んでデータを読み込めるから、前より便利になりました!
ExcelのVBAは勉強しやすい
MicroSoftOfficeにはどれもVBAが使えると思うのですが、ダントツでユーザーが多いのがExcelVBAです。
ユーザーが多いということは、それだけ勉強している人も多くて、ネット上でも情報が抱負です。(私もそのひとりですがw)AccessやPowerPointのVBAは情報が少なくて難しいんですよね…(;´Д`)
中小企業の強い味方
私の会社もそうですが、業務ソフトの自社開発は使用面でも金額面でも非常にメリットが大きいです。Excel+Accessでかなり実用的なものもつくれちゃうと思います。
Accessでテーブルを用意
というわけで、AccessではVBAを使わずに、データベースのテーブル設計だけやっておきます。
テーブルとは、こんな感じのものです。フィールドの名前と型(数値とか、文字列とか)を指定しておいて、そこへレコードを登録していきます。
フィールドには必ず1つ以上のキーと呼ばれる重複しないデータの入るフィールドを設定する必要があります。
この例なら、男か女かではひとつのレコードを特定できませんよね。名前も、同じ人がいるかもしれないのでキーにはできません。必ずひとつでないとならないので、IDや番号などを設定することが多いです。
ADOとSQL文を使ってExcelから読み書き
データベースへ読み書きするには、SQLという言語を使います。ExcelVBAでSQL文はそのままでは認識できないので、string型で宣言した変数に文字列としてSQL文を書いておいて、それをADOというインタフェースを使ってAccessを操作する…という感じで…合ってると思うんですが。。(間違ってたら教えてください!)
ADOというのはActiveX Data Objectsの略で、Microsoftが提唱しているデータアクセスのための技術だとか。アプリケーション、言語などに依存しないため使い勝手がよいらしいです!
基本コード
参照設定は使わない方法で書いてみたので、できるだけ幅広い環境で動けばいいなと思ってます。
Sub sample()
Dim DBpath As String 'ファイル名
Dim adoCn As Object 'ADOコネクションオブジェクト
Dim adoRs As Object 'ADOレコードセットオブジェクト
Dim strSQL As String 'SQL文
DBpath = "C:\sample.mdb" '接続するファイルのフルパス
Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成
adoCn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBpath & ";" 'Accessファイルを開く
strSQL = "ここにSQL文を入れます" 'SQL文をString形式になるように
'書込・編集・削除の場合----------------------------------
adoCn.Execute strSQL 'SQLを実行
'--------------------------書込・編集・削除の場合ここまで
'読込の場合----------------------------------------------
adoRs.Open strSQL, adoCn 'SQLを実行して対象をRecordSetへ
'出力方法1-スタートのセルを指定して一気に貼り付け
Range("A1").CopyFromRecordset adoRs
'出力方法2-ひとつひとつ貼り付け
i = 1 'スタート行
Do Until adoRs.EOF 'レコードセットが終了するまで処理を繰り返す
Cells(i, 1) = adoRs!フィールド名1
Cells(i, 2) = adoRs!フィールド名2
Cells(i, 3) = adoRs!フィールド名3
i = i + 1 '行をカウントアップする
adoRs.MoveNext '次のレコードに移動する
Loop
'--------------------------------------読込の場合ここまで
adoRs.Close 'レコードセットのクローズ
adoCn.Close 'コネクションのクローズ
Set adoRs = Nothing 'オブジェクトの破棄
Set adoCn = Nothing
End Sub
- 宣言(2~5行)
- 接続・セット(7~10行)
- 処理(13~34行)
- 切断(37~40行)
というのが一連の流れかなという感じです。処理部分(13~34行)だけ変えれば汎用的に使えそう。
10行目、Accessファイルを開くところですが、上記はAccessのバージョンが2003までの対応で、2007以降は拡張子が.accdbで、ProviderをMicrosoft.Jet.OLEDB.4.0からMicrosoft.ACE.OLEDB.12.0へ変更が必要なようです。
Excelへの出力については、一気にズバっと貼り付けする方法と、カスタマイズしながら貼り付けできる(量が多いと遅そう)方法があるみたいですね。両方書いてみましたが、用途によって使い分ければ良さそうです。
次回は、具体的に「こんなモノをつくるぞ」という提示をして、実際にAccess+Excelで動くプログラムを作って解説してみたいと思っています。よろしければお付き合いください。
参考
- 6.2 CreateObjectを使う方法 – Access VBA Tips
- ADOを使ってExcelからAccessデータを利用してみよう | Excel・Accessで楽々シゴト!INFITH VBA Lab
ExcelでOracle,DB2,Sybase,MySQL,Postgre,SQLServer,Sqliteのデータを取得/更新するなら、ExcelDBToolをお勧めします。
テーブルのデータをエクセルに取得、更新、削除することだけではなく、複数のSQLを実行して、結果を
一括Excelの各シートに出力することもできます。データ作成の機能を使って、
氏名、住所、電話など60種類以上のダミーデータも作成できます。
作成したデータを直接DBに登録して、シート名とテーブル名が一致すれば、
一括で複数テーブルのデータもExcelに取得できます。
詳しくは下記サイトをご参照ください。
http://www.superdbtool.com
ベクターからもダウンロードできます。
またExcelDBToolを使って、テストデータを作成するのは非常に簡単です。
作成できるダミーデータ種類:
郵便番号, 都道府県, 企業名, 市区,町村,最寄駅,最寄駅ふりがな,路線,銀行コード, 銀行名, 銀行カタカナ, 支店コード, 支店名, 支店カタカナ,E-Mail, URL, 携帯, 苗字のみ, 氏名, 住所, 住所ふりがな,性別, 年齢, 血液型, 固定電話, 婚姻, ふりがな, 大学名,身長,体重固定値,国籍,国籍英語,国籍英語略,クレジットカード会社,クレジットカード番号,有効期限,IPアドレス,業種大分類,業種大分類名称,業種中分類,業種中分類名称,業種小分類,業種小分類名称,職種大分類,職種大分類名称,職種中分類,職種中分類名称,職種小分類,職種小分類名称,数値連番,整数・小数点数,英数混在,文字列+連番,文字列+全角連番全角漢字,ひらがな,全角カタカナ,半角カタカナ,全角英数,全角数値,全角英字,全半混在日付,時間,タイムスタンプ,特殊文字
こんなツールがあるんですね!情報ありがとうございますー!