Accessエラー2950の原因と対処|マクロ実行が失敗するとき
エラー2950「アクションが失敗しました」はAccess 2007以降のマクロで発生。KB931407記載のRunCode+信頼設定の問題から、RunCommand(SaveRecord)のバリデーション違反まで、シングルステップを使った3段階の切り分け手順を解説します。
結論:どのアクションで止まっているかを先に特定する
エラー2950は「アクションが失敗しました」と表示され、詳細に「エラー番号: 2950」が示されるマクロのエラーです。Microsoftの公式ドキュメント(KB931407)では、VBA関数を呼び出すRunCodeアクション実行時の2950について「データベースが Access によって信頼されていない(無効モード)場合に発生する」と説明しています(Access データベースでマクロを実行できない — Microsoft Learn)。
ただし、エラー2950はRunCode以外のアクションでも表示されることがあります。Microsoft Q&AにはRunCommand(SaveRecordコマンド)がバリデーション違反によって失敗した事例も報告されています。どのアクションで止まっているかをシングルステップで確認してから、原因に応じた対処を選ぶのが確実です。
エラー2950が起きる主な場面
公式文書とMicrosoft Q&Aで確認できているケースをまとめます。
| 場面 | 典型的な状況 | 最初の確認ポイント |
|---|---|---|
| RunCodeアクションでVBA関数を呼んでいる(公式文書・KB931407) | メッセージバーに「セキュリティの警告」が出ている。データベースをサーバーや別フォルダから開いたとき | データベースが信頼できる場所にあるかを確認する |
| RunCommandアクション(SaveRecordコマンド)が失敗している(Microsoft Q&A事例) | フォームにバリデーション規則が設定されており、条件を満たさない状態で保存しようとしている | シングルステップモードで止まっているアクションと引数を確認する |
このほか、RunCodeで止まっているがデータベースは信頼済みというケースでは、呼んでいるFunction関数の仕様上の問題(後述)が原因のこともありますが、各要件違反がエラー2950になるとは公式に規定されていないため、下の手順で切り分けてください。
原因ごとの対処
RunCode+信頼されていないデータベースの場合
KB931407が説明する最も代表的なケースです。ファイルを「信頼できる場所」として登録されたフォルダに置くと、Accessはそのファイルを毎回信頼した状態で開くようになります。設定の詳細はAccessのセキュリティ警告とマクロ有効化で解説していますが、手順の概要は次のとおりです。
- Access の「ファイル」→「オプション」を開く
- 「セキュリティ センター」→「セキュリティ センターの設定」をクリック
- 「信頼できる場所」→「新しい場所の追加」でローカルフォルダのパスを指定する
- ファイルをそのフォルダに移動して開き直す
信頼できる場所への登録はKB931407でも案内されている公式の解決方法の一つですが、信頼できる入手元のデータベースに限り、組織のセキュリティ方針を確認したうえで使用してください。Microsoftはフォルダの適切な保護と可能な範囲でのポリシーによる集中管理を推奨しており、ネットワーク上のパスの登録は原則として非推奨としています。
「コンテンツの有効化」ボタンをクリックした場合、ファイルが「信頼済みドキュメント」として記録されることがあり、次回以降も警告なく開けるケースがあります。ただしネットワーク上のファイルや組織のポリシーによっては毎回クリックが必要になることがあります。
シングルステップで止まっているアクションを特定する
信頼設定が問題でない場合、あるいはRunCode以外のアクションで止まっている場合は、シングルステップモードで実行するとどのアクションでエラーが出ているかを特定できます。
マクロをデザインビューで開き、「デザイン」リボンの「シングルステップ」ボタンをオンにしてから実行します。ステップが進むたびにダイアログが表示されるので、どのアクションとどの引数でエラー2950が出たかを確認してください。
Microsoft Q&Aでは、RunCommandアクションのSaveRecordコマンド(引数97)がフォームのバリデーション規則によって失敗し、エラー2950が発生した事例が報告されています(Macro Single Step Error 2950 — Microsoft Q&A)。この場合、信頼設定ではなく入力チェックのロジックを見直す必要があります。
RunCodeで呼ぶFunction関数を確認する
Microsoftの公式ドキュメントによると、RunCodeアクションが呼べるのはVBAのFunctionプロシージャのみです(Subは直接呼べません)。また関数名のあとに括弧が必要で(引数なしでもTestFunc()と書く)、関数名とモジュール名が同じだと呼び出せません(RunCode macro action — Microsoft Learn)。
RunCodeで止まる場合の一般的な確認項目(これらの不備が必ず2950になるとは限りませんが、まず押さえておく点です):
- 呼んでいるのが
Functionプロシージャか(Subではないか) - 関数名のあとに括弧があるか(
関数名()の形式になっているか) - 関数が標準モジュールに定義されているか。フォーム/レポートのイベントからRunCodeを実行する場合は、そのフォーム/レポートのクラスモジュールも検索されますが、他のクラスモジュールは検索されません
- 関数名とモジュール名が同じになっていないか
切り分けには、確実に動く単純なFunction関数(例: Public Function TestRun() As Boolean : MsgBox "ok" : End Function)を作ってTestRun()をRunCodeに渡し、それで動くか確認するのが有効です。
VBAへの置き換えを検討するタイミング
AccessのUIマクロはドロップダウンで操作を組み合わせる仕組みで、エラー処理の記述に制約があります。マクロのアクションが複数あって、どこで止まっているかの特定が難しい、あるいはエラー時に別処理を走らせたいという場面では、VBAへの移行を検討する価値があります。
たとえばRunCodeで呼んでいるVBA関数の中に処理を集約し、フォームのイベント(On ClickやBefore Update)から直接VBAを呼ぶ構成にすると、マクロを経由しないぶん動作の見通しがよくなります。VBAのエラー処理についてはAccess VBAのエラー処理入門で整理しています。
UIマクロとVBAの使い分けについてはAccessのマクロとVBAの違いと使い分け入門も参考にしてください。
エラー2950の切り分けフロー
問題の種類によって対処が変わるので、以下の順で確認すると効率的です。
| 確認順 | 確認内容 | YESなら | NOなら |
|---|---|---|---|
| ① | Accessのメッセージバーに「セキュリティの警告」と「コンテンツの有効化」ボタンが表示されているか | 信頼設定が原因の可能性が高い。有効化して再現するか確認し、継続運用は信頼できる場所への登録を検討 | ②へ |
| ② | シングルステップモードで止まっているのはRunCodeアクションか | ③へ(RunCode仕様の確認) | 止まったアクションの引数・前提条件を調査(例: RunCommandならバリデーション設定を確認) |
| ③ | RunCodeで呼ぶ関数の仕様に不備があるか(Sub定義・括弧欠落・標準モジュールでも実行元フォーム/レポートのクラスモジュールでもないクラスモジュールにのみ定義・モジュール名と同名) | 不備を修正して再テスト | 関数内部のエラーを調査、またはVBA化を検討 |
Accessの構造的な問題(マクロの複雑化・VBA管理の手間など)が積み重なっている場合は、無料の解析可否チェックで現在のシステム状態の目安を確認できます(ファイル送信不要です)。
よくある質問
Q. エラー2950はAccess 2007以降のバージョンで同じ原因ですか。
Microsoftの公式ドキュメント(KB931407)には「Access 2007 以降のデータベース」に適用されると記載されており、Access 2016・2019・2021・Microsoft 365版でも同様の仕組みで発生します。ただし信頼センターのUIが微妙に異なる場合があるため、操作手順は使用中のバージョンで確認してください。
Q. ファイルをサーバーからローカルにコピーしたらエラーが出なくなりました。なぜですか。
管理者または利用者が事前に登録したローカルの信頼できる場所にコピー先が含まれる場合、エラーが解消します。ローカルフォルダが自動的にすべて信頼されるわけではありません。コピーで動くことが確認できたら、そのローカルフォルダを信頼できる場所として登録してあるかを確認してください。サーバー上で運用したい場合は、組織の管理者に信頼設定の適切な方法を確認することをお勧めします。
Q. マクロをすべてVBAに書き直せばエラー2950は出なくなりますか。
信頼設定が原因なら、VBAに書き直しても同じです。VBAも信頼されていないデータベースでは実行できません。ただし、RunCommandのバリデーション違反が原因の場合は、VBAに置き換えることでエラー処理を細かくコントロールできるようになります。エラーについてはエラーメッセージの早見表であるAccessエラーメッセージ早見表もあわせて参照してください。
Q. AutoExecマクロで起動時に2950エラーが出ます。信頼設定を確認しても直りません。
信頼設定以外の原因が疑われます。まずシングルステップモードでどのアクションで止まっているかを確認してください。RunCodeで呼んでいる関数に問題がある場合(SubをFunction化していない・括弧の欠落・定義場所・関数名とモジュール名の衝突など)、関数を修正してください。処理をフォームのOnLoadイベントに移してAutoExecからそのフォームを開く構成に変えると解消することもあります(当社の実務経験も含む)。
触れないAccessが「診断できるか」だけ、確かめませんか。
顧客データは送信不要。発注の義務もありません。
約2分・ファイル送信不要・発注義務なし/説明はオンライン・売り込みはしません