6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Accessでリンクテーブルの接続先を一括変更するには

Last updated at Posted at 2020-03-08

Microsoft Access のお問い合わせで圧倒的に多いのは、**PCやファイルサーバをリプレースしたら動かなくなった!**というもの。
PCなら4年、サーバなら5年。これが税制上定められている減価償却期間(法定耐用年数)なので、この周期で必ずやってくるのだ。

そして今回は、『パス 'フルパス文字列' は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。』というエラーメッセージで停止している。
Windowsのコンピュータ名(ホスト名)が変更されたことに因る影響だ。
image.png
VBAに明るいユーザーならここでVBEを起動し、エラーの原因となったフルパス文字列の全検索を試みるのだが、それでも見つからないので、一体どこで定義しているの!?と途方に暮れることになる。
image.png
このエラーメッセージで先ず疑うのはリンクテーブルの接続先。
次の操作で、データソースが古いパス名を指していないかチェックしてみよう。


  1. [外部データ] :arrow_forward: [リンクテーブルマネージャー] の順にクリック。
    image.png

  2. リンクテーブルマネージャーで、該当するデータソースを選択し、[編集] をクリック。
    image.png

  3. データソースのパスを書き替えて [保存] をクリック。すべて修正したら最後に [更新] を実行。
    image.png


リンクテーブルを多用している場合、いちいち手で直してられないので、マクロで一括変換してしまおう。

Sub データソースパス一括変更()
    Dim td As DAO.TableDef
    Dim sBefore As String, sAfter As String
    Dim sFrom As String, sTo As String
    
    sFrom = "uksrv01w"  '検索する文字列
    sTo = "uksrv02w"    '置換する文字列
    
    For Each td In CurrentDb.TableDefs   'すべてのテーブルで
        If td.Attributes And dbAttachedTable Then   'リンクテーブルなら
            sBefore = td.Connect   '接続文字列を取得
            sAfter = Replace(sBefore, sFrom, sTo)
            If sBefore <> sAfter Then   '置換されていたら
                td.Connect = sAfter
                td.RefreshLink   'リンクを更新
                Debug.Print sBefore & " ==> " & sAfter
            End If
        End If
    Next
End Sub

言うまでもないが、実行前に必ずバックアップを取っておくこと。
複雑な置換には正規表現で対処しても良いだろう。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?