【MS Aceess】Accessアプリケーションの簡易自動バージョンアップ実装

MS Access
スポンサーリンク

企業のサブシステムをMicrosoftのAccessで構築している会社も多いかと思います。確かにAccessはローカルにデータベースが持てて、GUIでクエリが作れて、VBベースのフォームが作れて、レポート機能もあり、ORACLEやSQLServerなどとも接続出来ます。とっても便利です。

Accessで作られたサブシステムや会社によっては基幹的なシステムもあるかと思いますが、それらのお守りをするのも情シスさんのお仕事です。ただ、そのAccessシステムを使用しているユーザーが多いと、プログラムの変更などを加えたあとに各ユーザーの端末に入っているAccessファイルを置き換えてあげる必要があり、非常に面倒です。

そこで今回はAccessのmdbファイルを自動で最新のバージョンにバージョンアップする仕組みを紹介します。自動バージョンアップというのは、アプリケーション起動時に、最新のバージョンが公開されていたら自動的に自身を最新に置き換えるようなよくあるやつです。

Accessで実装する場合は色々やり方がありますが、今回はVBScriptと組み合わせたものを紹介します。

処理の流れ

自動バージョンアップにおける処理の流れは以下です。

  1. Accessファイルを起動
  2. 起動時の処理で、所定の共有フォルダ内に自分のバージョンナンバーより大きいフォルダ名のフォルダが存在しているかを判定
  3. 上記2の処理で大きいフォルダ名が存在していれば、共有フォルダに置いてあるVBScriptファイルに対して、上記2の処理で取得した最新のバージョンナンバーの値と自身のファイルのローカルフルパスを起動引数で渡して実行→自身(Access)を終了
  4. VBScriptファイルが引数で渡されたバージョンナンバーのフォルダに入っているAccessファイルを引数で渡されたローカルのファイルパスにコピーして上書き

要約するとこんな流れです。

前提とする動作環境

前提条件は以下のような環境です。

  • 社内のファイルサーバの共有フォルダに配信用のAccessファイルを設置する。
  • ファイルサーバの共有フォルダにバージョンアップ専用フォルダを用意し、そのフォルダの直下に、バージョンナンバーをフォルダ名としたフォルダを追加していく。さらにそのバージョンナンバーのフォルダのなかにそのバージョンのAccessファイルを格納する。
  • バージョンアップ用共有フォルダはユーザーが誰でも接続出来るアクセス権が設定されている必要がある。
  • Accessファイルのローカルテーブルに自身のバージョンナンバーとファイルサーバのバージョンアップ用共有フォルダのパスを格納する。※バージョンごとにローカルテーブルのバージョンナンバーの値は書き換えて共有フォルダに配置する。
  • Accessファイルは同じ名前で統一する。※バージョンナンバーをファイル名に付与したりはしない。
  • VBScriptファイルはファイルサーバのバージョンアップ用共有フォルダの直下に配置する。

前提条件は以上です。

実装方法

ローカルテーブル作成

自身の現バージョン番号と最新バージョンが存在するかをチェックする先の共有フォルダのパスをローカルテーブルで管理する為のテーブルを作成します。

▪️テーブル名:バージョン

バージョン番号参照先パス
1.0.0¥¥共有フォルダにあるバージョンチェックフォルダのパス

Access VBA

Access側のバージョンアップ用処理用のコードを以下に記載します。尚、今回のサンプルでは、ラベルだけしかコントロールが無いフォームを一つ作成し、そのフォームをAccessファイル起動時に表示するフォームとして設定しておきます。

Option Compare Database
Option Explicit

