MS Access Tips/Sample and VBA and Blog customize etc...

外部ファイルのテーブルを別の外部ファイルに転送

A.mdbというファイルのモジュールにTensou()という関数があります。そのファイルを開いている状態で、B.mdbにあるTblというテーブルをC.mdbに転送するVBAコードはつくれないでしょうか。
B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です。

こんな質問がありました。「B.mdbとC.mdbは開かないで」というのがどの辺までのことなのかよくわからないのですが。

外部データペースファイルのデータ操作をしたいという時は結構あると思いますのでそのときの参考にしてください。

ファイル転送のチャート図

難易度:

インポート、エクスポート(TransferDatabase)を使う方法

インポート、エクスポートでは、他から自分へ取り込むか、自分から他へ出力するか、しかできません。
ですので、他のデータベースファイルををOpenCurrentDatabaseで開いて、そこから実行します。
下記は、C.MDB から B.MDB をインポートしてますが、B.MDBを開いてそこからC.MDBへエクスポートしても同じです。

この方法だと、すでに同名のテーブルがある場合は、確認することなく Tbl1 というように後ろに数字が付加されて生成されます。
繰り返し実行するとTb11, Tbl2・・・と増殖していきます。

これがいやな場合は、事前でテーブルの存在を確認して存在する場合は、事前に削除する処理を追加する必要があります。

テーブルの存在を確認せずにテーブル削除を試みて、ない場合のエラーは無視するという下記のようなコードでもいいでしょう。。

ちなみにこの方法は、OpenCurrentDatabase で開いているのでNGだと質問者に言われました。

テーブル作成クエリを使う方法(Executeメソッド)

まず、B.mdbのTblをリンクテーブルとして取り込みます。
それをテーブル作成クエリでC.mdbにテーブルを作成します。
クエリで外部データベースに接続するにはIn句が使えます。

これなら、データベースは開いてないのでいいでしょう。

ここで、元のテーブルの方もIN句で接続できないかと、下記のSQLを実行してみました。

正常に実行されました。これはシンプルでいいですね。
1つのクエリで2つの接続先はできないかと思っていたのですが、追加クエリやテーブル作成クエリの場合は、追加元と追加先で別の接続先を指定できるようです。

ただし、既に同名のテーブルが存在する場合は、Executeメソッドだと実行時エラーが出て失敗します。

Execute実行時エラー

これも事前にテーブルが存在するなら削除する必要がありますが、テーブル削除のSQL(DROP TABLE)ではIN句が使えないようです。
OpenCurrentDatabase はNGなので、OpenDatabase でデータベースを開いてエラーが出たら DROP TABLE を実行するようにしました。

最初の方法のように On Error Resume Next で存在確認なしにテーブルを削除してもいいのですが、今回は、真面目にエラー処理を入れてみました(気まぐれですみません。)。
確認なしテーブル削除してますが、状況によってはメッセージボックスでユーザーに上書きしてもいいか確認した方がいい場合もあるでしょう。その場合は、下記のようにエラー処理に確認するコード追加して処理を分岐させます。

テーブル作成クエリを使用する方法(RunSQLメソッド)

実行クエリを実行するコードは、DetaBase.Execute 以外に DoCmd.RunSQL もあります。

これを実行すると既にテーブルが存在するときは、Access君が確認メッセージを出してくれます。

RunSQL上書き確認メッセージ

「はい」をクリックすると既存テーブルを削除してから実行されます。
「いいえ」をクリックすると、実行時エラーが出ます。

RunSQL実行時エラー

それを回避するために On Error Resume Next でエラーを無視してます。

Access君の出すメッセージでいいのならRunSQLで、自分好みのメッセージを出したいなら、Executeで、と使い分けるといいでしょう。

RunSQL で上書きしてもいいかの確認なし実行したい場合は下記のようになります。

実際、このままの仕様の要請は少ないかもしれません。
が、外部データベースのテーブルやデータを操作したい時の参考にはなるかなと思って、いろいろな方法を紹介しました。


拍手する

1 Comments

宮城順子 says..."大変勉強になりました"

システム部分とデータ部分を分割するツールを作成中です。
システムへ分割処理を追加することはできるのですが、【外部mdb】【外部mdb】【分割ツールmdb】はできませんでした。
新しく作成したmdbへ全テーブルをコピーするためworkspaceを使ってopendatabaseし、tabledefsでMsys以外のテーブル名を配列へ代入し、こちらのソースをコピーして実現しました。
これから削除とリンク作成ですが本当に助かりました。感謝申し上げます。

2015.07.30 09:30 | URL | #1eBVpgX6 [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/373-2cf10d9e
該当の記事は見つかりませんでした。