Accessファイルをオンライン更新するテクニック

Accessは小さなデータベースで、VBAが使えることから非常に多くの現場のシステム構築として利用されてきました。しかし、デメリットとして、アップデートをした場合にそのファイルの配布方法とアップデート方法に於いては、非常にアナログな手法が用いられており、管理するのが大変面倒ということは言われ続けてきました。

最近のアプリケーションのように、オンライン経由でアップデート通知や自動ダウンロード、サイレントアップデートなどができれば、このデメリットも大きく克服ができるのではと考え、今回自分が現場のシステムで使ってるオンラインアップデート方法について公開してみたいと思います。

今回使用するファイル

仕組み

今回のこの仕組はオンラインといっても、ファイルサーバーでも良いですし、どこかのクラウド上で直リンクでダウンロードできるならば使える仕組みです。今回使用するファイルのうち

  • アップデート情報の入ったXMLファイル
  • アップデートする本体の入ったZIPファイル

の2つはオンライン上のどこかに配置しなければなりません。今回は、https://officeforest.org/update/以下にこの2つのファイルを保存してあります。

その後、実際にアップデートする場合には、以下の手順でファイルを差し替えます。

  1. XMLファイルのverの項目を最新のバージョン数値に書き換え、サーバ上のファイルを差し替える
  2. そのバージョンに該当するファイルをupdate.zipとして圧縮し、サーバ上のファイルを差し替える

配布済みのプログラムは最初に起動させるのは、start.accdb(一番最初に起動させるデータベースファイル)としプログラムであるtestdatabase.accdb(プログラム本体のファイル)は直接は起動させません。start.accdbがアップデート情報を読み取り、更新後にtest.accdbを起動する仕組みになっている為です。

※現在のプログラム本体のファイルのバージョン情報は、start.accdbのsettingテーブルに入っています。

図:Webサーバ上にファイルを配置してみた

ソースコード

XMLファイルのコード

  • verは最新バージョンのバージョン数値
  • zipは最新バージョンのファイルがある場所のURLを記述

start.accdb起動時に実行するコード

  • start.accdbは起動時にAutoexecマクロを実行するように仕込んであります。
  • また、start.accdb自体は起動時に最小化され表示されないようにしてあります。
  • Autoexecマクロを実行すると、ウィンドウは最小化され、updateexecプロシージャを実行します。
  • 本プログラムは、Microsoft Scripting RuntimeおよびMicrosoft XML v6.0を参照設定で追加しています。
  • start.accdbのsettingにあるバージョンとver.xmlに入ってるバージョン情報を比較し、後者が大きい場合にはzipファイルをダウンロードし、zipmeltで解凍しtest.accdbを上書きします。
  • アップデートがない場合には、通常どおり、testdatabase.accdbが起動します。
  • Windows APIとしてURLDownloadToFileおよびShowWindowの2つを呼び出すようDLLの呼び出しを冒頭に追加しています。
  • 通常通り起動(もしくはアップデートをキャンセル時)すると、v1.5のフォームが表示され、アップデートされた場合にはv2.0のフォームが表示されるようになっています。
  • OS標準機能でZIPを解凍してるので、この機能はWindows7以上での動作要件となります。

図:アップデータがあるとメッセージが出る仕組み

図:通常はこのフォームが表示。アプデすると中身が変わる

実行結果

実際にstart.accdbを起動してみましょう。

すると、ウェブ上のver.xmlを読み取り、バージョン比較後、アップデートの実行をするとver.xml内に記述されたファイルをダウンロード。その後ZIP解凍し、プログラム本体であるtestdatabase.accdbを起動して完了という手順になります。

アップデート実行後、start.accdbのsettingテーブルには最新のバージョンが書き込まれ、次回起動時のバージョン比較にまた利用されるようになっています。プログラム本体であるtestdatabase.accdbにアップデートルーチンを書いてしまうと、起動している為上書きができないため、このstart.accdbとの二段構えに構成しているのがポイントです。

※再度start.accdbを起動しても最新版なのでアップデートの画面は出ず、通常通りtestdatabase.accdbが起動するようになります。

図:無事にVersion 2.0へアップデートされた。

Accessファイルをオンライン更新するテクニック” に対して5件のコメントがあります。

  1. てつくん より:

    vbaは初心者ですがAccessのデータベースをオンラインで自動的にアップデートをしたいと考えてたところ、この記事を見つけました。

    参考にしなが実際コードを実行すると行No.82のところ実行時エラー91でオブジェクト変数またはwithブロック変数が設定されていませんのエラーが出てその先に進みませんでした。

    もしよろしければエラーの対策などがありましたは教え下さいm(_ _)m

    1. officeの杜 より:

      てつくん様

      officeの杜管理人です。
      参照設定で、Microsoft XML v6.0は追加されていますか?ここでコケるということは、だいたい参照設定が入っていないケースが多いのですが。

      1. てつくん より:

        管理人様
        お返事ありがとうございます。

        参照設定にてMicrosoft XML V6.0にチェックは入っております。

        その他は
        Visual Basic For Application
        Microsoft Access 16.0 Object Library
        OLE Automation
        Microsoft Scripting Runtime
        Microsoft Office 16.0 Access database engine

        にもチェックは入っております。

        実行した際、エラー箇所にカーソルあてるとXmlNol = Nothing と表示されます。

        この辺りが気になっております
        知識不足ですみませんm(_ _)m

        1. てつくん より:

          管理人様

          何度も申し訳ありません。

          色々とチェックしながら進めていたところ、エラーも出ずにアップデートをする事ができました。

          原因は私です。。。

          サーバーにおいたxmlファイルとzipファイルに直リンクの許可をしたところ、無事に動きました。

          ご迷惑お掛けしました。

          1. officeの杜 より:

            てつくん様

            officeの杜管理人です。
            VBAのエラーメッセージは酷くわかりにくいのが多いので仕方ないです。古い言語なので。

            とりあえず、動いてよかったです。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。