Accessのリンク先を相対パスにする方法

このQ&Aのポイント
  • Access2010を使っている場合、リンクマネージャでは絶対パスでのリンクしか定義できません。
  • しかし、アプリ.accdbを起動時に毎回動的に変更することで、相対パスにすることが可能です。
  • 具体的な手順については、本番のネットワーク環境に設置した場合のパス名を確認し、アプリ.accdbの起動時にそのパスを設定することが必要です。
回答を見る
  • ベストアンサー

Accessのリンク先を相対パスにしたい

Access2010をつぎのような環境で開発しています。 c:\開発\データ.accdb  テーブル定義と実データ格納 c:\開発\アプリ.accdb  データ.accdbのテーブル定義へのリンクとフォームなど これを本番のネットワーク環境 “\\network\本番” に設置した場合、 「c:\開発\データ.accdbは無い」旨のエラーになってしまいます。 また、本番環境のパス名はインストール先によって異なります。 Access2010のリンクマネージャでは絶対パスでのリンクしか定義できないようですが、 カレントパスに変更するには、アプリ.accdb を起動時に毎回、動的に変更するしかないのでしょうか? お教えいただきたくお願いいたします。

noname#221941
noname#221941

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

データ.accdb と アプリ.accdb が同じフォルダ内にあって アプリ.accdb のリンク先を その同じフォルダ内のデータ.accdbに設定するのなら、 VBAになりますが、アプリ.accdb に(例は標準モジュールです) Sub reLink() Dim db As DAO.Database Dim tdf As DAO.TableDef Dim lnkPath As String Dim i As Integer lnkPath = CurrentProject.path Set db = CurrentDb For Each tdf In db.TableDefs If Len(tdf.Connect) <> 0 Then tdf.Connect = ";DATABASE=" & lnkPath & "\データ.accdb" tdf.RefreshLink End If Next db.TableDefs.Refresh End Sub というのを一回実行すればリンク先が変更されます。 ただ、アプリ.accdb も共有フォルダ内に置いて、みんなが使うのは、 アプリ.accdb が壊れる可能性が高まる。 アプリ.accdb のデータもネットワークを流れるのでパフォーマンスが良くない。 という点でお勧めできません。 アプリ.accdb は各ユーザーに配布して使ってもらった方が吉。 データ.accdb のバックアップも抜かりなく。

noname#221941
質問者

補足

ありがとうございます。 質問内の アプリ.accdb は初期処理として業務選択メニュフォームを表示していますが、formload 時にお教え頂いたモジュールを実行することで求めていたことが実現できました。 また、ご回答でもご指摘のとおり、リスク回避やパフォーマンス向上のためのあるべき姿としてアプリ.accdbを共有フォルダにおくべきでないことも十分理解できました。 しかしながら、アプリ.accdbとデータ.accdbを同一フォルダにおかない場合、当該モジュールの方法ではパスの変更が実現できなくなります。 開発と本番の動作環境が異なることは、ごく自然なことと思いますが、Accessでの開発においては、本番環境移行時にリンクの絶対パスを書き換えるか、またはパス設定テーブル風なものを用意して、起動時にそれを参照するなどが、一般的なのでしょうか? それとも、もっと基本的なセオリーがあるのでしょうか? 重ねてお教え頂きたくお願いいたします。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

>アプリ.accdbとデータ.accdbを同一フォルダにおかない場合 同一フォルダに置いてリンク先を更新。それから配布。Or 開発・本番環境のPathをテーブルに保存しておき更新。 ではないでしょうかね。 アプリから複数のデータファイルにリンクを張っている場合は後者。 テーブル名|本番Path|開発Path バグ取りや機能追加を行って再配布の場合には どこか(テーブルかファイルのプロパティなど)にバージョン情報をおいて アプリの起動時にチェック。 別のプロセス(VBSや更新.accdbなど)を立ち上げて自身は終了。 更新処理(ユーザーへのコピー?)が終わったら新アプリを起動。 のように行っていました。 (当初はメール告知だけだったのですが替えてくれない方が多かった) (その他にも色々と・・・) 基本的なセオリーは独学のため、よく分かりませんが、 確実・安全・・を考えて行ってみてください。 なお、当方は社内用のモノしか作成したことが有りませんので 社外用やネットワークで繋がっていない場合に関しては門外漢です。 以上、ご参考まで。

