|
まず任意のファイル名で空のデータベース(.MDB)を新規生成する方法です。
それには次のようなコードを実行します。
Dim wsp As Workspace
Dim dbsNew As Database
'既定の Workspace を取得
Set wsp = DBEngine.Workspaces(0)
'データベースを新規作成
Set dbsNew = wsp.CreateDatabase("c:\db\sample.mdb", _
dbLangJapanese) |
VBAで自分自身のMDBを扱う場合には、"Set dbs = CurrentDb" のような構文を使いますが、ここでは外部にMDBを作るのでCurrentDbは使えません。そこでまず、JETデータベースエンジン上に文字通りの作業領域である"ワークスペース(wsp変数)"を作成し、そこにCreateDatabaseメソッドを使ってデータベースを作成します。サンプルコードを見れば分かるように、このメソッドのポイントは1番目の引数です。MDBのファイル名およびそれをおくドライブやフォルダを指定できますので、ここに渡す文字列を任意のパスに指定してやるだけで、自由な場所にMDBを作れることが分かると思います。
CreateDatabaseメソッドの引数には他にもDAOのバージョンを指定したりすることもできますが、ここでは同等のバージョンでよいので、特にこだわらずに省略してもいいでしょう。 |
|
次に新規生成したMDBにテーブルを作成する方法です。VBAを使って外部のMDBにテーブルを作るにはいくつかの方法があります。
- TableDefsコレクションに対するAppendメソッドによる方法
- SQLの "CREATE TABLE" ステートメントを発行する方法
- "DoCmd.TransferDatabase" を使って自分自身のMDBにある空のテーブルをエクスポートする方法
1の方法は確かに細かい操作ができそうですが、どうしてもコードが複雑で長いものになりがちです。また2の方法では、フィールド数が多いとコードも長くなりますし、インデックスも同様に作ろうとするとそのためのSQLステートメントが別途必要になります。そこでここでは最もシンプルな3の方法を説明することにします。
|
3の方法の便利なところは、外部に作るテーブルをあらかじめテーブルのデザインビューによって作っておくことができるという点です。フィールドやインデックスの定義はもとより、各フィールドの属性や説明文までもデザイン画面でビジュアルに設定しておくことができます。
そしてこれを実行するコードも簡単です。次の1行を実行するだけです。
DoCmd.TransferDatabase acExport
, "Microsoft Access", <外部MDBのパス>,
acTable, <エクスポート元テーブル名>,
<エクスポート先テーブル名>
なお、T'sKitでは主キー以外のインデックスを持つテーブルは必要ないということとテーブルオブジェクトの数を少なくしたいという意図もあり、2の方法を使っています。あらかじめすべてのテーブルに対する"CREATE TABLE"ステートメントをテーブルに保存しておき、それを1件ずつ読み込みながら外部MDBに対してそれらのSQLを発行する(例:"dbsNew.Execute <SQL文>")という方法です。
|
|
最後に外部MDBに作ったテーブルをリンクする方法です。これにもまた、TableDefオブジェクトの[Connect]プロパティや[SourceTableName]プロパティを操作するなどの方法がありますが、やはりシンプルにDoCmdオブジェクトのメソッドを使ってみました。
DoCmd.TransferDatabase acLink
, "Microsoft Access", <外部MDBのパス>,
acTable, <リンク元テーブル名>,
<リンク先テーブル名>
ただし、初めてリンクする場合にはこれだけでよいのですが、すでにリンクされていて同名のテーブルがある場合にこれを実行すると、テーブル名の最後に数字がついて別のテーブルとして追加されてしまい再リンクになりません。 |
そこで、リンク先となる自分自身のMDBからそのテーブルを事前に削除しておきます(削除の場合もTableDefsコレクションのDeleteメソッドを使う方法などがあります)。
DoCmd.DeleteObject acTable, <テーブル名>
しかし今度は、初めてリンクする場合にそのテーブルが存在しないためにエラーが発生してしまいます。ここでは "On Error Resume Next" でそのエラーを無視してしまうか、エラーをハンドリングしてそのエラーなら"Resume Next"などで回避する、などの対処が必要となります。 |