今回はAccess VBAで、自分自身であるAccessファイルが自端末上で開かれているか、ネットワーク越しに開かれているかを判別して、ネットワーク越しに開かれていたらメッセージを出して自身を閉じる一連の処理のVBAサンプルコードを紹介します。
なぜネットワーク越しにAccessファイルを開いてはいけないのか?
Accessファイルは制限を掛けない限り、ネットワーク上の共有フォルダなどにファイルを置いておけば、複数ユーザーで同時に一つのファイルを開くことができます。
一見すると、大変便利に思えるかも知れないのですが、実際にそういった使い方をすると、高い確率でそのmdbファイルやaccdbファイルは破損します。
よって、必ず利用者の自端末内に対象のファイルをコピーして使用していただく必要があります。
また、不必要な通信が発生することで、Accessアプリケーションのレスポンスが悪くなる恐れもあります。
ただ、実際に現場では、システム管理者がその様に予め伝えておいても、勝手に共有フォルダにファイルを配置し、ユーザーの部署内で一つのファイルを共有して利用するケースが後を絶ちません。
その方がスマートな使い方だと勘違いしている節がありますが、Accessはそれが許されないので、そういったルールが守られない場合は、Accessアプリケーション側でどこのファイルが開かれているのかを判別して、ネットワーク越しに開いている場合は、自端末内のファイルを開くように促す処理を入れて、自端末に存在するAccessファイルしか起動できないよう仕様に変更してしまうのが手っ取り早いでしょう。
そこで今回のサンプルコードを利用してみては如何でしょうか。
起動場所をチェックするサンプルコード
当項では、Accessファイルの起動場所をチェックするサンプルコードを紹介します。
尚、実装内容としては、起動場所がネットワーク上か否かを判別するFunctionプロシージャを作成し、ファイルを開いた際に自動的に起動するフォームのロード時などのイベントの最初にそのFunctionプロシージャーを使ってチェックする流れです。
起動場所がネットワーク上か否かを判別するサンプルコード
AccessVBAでは、ApplicationオブジェクトのCurrentDbメソッドで自身の情報を取得できる為、今回はこのメソッドのNameプロパティを利用します。
'現在開いたAccessファイルがネットワーク上のファイルか否かを判別し、その結果を返します。 '引数1:無し '戻り値:真偽 True=ネットワーク上ファイル Function Is_NetworkFileOpen() As Boolean Is_NetworkFileOpen = False '開いたファイルのフルパスを取得して、文字列の先頭が\ならネットワーク上のファイルと判定します。 If Left(Application.CurrentDb.Name, 1) = "\" Then Is_NetworkFileOpen = True End If End Function
起動場所判定処理を呼び出すサンプルコード
ファイルを開いた際に自動的に呼び出されるフォームのロードイベント時など起動直後に呼び出される処理内で、起動場所をチェックする処理を入れると良いです。
※以下の実装例ではフォーム読み込み時イベント内で実装しています。
Private Sub Form_Load() If Is_NetworkFileOpen Then MsgBox "ネットワーク上のファイルを開くとファイルが破損する可能性があります。" & vbCrLf _ & "デスクトップにファイルをコピーしてから起動してください。" 'Accessを終了します。 DoCmd.Quit acQuitSaveAll End If End Sub
最後に
今回は、共有フォルダなどのネットワーク越しにAccessファイルを開いた場合にメッセージを表示して起動をさせないようにする処理をVBAで作成しました。
ユーザーはダメだと伝えていても、何故かファイルサーバーなどの共有フォルダにAccessファイルを置いて使いたがるので、最初からこのような処理を仕込んでおくことは大変効果的だと思います。
是非御社のAccessアプリケーションでも今回の処理を実装してみてください。
今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう。