データベース設計(Access)

Accessをマルチユーザーで安全運用する完全ガイド【2025年版】

スポンサードリンク

この記事はプロモーションを含みます

この記事で学習できること
  • Accessをマルチユーザーで使用するために必要な設定が分かる
  • データベースの分割とトランザクションへの理解が深まる

今回は、Accessをマルチユーザー(複数人数)で運用するために必要な設定・テクニックについて書いてみました。

Accessはスタンドアロン環境でしか使えない」といったことがよく言われますが、設定をしっかりと行えば複数人数での同時編集運用も可能です。

  • Accessの機能に限界を感じているが、何とか延命して使い続けていきたい
  • Accessシステムの機能拡張のために外注を検討している
  • Excelで運用しているシステムをAccessに乗せ換えたい

このような方は、まずは本記事の内容をご覧ください。
今使っているAccessシステムを、さらに長く、より効果的に使うためのヒントが見つかるかもしれません。

スポンサードリンク

Accessを複数人で共有するリスクを解決する

Access でファイル破損が起こる最大の理由は、同じレコードを同時に編集してしまうことです。

別々のレコードを編集している間は干渉が起きませんが、同じレコードを 2 人以上が同時に更新すると、Access はどちらの変更を採用すべきか判断できずエラーやファイル破損を招きます。

同時編集のリスク

さらに、デフォルトで作成されるAccessの連結フォームはテーブルとリアルタイムで接続されているため、ユーザー同士が同じデータに触れている状態が発生しやすい――これが “Access は壊れやすい” と言われる所以です。

このリスクを根本的に減らす対策は 2 つです。

  1. データベース分割 – フロントエンド (フォーム・レポート) とバックエンド (テーブル) を分離し、同時編集できる共有環境を構築
  2. トランザクション処理 – BeginTrans / CommitTrans で書き込み時間を最短化し、競合が起きる “隙” をなくす
同時編集リスクの回避策

これらを適正に実装すれば、複数ユーザーでも壊れないAccessに進化できます。

実際に、勤務先で同じ構成のAccessツールを導入したところ、10人程度の同時編集環境であるにも関わらず、問題なく作動しました。
ツールを実装した時期からもうすぐ1年が経とうとしていますが、今のところデータ競合に関する不具合は発生していません

次章では具体的な手順を詳しく見ていきましょう。

スポンサードリンク

設定1-データベースを分割する

Accessの初期設定では、テーブルやフォームなど、全てのオブジェクトが一つのAccessファイルに格納されます。
スタンドアロン環境であれば初期設定でも問題ないのですが、複数人数での運用はさまざまなエラーや障害が頻繁に発生してしまうのです。
まず、フォームとテーブルが常にリンクしているので、データの不整合が起こしやすいです。

Accessを分割せずに運用

また、全てのAccessをひとつにまとめておくとメンテナンスがしづらいということも大きなデメリットです。
誰かがAccessを操作しているときはメンテナンスを行えないので、誰も使っていないときまで待つしかありません。

まずはデータベースを分割し、Accessファイルを複数人数で同時につなげられる環境を作りましょう

  • テーブルのみのAccessファイル→バックエンド側
  • フォームやクエリなど他のオブジェクト→フロントエンド側

Accessを分割すれば、フロントエンド用のAccessファイルを増やすことができます。
フロントエンド用のAccessファイルを増やせるということは、同時編集が可能なユーザー数も好きなだけ増やせるということです。
データベースを分割することは、安全にマルチユーザー仕様に拡張するための必須事項です。

Accessを分割して運用

Accessデータベースの処理はそんなに難しくありません。
これから解説する手順に沿って操作すれば、スッと完了できているはずです。

分割手順1-Accessファイルをコピー

Accessデータベースの分割は、データベースタグのデータの移動メニューから実行すればとてもかんたんです。

データの移動メニュー

