#696 リンクテーブルなしで外部DBのテーブルにアクセスするには? VBA

外部のデータベースファイル内にあるテーブルを参照する場合、多くはそれを”リンクテーブル”として接続して使うことが多いと思います。直接その内容を自身のデータベースから確認できますし、データ編集もできますし、クエリやフォームを作る際も何かと便利です。

しかし、データの取り扱いや処理によっては必ずしもリンクテーブルとして持つ必要はありません。たとえば、下記の例では外部の「Database1.accdb」にある「tbl販売計画」テーブルに対して、あるプロシージャ上で接続からデータ処理までを行っています。リンクテーブルとの違いは、「OpenDatabase」メソッドを使って、フルパスを指定して外部のデータベースファイルを開くくらいです。

Dim dbsExt As Database
Dim rstExt As Recordset
Dim dd As Byte

'外部のデータベースを開く
Set dbsExt = OpenDatabase("C:\テスト\Database1.accdb")

'外部のテーブルを開く
Set rstExt = dbsExt.OpenRecordset("tbl販売計画")
With rstExt
  '先頭レコードの値を取得する
  Debug.Print !ID, !日付, !商品コード, .Fields("1日")

  '先頭コードを編集して結果を取得する
  .Edit
    .Fields("1日") = 9999
  .Update
  Debug.Print !ID, !日付, !商品コード, .Fields("1日")

  '新規レコードを追加して結果を取得する
  .AddNew
    !日付 = #10/1/2020#
    !商品コード = "4901340136922"
    For dd = 1 To 31
      .Fields(dd & "日") = dd
    Next dd
  .Update
  .MoveLast
  Debug.Print !ID, !日付, !商品コード
  For dd = 1 To 31
    Debug.Print .Fields(dd & "日")
  Next dd

  .Close

End With


実行例:
  • 実行前のテーブル

  • 実行時のイミディエイトウィンドウ

  • 実行後のテーブル


【注意事項】
上記の例では外部のテーブルだけを扱っています。このプロシージャ内で自分自身のデータベース内のテーブルなどを処理することはしていません。
しかしもし、同じプロシージャ内で外部のテーブルも扱うし内部のテーブルも扱うといった場合、たとえば外部のテーブルのレコードを読み込んでそれを内部テーブルに追加するような場合、自身のデータベースを開くために「Set dbs = CurrentDb」のような1行もいっしょに記述するはずです。
そのような場合、「Set dbs = CurrentDb」の記述位置が「Set dbsExt = OpenDatabase」より後ろだとエラーとなることがあります。そのようなときは「Set dbs = CurrentDb」を「Set dbsExt = OpenDatabase」より前に記述してみてください。

| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved