• ベストアンサー

【Access2010】リンク先のmdbファイルを

A.mdbファイル内のとあるテーブルを複数のmdbファイルにリンクしてあります。 A.mdbファイルを移動するため、そのテーブルがリンクされているmdbファイルすべてを調べる方法はありませんか?

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No3です。 Access2010で動くかわからないものを載せても、 思いましたが、システムテーブルの検索ではなく TableDefのConnectプロパティを検索する方法が Access2010で受け入れらるならばと思い、載せる ことにしました。 以下を標準モジュールに貼り付け実行してみてください。 実行するのは、 Sub cmdSearch() です。 一応、実行するファイルはどのファイルでもかまいません。 一応、特定のドライブ以下のフォルダーの検索仕様です。 なお、貼り付けたあとは保存し、必ずファイルを最適化 してください。 Sub cmdSearch() Dim colFiles As New Collection Dim strBaseFile As String Dim strSearchFile As Variant Dim strSearchDir As String 'リンクされているファイルのパス。質問のA.mdbのパス strBaseFile = "C:\Users\hogehoge\Desktop\\OKWeb2\A.mdb" '検索を開始するディレクトリ strSearchDir = "C:\Users\hogehoge\Desktop" funcSearchDir colFiles, strSearchDir, "*.mdb", True For Each strSearchFile In colFiles If funcMDB(strBaseFile, strSearchFile) = True Then Debug.Print strSearchFile End If Next strSearchFile End Sub Function funcMDB(strBaseFile As Variant, strFile As Variant) As Boolean Dim db As DAO.Database Dim tdf As TableDef Set db = OpenDatabase(strFile) For Each tdf In db.TableDefs If InStr(tdf.Connect, strBaseFile) > 0 Then funcMDB = True Exit For End If Next tdf Set tdf = Nothing db.Close: Set db = Nothing End Function Function funcSearchDir(colFiles As Collection, strFolder As String, strFileDoc As String, hasSubFolder As Boolean) Dim strTemp As String Dim colFolders As New Collection Dim strFolderName As Variant strFolder = funcSerchFolder(strFolder) strTemp = Dir(strFolder & strFileDoc) Do While strTemp <> vbNullString colFiles.Add strFolder & strTemp strTemp = Dir Loop If hasSubFolder = True Then strTemp = Dir(strFolder, vbDirectory) Do While strTemp <> vbNullString If (strTemp <> ".") And (strTemp <> "..") Then If (GetAttr(strFolder & strTemp) And vbDirectory) <> 0 Then colFolders.Add strTemp End If End If strTemp = Dir Loop For Each strFolderName In colFolders Call funcSearchDir(colFiles, strFolder & strFolderName, strFileDoc, True) Next strFolderName End If End Function Function funcSerchFolder(strFolder As String) As String If Len(strFolder) > 0 Then If Right(strFolder, 1) = "\" Then funcSerchFolder = strFolder Else funcSerchFolder = strFolder & "\" End If End If End Function

KO1014
質問者

お礼

何度もご回答ありがとうございました。 せっかく詳細に記載していただいたのですが、当方の知識では貼付け方や設定方法が全然分かりません・・・ 大変申し訳ありません。 該当するmdbファイルを開いた時に都度設定し直すしかないようです。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

すみません。勘違いでしたね。 リンクテーブルをデザインビューで開き、 テーブルのプロパティを開くと説明の項に DATABASE=C:\Users\hogehoge\Desktop\OKWeb\A.mdb;TABLE=リンク先テーブル名 が表示されます。これはファイルを開きテーブルに用があるときに 応じて接続します。リンク先のファイルでテーブル名を変更すると 見つからないというエラーが生じます。 この接続情報はファイルのシステムテーブルに格納されていますが、 リンクされているテーブルには接続されているという情報は ありません。 したがって、横着な方法ですと、 いずれかのファイルを起動してテーブルを参照するときに エラーが生じるのを待って起動したファイルが参照していた テーブルの確認をすることになる、というような原始的な 方法を取るか、あるいはコードを書いてWindowsの全ディレクトリ、 全フォルダ、全ファイルを順次検索し、ファイルの拡張子がmdbの ファイルを見つけ出し、見つけたファイルのMSysObjectsという システムテーブルに接続し、テーブルのDatabaseフィールドに A.mdbがフルパスで存在し、かつNameフィールドにリンクされて いるテーブル名があり、Typeフィールドが6のレコードが存在 するか確認する、というコードを書くことになります。 が、 ここで問題になるのがMSysObjectsというシステムテーブルの 読み取り権限です。たぶん、Access2010くらいから格段にシステムへの アプローチが厳しくなり、ただでさえ以前のAccessでも他のファイルへの アプローチは厳しいものがありました。 したがって、Access2010では他のファイルのMSysObjectsの読み取りは かなり面倒かあるいは不可能にちかいかもしれません。 上記の内容のコードは書けますが、残念ながらAccess2010では 不可能かもしれません。 以上です。

KO1014
質問者

お礼

再度のご回答ありがとうございました。

  • Nobu-W
  • ベストアンサー率39% (725/1832)
回答No.2

https://hamachan.info/win8/access/link_h.html 参考になりませんか? m(_ _)m  

参考URL:
https://hamachan.info/win8/access/link_h.html
KO1014
質問者

お礼

ご回答ありがとうございました。 この方法は存じています。 No.1の回答者様と同じく、当方の知りたいこととは逆ですね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

新しいクエリをSQLビューで開き、以下を貼り付け 実行してみてください。 SELECT Database, Name, Type FROM MSysObjects WHERE Type=6 ORDER BY Name; Databaseに接続先のファイル名 Nameにテーブル名 が表示されます。

KO1014
質問者

お礼

ご回答ありがとうございました。 これはリンク元のmdbファイルを調べる方法ですね。 今回はリンク先のmdbファイルが知りたいのです。

関連するQ&A