2人目からは「読み取り専用」になる。

ネットワーク上にあるサーバのフォルダ等を利用して共通に利用するExcelワークブックを保存しておき、更新したい人が開いて利用するのが一般的ですが、当然、1人の人が開いているワークブックは他の人からは更新用としては開けません。「共有ブック」という機能がありますが、ある程度の仕組みのマクロを実装したワークブックでは利用できません。
また、「共有ブック」は行の挿入、削除、更新が混在した時の動作が運用上の「データベース」的な理解通りに行かないケースがあることや、内部の更新履歴情報が肥大となって保存に失敗してネットワーク上だとワークブックそのものを壊してしまうことも起こります。

データを共有サーバなどに保管して、どこからでも参照できるようにする。
よく取り組んでいた方法ですが、一覧表と詳細内容登録のシートを用意したワークブックを用いて詳細内容登録毎に一覧表を更新する仕組みの例を説明します。
データだけを共有ファイルサーバに保持させる。
データベースシステムをExcelで作るようなものですが、データベースサーバを立てずに運用するため、テキストファイルとフォルダのみで管理しています。
データベースサーバを立てない理由は、
  • 環境上、ファイルサーバしか利用できない。
  • クライアントライセンスを多数用意しなければならない。(費用的な問題)
と言ったところです。
Excelの範疇を超えている」との意見もいただきますが、一覧表がExcelの限度行数を超えるような件数でない限り、現在のCPU能力であればExcelで作成する仕組みで充分なレスポンスで動作します。
  • データは、詳細登録内容1件が1ファイルとなるテキストファイルで、全社どこからでも参照できるネットワーク上のフォルダに管理番号をファイル名として保存することとします。一覧表は無制限に累積していく訳にはいかないので、フォルダ(年度のサブフォルダを作成する)とともに年度に分けて管理します。
  • テキストファイルの内容は、レコード毎に左端の決まった桁数を「データ項目管理コード」とし、その右からが実際の項目内容とします。
    この「データ項目管理コード」はデータベースのテーブル上の項目フィールドにあたります。どのコードが詳細登録画面や一覧表のどの項目に対応するかは設定情報として隠しシートに保持させておきます。また、「データ項目管理コード」の実際の値は単純な連番ではなく、桁別コードを使用して、さらに間を空けて登録しておきます。間を空けるのは将来の項目追加への対応です。
  • 一覧表のシートには、表示内容の他に隠し列を用意しておき、ここにファイル名の管理番号と、データファイルのタイムスタンプを登録しておくようにします。
    運用ワークブックを開いた時には、その年度のサブフォルダ内の各データファイルのタイムスタンプと一覧表上に記録されているタイムスタンプを行ごとに比較して違いがあればデータファイルを読み込んで一覧表を更新します。違いがなければ現状の一覧表の行内容は最新なのでファイルの読み込みは行ないません。
    但し、年度当たり1000件を超えるような件数になる場合は、全部のデータファイルのタイムスタンプをネットワーク経由で調べるだけで時間を要してしまうので、管理番号とタイムスタンプだけを書き込んだタイムスタンプファイルを別途用意します。ここにはデータファイルの登録時にそのタイムスタンプをBinaryモードで更新するようにしておきます。
    運用ワークブックの立ち上げでは、このタイムスタンプファイルを先頭から順読みして一覧表のタイムスタンプと比較するように処理すれば非常に高速に処理できます。
  • 一覧表のシートには、「Worksheet_SelectionChange」イベント処理で選択された行について詳細内容登録のシートにデータファイル内容を読み込んで表示させるようにします。
    詳細内容登録のシートからのデータファイルへの登録は、ツールバーやシートに貼り付けたボタンで行ないます。
  • 実際には、次項で説明する「アドイン化」と併用してこの機能を作り込んでいます。
    アドインを共有サーバに1つだけ置く。
    「一覧表と詳細内容登録のシートを用意したワークブック」はそれぞれの部署に配布してしまいますが、主要なプログラム部分は「アドイン」に収容させます。
    「アドイン」自身はデータファイル同様に共通フォルダに1つだけ置いておきます。どこのワークブックからも立ち上げ時にはこの共通フォルダの「アドイン」を読み取り専用で呼び出して、「アドイン」が主な動作機能を提供する構造です。
    このため、主要プログラムに変更が発生しても、この共通フォルダの「アドイン」に新しいバージョンを上書きコピーさせるだけで変更が完了します。バージョン管理が非常に簡単になる利点があります。
    「アドイン」が共通ファイルサーバに置いてあるからと言って、サーバ側で動作するわけではありません。
    あくまで、一元的にメンテナンスできるように、置き場所を一カ所に集約させているのです。

データベースサーバの利用
データファイルの問題は、 上記の制限がなければ、データベースサーバの利用も良いでしょう。ただ、接続するのが少人数(4〜5クライアントまで)なら、MDBでも良いかも知れません。MDBはご存じのAccessのデータベースエンジンですが、Accessがない環境でもDAOADOで動作します。10クライアント位までならMSDEを使う方法もあります。
プログラムの作成は、細かいテキストファイルを扱うよりむしろ簡単ですが、クライアントの接続数が多くなると、費用が掛かるデータベースエンジンが必要になります。

先ほど説明した、データベースを使う考え方でも、データの置き方が異なるだけです。
MDBファイルを共有ファイルサーバに保持させる。

ここまでの説明はいわゆる「クライアント・サーバ」型の処理形態で、データだけをサーバに置いて、処理は各クライアントで行ないます。パソコンのCPUが能力が低かったため、メインフレームでの処理のような中央集約型の処理ではなく負荷分散ができたわけです。
ですが、プログラムの登録やデータベースクライアントのインストールなどの手間と費用がクライアント数分掛かってしまうなどの問題があります。また、最近のサーバ機は能力が非常に高くなってきていて、この意味での分散の要件は希薄になりました。
Excelを利用するメリットは、やろうと思えば正規の開発言語で構築するようなことがほぼ同様にできてしまうことと、開発上では参照・更新用画面と印刷イメージを1つにして一片に作成してしまうことができることもあります。

Webアプリケーションの利用
さて、ここまでは、「何が何でもExcelで」というような感覚になってきていますが、この位までVBAを使いこなせるレベルにある方で「配布」に関して問題と思っている方にはWebアプリケーション」はどうでしょう。
いささか、主体がExcelから離れてはしまいますが、一覧表や定型書式の印刷ツールとしてExcelは活躍する方法です。
Webアプリケーションでは、クライアントはIEなどのWebブラウザを通して参照・更新を行なうため、クライアント自身には特定なアプリケーションやドライバをインストールすることがありません。(ここで説明する方法ではExcelは必要ですが。)
サーバ側は、WindowsサーバでIISを動かすことができれば環境としては動作可能となります。開発やテスト、少人数での利用であれば通常のPCでも同時接続数に制限があるものの利用可能です。
動作イメージは、
WebアプリケーションでのExcel連携
このような感じになります。これは特に印刷などを行なうExcelが絡んだ図になっていますが、単なる画面表示ではExcelは必要ありません。ですがブラウザを利用するアプリケーションは印刷書式を保持できないので、印刷やデータダウンロードにはExcelを利用すると良いのです。

但し、2006年くらいまではこんなお勧めをしていましたが、ネットワークセキュリティの強化と「ClickOnce」の出現で考え方が変わりました。
Webアプリケーションでは以下の問題があります。
InternetExplorerしか動作ブラウザがない
InternetExplorerであってもセキュリティレベルなどの設定変更が必要となる
・開発にはHTMLJavaScriptVBScriptの知識が必要
・アプリケーションレベルの処理が全てWebサーバ側の負荷になるので処理内容によっては動作レスポンスが悪くなる
・何よりも「動かして成否を見る」しかテスト方法がない(VBのステップ実行やブレークポイント設定などは行なえない)

この点、次項の「ClickOnce」ならVisualBasic.NETではあるものの、ローカルで動作検証したアプリケーションを Webサーバからのインスト−ルとした仕組みを構築できます。

ClickOnce」によるアプリケーションの配布
これも「Excel」から離れてはしまいますが、Webアプリケーションとは違って開発上は「HTML」や「JavaScript」などは出てこない「Visual Basic」の知識レベルだけで進められる方法を紹介します。 ここで使用する「Visual Basic」は「Visual Basic 2005」以降となり、「Visual Basic 6.0」や「ExcelVBA」とは記述形式が若干異なりますが、同じスキルレベルで進められるものです。
この「配布の問題」を作成した当初はExcelの域を出ず、アドインをネットワーク上の集約された場所に配置してバージョンの複合を避けようという提言だったのですが、 「ClickOnce」は発想が全く異なります。 もちろん、Excelの域から出てしまいますが、VBAと同様にローカル環境で開発・テストができるプログラムを社内のWebサイトからインストールするもので、 さらに、初回のインストールに止まらず、新しいバージョンが配置されると自動でアップデートが行なわれるというものです。
「ClickOnce」のインストール画面
(この画像をクリックすると、「ClickOnce」の内容の説明ページにジャンプできます。)
ClickOnce」が特質なのは、「Visual Studio」の開発環境から「発行」という処理でこのようなWebページのインストール画面まで含んだインストール環境を一括で作成してくれることです。 作成されたフォルダ環境をそのまま社内のWebサーバの指定パスに配置させるだけで、後は利用者がそのページを開いて「インストール」をクリックすることで必須コンポーネントを含めてインストールさせることができます。
ここで扱うプログラムは、元々クライアント側で開発して動作を確認したもので、このプログラムのインストールを社内Webサーバから行なうという仕組みです。 プログラムの開発・テストがWebアプリケーションとは違ってローカルPCだけで完結できるので簡単だということも特徴です。

さらに「配布の問題」で「ClickOnce」を取り上げるのは、これが「当初のインストール」に止まらないからです。
一旦、利用者がインストールを行なった後でアプリケーションの変更が発生した場合、バージョンの値を変更して再度「発行」を行なって当初のWebサーバの指定パスにそのまま上書きさせます。 この後、利用者が既にインストール済みになっているアプリケーションを起動すると、
「アプリケーションの起動中」の表示
このような立ち上げ中の表示の最中に新しいバージョンがあるのかの確認が行なわれて、更新インストールが行なわれるようになっています。
Windows10の1903以降では以下の画面に換わりました。
「アプリケーションの起動中」の表示

利用者がワンボタンでインストールしたり、直接ブラウザから実行したりできることはこれだけの説明でも判ると思いますが、 アプリケーションの開発担当の側でもこのような環境を「発行」のボタン1つで生成してしまうことができるのです。
Visual Basic「配布の問題」を解決する「ClickOnceにさらに詳しい説明を用意しています。