noname#221941
質問者

お礼

重ねてのご回答、ご丁寧にありがとうございました。 大変、助かりました。

回答No.1

リンク先が変われば起動時に毎回変更するしかないでしょうね 全てのリンク先がわかっていればテーブルにパスを保存し、アプリ起動時に確認して必要なら自動でリンク変更は出来ますが、そうでなければパスは入力(設定)が必要です

関連するQ&A

  • 他のファイルからリンクしてるテーブルリンクのパスを

    アクセスです。 Sub Sample() Debug.Print CurrentDb.TableDefs("T_TEST").Connect End Sub このコードでアクセスの他のファイルからリンクしてるテーブルリンクのパスを取得できますが VBAでパスを変更するにはどうすれば良いでしょうか? 例えば ;DATABASE=C:\Users\\TEST1.accdb を ;DATABASE=C:\Users\\TEST2.accdb に変更するコードが知りたいです。

  • ACCESS クエリのリンクテーブル変更できない

    ACCESS2007-2010にて、リンクテーブルの場所変更をリンクテーブルマネージャから行いました。 リンクテーブルマネージャでのリンク先は新しい場所が表示され、テーブルオブジェクトをダブルクリックすると参照もできます。 ただし、既存のクエリを実行すると、"ファィル C:\xxx\xxxx.accdb"が見つかりませんでした。" のエラーとなります。この"C:\xxx\xxxx.accdb"は、変更前のリンク先です。クエリで定義しているテーブルはのリンク先は変更できないのでしょうか。

  • Accessでリンクテーブルのパス変更

    Accessで処理mdbとデータmdbに分けて、データmdbをリンクテーブルとして読み込んでいるのですが、データmdbのパスが変わったとき、処理mdbでデータmdbのパスを変更しなければなりません。 それが、面倒なので、手軽に変更できるように作っているのですが、「MSysObjects」の「Database」を書き換えるようと、VBAでADODB処理をしているのですが、アップデートすると「更新可能なクエリであることが必要です。」となり、書き換えることが出来ません。 strSQL = "SELECT * FROM MSysObjects;" ~ data.open strSQL ~ data("Database") = NewDatabase data.Update といった感じの処理です。因みに環境はAccess2000です。 何か、リンクテーブルを自動で書き換える簡単な方法は無いものでしょうか。

  • テーブルリンクは途切れてしまいますか?

    アクセスです。 test1.accdbのテーブルをtest2.accdbへテーブルリンクしているのですが 元ファイルのtest1.accdbのファイル名を「新test1.accdb」の様に、変更した場合、テーブルリンクは途切れてしまいますか? また一つ一つ付け直ししないとだめですか?

  • リンクテーブルについて・・・

    Access97で仕事関連のシステムを開発しています。 実データはテーブルだけのMDBファイルに格納して、 リンクテーブルとしています。 自宅ではアプリケーションMDBファイル、実データMDB ファイル共、ローカルディスクに入れていますが、 仕事場では実データMDBファイルはネットワーク上の サーバに有ります。 その為、アプリ変更の都度「リンクテーブルマネー ジャー」を行わないといけないのですが、これが結構 やっかいです。 自宅の環境では、数十テーブルのリンクに関して、 1回だけリンク先のMDBファイルを指定してやれば、 全てのテーブルリンクが完了しますが、仕事場では 各テーブル毎に1件づつリンク先を指定しないと いけません・・・なんで? あと、2つのリンク環境を一発で更新するとか、 出来ませんかネェ?

  • 他のブックへのリンクで相対パスを使いたい。

    mac2011を使っています。 Dropboxを利用して数台のMacでエクセルのデータを共有したいと考えています。 「ブックA」で「ブックB」にリンクさせていますが、Doropboxはローカルのフォルダに データを保存するため、リンクのパスは最初にデータをつくた環境(ドライブ名など)で保存されてしまいます。 そうすると、他のMacでDoropboxにあるデータを開いた時、当然環境が違うため、開くた びにリンク元ファイルを変更しなくてはなりません。 これを解決するために「相対パス」でリンクを指定したいのですが、どうしてもやり方が わかりません。 強制的に「相対パス」に変換する関数とかあるのでしょうか? よろしくお願いいたします。

  • テーブルリンク リンク元の名前を変更するには

    ファイル1.accdbのテーブルを ファイル2.accdbへテーブルリンクしていてます。 ファイル1.accdbのリンク元テーブル名は、今は「テーブル1」ですが、 この元テーブルを「新テーブル1」に変更したい場合、 どういう手順を踏めばいいでしょうか? ファイル1.accdbを開いてテーブル名を変更して、 ファイル2.accdbのテーブル1を開くと、 「入力テーブルまたはクエリ‘テーブル1’が見つかりませんでした。 そのテーブルやクエリが存在していること、または名前が正しいことを確認してください。」 と出てしまいます。 ファイル2.accdb で、リンクしている 「テーブル1」を「新テーブル1」にしても、同じエラーが出ます。 元テーブルの名前を変更したい場合は、最初からリンクしなおすしかないのでしょうか? それだけならいいのですが ファイル2.accdbでは、「テーブル1」をもとにクエリやフォームを作ってあります。 なのでクエリもすべて作り直さないとダメなのでしょうか? アクセス2010です。よろしくお願いします。

  • リンクテーブル(複数)のパス変更について<ACC2003>

    現在ACCESS2003で出荷データから売上の集計が可能となるように 試みているのですが、都合上プログラムとデータを分けて処理 したいと考えております。 そこで、リンクテーブルを活用したいと思うのですが、環境に よってパスが変更となったり、データソースを切り替えたい時 などリンクテーブルのパスが変更できると非常に有難い状況です。 多少ネットで調べVBAで変更させる方法は見つかったのですが、 基本的に1つのリンク先を想定しているとの事で、複数は対応 していないようです。 例えば、リンクテーブルをそれぞれ TBL伝票データ   → C:\DB1\A.mdb TBL得意先マスター → C:\DB2\B.mdb TBL商品マスター  → C:\DB2\C.mdb と言ったように複数リンク先がある場合でそれぞれ パス変更が生じた場合に簡単に変更ができる方法は無いでしょうか。 (リンクファイルが1つの場合) Dim db As Database Dim a As TableDef Set db = CurrentDb() For Each a In db.TableDefs If Len(a.Connect) <> 0 Then a.Connect = ";database=" & NEWPATH '→新しいパス名 a.RefreshLink End If Next db.TableDefs.Refresh

  • windows7 相対パスによるシンボリックリンク

    windows 7上で、外付けHDDに相対パスによるシンボリックリンクを張りたいのですが、できません。 D:\Data0 D:\Src という二つのフォルダがあったとします。Srcフォルダ内に、Data1というシンボリックリンクを作り、一つ上のData0に張りたいのですが、うまくできません。 % mklink /d "Data1" "../Data0" をしたところ、リンクは生成されるのですが、リンクフォルダをダブルクリックすると 「D:\Src\Data1にアクセスできません。ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」 というエラーメッセージが出て、アクセスできません。

  • アクセステーブル、リンクとローカルで違いはある?

    Access2003からSQLServerにリンクテーブルを張ったアプリケーションの作成をしています。 本番リリース時にはすべてのテーブルがリンクテーブルになる予定ですが 開発時にはローカルテーブルで開発をしたいと考えています。 理由は、DBにテスト用のゴミデータを追加したくないことと、 セキュリティの関係で接続出来るマシンが限られるためです。 現状の開発方法としては、 テーブルに一度リンクを張り、テーブル追加クエリでローカルにテーブル構造とデータを退避。 手動で主キーを定義して、そのテーブルを実体をみなして開発をしています。 SQLレベルではローカルテーブルもリンクテーブルも同等の扱いだと思っているのですが 何か制限事項などがあるのであれば教えていただきたいです。 なお、ACCESSからはDBを参照するのみで追加・更新は一切無しません。 追記。 クエリからクエリを参照して、さらにSQL内でサブクエリも記述しています。 その為、度々「クエリが複雑過ぎます。」みたいなメッセージが表示されています。 複雑というより無駄に長いだけだったりするのですが、 ローカルテーブルなら発行出来たのに、 リンクテーブルは発行出来ないなどあれば開発に支障が出ますのでよろしくお願いします。