しかし、複数のデータベースからテーブルをリンクしたい場合は、手動での操作が必要ですので、まずはそちらから習得しましょう。

Excelファイルなどと同じような感じでAccessファイルをコピーします。

Accessをそのままコピー

それぞれ分かる名前に変更しておきましょう。
ここでは「Back」と「Front」と追記し、判別しやすいファイル名にしました。

名前を変更

分割手順2-バックエンドデータベースを作成

バックエンド側のAccessは、テーブル以外の全てを削除しておきましょう。

バックエンド側の構成

分割手順3-フロントエンドとバックエンドを連結させる

一方、フロントエンド側はバックエンド側のテーブルをリンクします。
これからテーブルをリンクさせる方法について解説します。

外部データ」タブの「新しいデータソース」を選びます。

新しいデータソースを選択

次に、「データベースから」の「Access」をクリックします。

Accessを選択

リンクしたいバックエンドデータベースを選択します。
データの保存方法は「リンクテーブルを作成して・・・」を選択しましょう。

インポート元を選択

テーブルは全て選択です。

テーブルのリンク

取込作業が終わると、リンクテーブルが作成されているのが分かります。
リンクテーブルは、通常のテーブルとはアイコンが違うのが大事なポイントです。

リンクテーブル

全てのリンクテーブル名を修正しましょう。
末字の「1」を消去するだけです。

テーブル名を変更

これでリンクテーブルへの差し替えが完了しました。

リンクテーブルにさしかえられた

リンク元は絶対パスで設定されます。
バックエンドファイルを別の場所に移動させるとリンクが切れて下のようなエラーが表示されます。

リンクテーブルエラー

よほどの理由がない限りは動かさないようにしましょう。

クエリやフォームを含んでいるフロントエンドファイルは、複製させたり移動させても大丈夫です。

バックエンドファイルを別のフォルダーに動かした場合は、後でリンクテーブルマネージャーで再設定してあげましょう。
リンクテーブルマネージャーは、テーブルアイコンを右クリックすると表示されます。

リンクテーブルマネージャーのアイコン

対象のテーブルにチェックを入れ、再リンク移動先のバックエンドデータベースを指定すれば設定完了。

リンクテーブルマネージャーの設定画面

また、定期的なバックアップの仕掛けを作っておくと、バックエンドファイルが壊れる不安を抱えずに運用できます。

スポンサードリンク

設定2-トランザクション処理を行う

トランザクション処理を使えば、テーブルへの接続時間を最短にすることができます。
分かりやすく言い換えると、「瞬間的に接続し、瞬間的に遮断する」という表現でしょうか。

トランザクション自体が聴き慣れない言葉ですよね?
トランザクションはさまざまなシステムで使われています。
ここで、Accessのトランザクションの流れについて簡単に触れておきます。

トランザクションでどのようにデータが処理されるのか?

トランザクションを一言で言い換えると、複数のクエリを予約しまとめて実行する機能です。

トランザクションとは

ここでクエリと表現しているものは、SELECT文以外の更新・追加・削除が予約できるクエリ文のことです。
予約の段階ではデータは変更されておらず、「Commit」を実行することで一気に新しいデータが書き込まれます。
何らかの不具合が発生して更新できない場合は、「RollBack」によりデータが予約前に戻されます。

トランザクションのCommitはVBAのコード文一行で実行されますので、テーブルに触れる時間は一瞬です。
文章だけでは動きが分かりづらいと思いますので、念のためにサンプルデータベースを添付しておきます。

サンプルデータベース:Trans_Test.Accdb

サンプルデータベースを開くと、テーブル「社員マスタ」と標準モジュール「Trans」があるだけです。
更に、「社員マスタ」には1件も入っていません。

データが0件

標準モジュールには、「Tran_Sample」と「Delete_Data」の2つのプロシージャがあります。

トランザクションのコード

サンプルデータベースにも含まれていますが、念のため下にVBAコードを掲載しておきますね。

