【ExcelVBA】入力されたくないセルに値が入力されても自動で元の値に戻すには

Excelのファイルで、入力されたくないセルに値を入力され勝手に書き換えられて困ったケースはありませんか?

例えば次のようなケースです。

  • 入力する必要のないセルに値を勝手に入力されてしまう
  • 集計結果を表示する計算式が入ったセルを勝手に書き換えられて、こちらが想定していない値に書き換えられてしまう

特に、計算式をセルに設定している場合に、想定外の値が勝手に入力されると、ファイルによっては業務に支障をきたすことがあるかと思います。

そこで、本記事では入力されたくないセルに値を入力されても、自動で元の値に戻すようマクロで制御する方法についてご説明します。

【動画】自動で元の値に戻すよう制御するイメージ

自動で元の値に戻すよう制御するイメージは次のツイートをご覧ください。

ツイート内の動画では、入力されたくないセルに値が入力されても、マクロが自動で元の値に戻しています。(値を書き換えたら警告メッセージを出力)

制御する処理の流れ

制御する処理の流れは次の通りです。

STEP.1
選択されたセルの値または計算式を取得する
セルの値が書き換えられる前のセルの値または計算式を退避しておくため、選択されたセルの値または計算式を取得します。
STEP.2
もしセルの値が変更されたら、退避したセルの値または計算式を再度セルに設定し直す
もしセルの値が変更されたら、STEP1で退避しておいたセルの値または計算式を再度セルに設定し直します
STEP.3
必要に応じて警告メッセージを出力する
必要に応じて、入力しないよう警告する・入力前に戻す旨のメッセージを表示させます

STEP.1:選択されたセルの値または計算式を取得する

選択されたセルの値または計算式を取得する場合、その処理をWorksheet_SelectionChangeイベント内で行います。

Worksheet_SelectionChangeイベント

Worksheet_SelectionChangeイベント

Worksheet_SelectionChangeイベントは、セルが選択されたタイミングで呼び出されます。

選択されたセルの値または計算式を取得するタイミングは、セルが選択されたときがベストです。

Worksheet_SelectionChange以外のイベントでは、すでにセルの値または計算式が書き換わってから呼び出されるので、タイミング的には遅いです。

なので、Worksheet_SelectionChangeイベントを使います。

次に、取得した選択されたセルの値または計算式をパブリック変数に保管します。

パブリック変数を使用する理由は、Worksheet_SelectionChangeイベントが終了した後でも選択されたセルの値または計算式を参照したいからです。

ローカル変数だとWorksheet_SelectionChangeイベントが終了した後では選択されたセルの値または計算式が参照できなくなってしまいます。

選択されたセルの値または計算式を取得する処理は以上になります。

STEP.2:もしセルの値が変更されたら、退避したセルの値または計算式を再度セルに設定し直す

もしセルの値が変更されたら、退避したセルの値または計算式を再度セルに設定し直します。

STEP1で取得した「選択されたセルの値または計算式」と「現在のセルの値」を比較し、相違があった場合は「選択されたセルの値または計算式」をセルに設定します。

相違がなければ何もしません。

なお、本処理(STEP2)はWorksheet_Changeイベントで行います。

Worksheet_Changeイベント

Worksheet_Changeイベントは、「セルが編集状態→編集状態から抜ける」タイミングで呼び出されます。

なので、セルの値を確認するにはWorksheet_Changeイベント内で行うのがベストです。

STEP.3:必要に応じてメッセージを出力する

必要に応じてmsgbox関数を使ってメッセージを出力します。

msgbox関数のコード

注意喚起したい場合は伝えたいメッセージを表示させましょう。

出力されたメッセージ

最後に

入力されたくないセルに値を入力されても、自動で元の値に戻すようマクロで制御する方法についてご説明しました。

本処理は、勝手にセルに値が入力されても、マクロで値を書き換える前の状態に戻すだけです。

入力前の値を保持しておく、セルに値が入力されたら保持しておいた値を再度設定する、という2STEPでとてもシンプルなことをしているだけなので非常に簡単だと分かって頂けるかと思います。

補足として、注意喚起のメッセージを出すのもよいですね。

このセルは勝手に書き換えてはいけないんだ、と伝わればwin-winだと思います。

以上、参考に頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら