解決済み

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

  • すぐに回答を!
  • 質問No.9599329
  • 閲覧数79
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 97% (351/361)

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

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

  • 回答No.4

ベストアンサー率 75% (677/896)

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

お礼率 97% (351/361)

何度もご回答ありがとうございました。

せっかく詳細に記載していただいたのですが、当方の知識では貼付け方や設定方法が全然分かりません・・・
大変申し訳ありません。

該当するmdbファイルを開いた時に都度設定し直すしかないようです。
投稿日時 - 2019-03-26 08:09:22

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 75% (677/896)

すみません。勘違いでしたね。

リンクテーブルをデザインビューで開き、
テーブルのプロパティを開くと説明の項に

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

お礼率 97% (351/361)

再度のご回答ありがとうございました。
投稿日時 - 2019-03-26 08:08:48
  • 回答No.2

ベストアンサー率 38% (347/905)

https://hamachan.info/win8/access/link_h.html

参考になりませんか? m(_ _)m  
お礼コメント
KO1014

お礼率 97% (351/361)

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

この方法は存じています。
No.1の回答者様と同じく、当方の知りたいこととは逆ですね。
投稿日時 - 2019-03-25 07:57:18
  • 回答No.1

ベストアンサー率 75% (677/896)

新しいクエリをSQLビューで開き、以下を貼り付け
実行してみてください。

SELECT Database, Name, Type FROM MSysObjects WHERE Type=6 ORDER BY Name;


Databaseに接続先のファイル名
Nameにテーブル名

が表示されます。
お礼コメント
KO1014

お礼率 97% (351/361)

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

これはリンク元のmdbファイルを調べる方法ですね。
今回はリンク先のmdbファイルが知りたいのです。
投稿日時 - 2019-03-25 07:56:53
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