Sub Tran_Sample()

Dim daoWs As DAO.Workspace
Set daoWs = DBEngine(0)
Dim DB_rcd As DAO.Database

Set DB_rcd = CurrentDb()
    
    On Error GoTo ErrorHandler
    daoWs.BeginTrans 'トランザクション開始
        'SQL文で複数の動作を予約
        DB_rcd.Execute "INSERT INTO 社員マスタ (No, 名前) VALUES (1,'山田 太郎');"
        DB_rcd.Execute "INSERT INTO 社員マスタ (No, 名前) VALUES (2,佐藤 花子);"
        
    daoWs.CommitTrans   'コミット
    
    MsgBox ("トランザクション処理の完了。")
    Stop
    GoTo Finally '正常に終了したら接続解除へジャンプ
    
ErrorHandler: 'エラー処理
    daoWs.Rollback '元の状態へ戻す(ロールバック)
    Stop
    MsgBox ("Error #: " & Err.Number & vbNewLine & vbNewLine & Err.Description) 'エラーの場合はエラーメッセージが入る
Finally: '接続解除
    If Not daoWs Is Nothing Then 'トランザクション用のオブジェクトを破棄
        daoWs.Close
        Set daoWs = Nothing
    End If
End Sub

Sub Delete_Data()
    DoCmd.SetWarnings False
        DoCmd.RunSQL ("DELETE * FROM 社員マスタ;")
        MsgBox ("データを削除しました。")
    DoCmd.SetWarnings True
End Sub

では、トランザクションの動作を理解するためにも、ステップイン実行でコードの動きを確認してみましょう。

トランザクション開始直後にはINSERT文が設定されています。INSERT文は新しいデータを追加するデータベース言語(SQL)です。
また、INSERT文の実行直後のコミットを実行するコードに、ブレークポイントを設定します。

INSERT文とブレークポイント

コードを実行すると、ブレークポイントで処理が停止します。
ここはCommitを実行する直前です。

ブレークポイントで処理を停止

テーブルを確認してみると、確かにデータ件数が0のままです。

0件のまま

F8キーを押して、Commitを実行してみます。

F8でステップイン

ここでようやく2件のデータが挿入されました。
つまり、INSERT文が実行されたということです。

2件のデータが挿入

いったん、プロシージャ「Delete_Data」を実行し、テーブルをリセットします。

今度は、INSERT文がエラーを起こすように変更してみましょう。
具体的には、文字列を挿入する時に必要な「'」を消去します。

わざとエラーを起こす

コミットではなくRollBackが実行されました。

テーブルデータを確認したところ、テーブルのデータ件数は0件でした。
ロールバックでデータ挿入が中止されたためです。

仮にトランザクションが設定されていないと、途中までデータが挿入されたところで止まってしまいます。
完全にスタンドアローンで運用していれば手動での復旧も可能ですが、複数人数で同時接続している場合、おそらく完全なデータ復旧は不可能です。

以上のように複数人数でAccessを運用する場合、トランザクション実装はデータの整合性を担保できる安全な施策だと言えます。


サンプルデータベースのプログラムコードは、今村ゆうこさんの「Access VBA 実践マスターガイド」を参考にさせていただきました。
本記事で使っているコードよりも、更に実用に沿ったトランザクションのサンプルコードが載っているのでオススメです。

created by Rinker
技術評論社
¥2,838 (2025/05/17 22:18:51時点 Amazon調べ-詳細)

トランザクションを何かに例えてみる

ここで、トランザクションを宅配の方法に例えてみましょう。

トランザクションを設定していないのは、自転車で届け先に人力で一つ一つ配達しているようなものです。
一方、自動運転の配達がトランザクションが設定されているという状態に近いでしょうか?
配達前に全ての届け先リストと順番を登録しておけば、自動運転ボタンを押すだけで順番に届け先へ配達されます。

トランザクションの有無