Private Sub Form_Load()

    Dim Message As String
    Dim strVersion As String
    Dim strNextVersion As String
    Dim strVerUpFolder As String
    Dim strLocalFileFullName As String
    
        Message = "アップデートチェックをしています。"
        Me.lblMessage.Caption = Message
    
        'ローカルテーブルのバージョン番号を取得します。
        strVersion = DLookup("バージョン番号", "バージョン")
        '各バージョンのファイルが置かれているフォルダのパスを取得します。
        strVerUpFolder = DLookup("参照先パス", "バージョン")
        '自身のカレントファイルパスを取得します。
        strLocalFileFullName = Application.CurrentProject.FullName
        
        strNextVersion = GetNewVersionNo(strVersion, strVerUpFolder)
        If strNextVersion = "" Then
            '最新バージョンは存在しない為メインフォームを呼び出して処理を終了します。
            DoCmd.OpenForm "frmMain"  'フォーム名を指定します。※環境によって変更してください。
            DoCmd.Close acForm, Me.Name
        Else
            '最新バージョンが存在した場合はVBScriptファイルを呼び出してmdbファイルを置き換えます。
            MsgBox "最新のバージョンが存在する為ファイルを置き換えます。"
            'Shell関数を使ってVBScriptファイルに引数を渡して呼び出します。
            Shell ("WScript.exe """ & strVerUpFolder & "\AutoUpdate.vbs" & """" & " " & strLocalFileFullName & " " & strNextVersion)
            'Accessを終了します。
            DoCmd.Quit acQuitSaveNone
        End If
    

End Sub

'引数で渡されたパラメーターを元に、自バージョンより大きいバージョン№を取得します。
Function GetNewVersionNo(LocalVersionNo As String, TargetFolder As String) As String

    GetNewVersionNo = ""

    Dim fso As FileSystemObject
    Dim pfl As Folder
    Dim fl As Folder
    
        Set fso = New FileSystemObject ' インスタンス化
        Set pfl = fso.GetFolder(TargetFolder) ' 親フォルダを取得

        For Each fl In pfl.SubFolders ' サブフォルダの一覧を取得
            'ローカルのバージョンNOより大きいフォルダ名があるかを判定します。
            If LocalVersionNo < fl.Name Then
                GetNewVersionNo = fl.Name
                Exit For
            End If
        Next

        ' 後始末
        Set fso = Nothing

End Function

部分的に解説をすると、まず、上記のサンプルコードはバージョンアップ用の新規フォームの処理として貼り付けてください。そのうえで、いくつかの部分を自身の環境に合わせて修正してください。

13行目は、フォーム内にlblMessageというコントロール名のラベルが存在している想定です。必要なければ当処理は排除してください。

16行目と18行目は、Accessのローカルテーブルとして、テーブル名「バージョン」。カラムは「バージョン番号」と「参照先パス」の二つが有り、行数は1行だけのテーブルに対して、DLookupで設定値を取得しています。

24行目と25行目で新しいバージョンが見つからなければ、自身のフォームを閉じてメインメニュー用のフォームを呼び出します。ここは適切に変更してください。

VBScript

続いて、VBScript側のサンプルコードを記載します。

Option Explicit

Dim ArgsLocalFile
Dim ArgsVersionNo
Dim CurrentDir
Dim objWshShell
Dim objFS
Dim CopySrcFullName

	'5秒(5000ミリ秒)処理を止めます。
	WScript.Sleep 5000

	'引数で渡されてきた値を変数に格納します。
	ArgsLocalFile = Wscript.Arguments(0)
	ArgsVersionNo = Wscript.Arguments(1)

	CurrentDir = "\\ファイルサーバ名\共有フォルダ名\○○システムAccess自動バージョンアップ"

	'コピー元のフルパスをセットします。
	CopySrcFullName = CurrentDir & "\" & ArgsVersionNo & "\○○システム.mdb"

	Set objFS = CreateObject("Scripting.FileSystemObject")
	Call objFS.CopyFile(CopySrcFullName, ArgsLocalFile)

	'オブジェクトを解放します。
	Set objFS = Nothing
	Set objWshShell = Nothing

	msgbox "アップデートが正常に終了しました。"

上記も簡単に解説します。

11行目で5秒待たせています。これは、Accessファイルによっては閉じる際に”最適化”処理が設定されている場合もあり、閉じる処理に時間が掛かると、23行目のファイルの上書きコピーに失敗する可能性があるので、確実にAccessファイルが閉じると思われる秒数を待機させています。

後は、特に高度な処理はしていない為、フォルダ構成などが合っていれば、このサンプルコードをそのまま真似てもらえれば適切に動作すると思われます。

是非参考にしてください。

それでは今回もありがとうございました。

※Access 関連記事はこちら↓

【MS Access】クエリが遅い原因と速度改善について1
Microsoft Accessを使ってデータ抽出をされている人も多いかと思います。 AccessならSQLがわか...