自動運転ボタンを押す前であればキャンセル(RollBack)が可能です。

他にも、トランザクションをマンションのオートロックに例えたりすることもあります。

一レコードだけの処理は非連結フォームを活用

Accessフォームで、単票形式というものがありますよね?
単票形式にトランザクションを実装するときは「非連結フォーム」にしておくのが原則です。
「非連結」とは、バックエンド側にあるAccessテーブルには接続されていない状態にしておくということです。

1レコードのトランザクション処理

トランザクションを起動させるのは更新ボタンを押した瞬間です。
「連結フォーム」は常にテーブルと連結しているので、更新ボタンを押す前にテーブルのデータが書き換えられてしまいます。
正常にトランザクションを作動させるためにも、単票フォームは「非連結フォーム」を使用しましょう。

複数レコードの処理はワークテーブルを活用

業務の中では、複数レコードをまとめて編集したいこともありますよね。
そんな時は、フロンドエンド(ユーザー)側のAccessファイルに編集用のワークテーブルを設置しましょう。

非連結フォームでは編集したデータが更新前に消えてしまうので、ユーザー側で仮データを保存しておくというイメージです。
フォームとワークテーブルは、「連結フォーム」でリンクされています。
表示ボタンが押されると、原本からコピーされたデータを取得します。
データの編集が済み、更新ボタンを押すことでワークテーブルから本テーブルへデータが一括で貼り付けられます。

複数レコードのトランザクション処理

本テーブルからワークテーブルなどからデータを取得する場合は、コンボボックスなどで前もって条件を絞っておくことでより安全にデータを管理できます。
編集されたレコードにチェックが入るようにしておけば、更新レコード数を更に減らせます

スポンサードリンク

Accessの複数人数の運用でつまずきやすいポイント(Q & A)

Access を複数ユーザーで運用するとき、実際に現場でよくぶつかる疑問やトラブルは意外と共通しています。
下記の Q&A では、そんな“あるある”をピンポイントで解決するヒントをまとめました。

Access を同時に使える最大人数は?

厳密な上限はありませんが、LAN 上の共有ファイルの場合は 10〜20 人程度が実用的な目安です。
30 人を超えるとロック競合やパフォーマンスの低下が顕著になるため、SQL Server などへの移行を検討してください。

「ほかのユーザーが変更しています」エラーが頻発する理由は?

同じテーブルの同じレコードを複数人が同時編集している可能性が高いです。
データベースをフロント/バックエンドに分割し、VBA のトランザクション処理で書き込み時間を最小化すると発生頻度を大幅に減らせます。

トランザクション処理はどんなシーンで必要?

1 件の更新が複数テーブルにまたがる場合や、一連の書き込みを “一括確定” したいときに使います。
BeginTrans → データ操作 → CommitTrans / RollbackTrans を挟むことで、途中失敗時に安全に巻き戻せます(RollBack)。

OneDrive や SharePoint で共有しても大丈夫?

同期クライアントがファイルをロックできず “競合コピー” が量産されるリスクがあります。
クラウド共有なら SharePoint リスト 化や SQL Server on Azure への移行が安全です。
クラウドストレージ上への .accdb 直置きは避けましょう。

まとめ

今回は、Accessを同時編集するために必要な設定について解説しました。
データベースの作り方を少し見直すだけで、今までより丈夫なAccessに改造することができます。

  • Accessをどうやって拡張しようか悩んでいる方
  • Accessでシステムを作ることに不安を抱えている方

以上の項目に当てはまる方は、本記事の内容を参考にしながら今後の方針を立てていただければと思います。


最後に、ブログではAcccessやExcelの機能について、いろんな記事を投稿しています。
よかったらトップページから希望の機能を探してみてください。

また、Accessデータベース設計のまとめ記事もありますので、そちらもごらんください。
≫ Access初学者必見!データベース設計ガイド

スポンサードリンク

スポンサードリンク

-データベース設計(Access)