[[20180121094537]] 『セルの値を(空から空へ)変更した際のエラー回避策』(D.S.) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルの値を(空から空へ)変更した際のエラー回避策について』(D.S.)

Worksheet_Changeイベントにて、
セルの値を変更した際、変更前の値beforeと変更後の値afterに
値を格納し、成功したらメッセージボックスで"変更前後のセルの値を取得しました"と
出力するプログラムを書いています。

空のセルに適当な値を入力してEnterで決定したり
適当な値が入ったセルを選択後、この値を変更しないままEnterを押下したりした場合、
この処理は成功するのですが、
空のセルを選択(ダブルクリック)後、空欄のままEnterを押したり、
空のセル上でDeleteを押したりすると

実行時エラー'1004';
'Undo'メソッドは失敗しました:'_Application'オブジェクト

といったエラーメッセージが出て、処理に失敗してしまいます。

空のセルを選択(ダブルクリック)後、空欄のままEnterを押したり、
空のセル上でDeleteを押したりした場合の回避策がわからないので、
教えて頂きたいです。

よろしくお願い致します。


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    ' セルの変更前と変更後の値を取得
    Dim before As Variant
    Dim after As Variant

    after = Target.Value
    Application.EnableEvents = False
    Application.Undo
    before = Target.Value
    Application.EnableEvents = True

    MsgBox "変更前後のセルの値を取得しました"
End Sub

< 使用 Excel:Excel2007、使用 OS:Windows10 >


>空のセルを選択(ダブルクリック)後、空欄のままEnterを押したり、
>空のセル上でDeleteを押したり

試してみたのですが、エラーにならないのですが?

(マナ) 2018/01/21(日) 13:07


マナ様

ご回答ありがとうございます。

私の方で、再度
新規ファイル(.xlsm)を作り、
VBEのSheet1にソースコードをコピペして
Sheet1の任意のセル上で再試行してみましたが、
やはり同様のエラーが発生します。
Windows7とエクセル2013の組み合わせでも同様のエラーが発生します。

マナ様の開発手順、あるいは開発環境と何か異なる点はありますか?
(D.S.) 2018/01/21(日) 14:12


 私も試してみましたがエラーは出ませんでした。
 ちなみに環境はWindows8.1、Excel2016です。
(bi) 2018/01/21(日) 14:23

確かに最初の1回だけそうなりますね。

undoできないときはredoが実行される
redoもできないときは、エラーということでしょうか?

(マナ) 2018/01/21(日) 14:36


↑ごめんなさい。redoなんてメソッドはありませんが、言いたいことはわかりますよね。

(マナ) 2018/01/21(日) 14:39


 ああ、最初にその操作をするとエラーが出るということでしたか。
 あまりいい方法ではないかもしれませんが

 Option Explicit

 Private Sub Worksheet_Change(ByVal Target As Range)

     ' セルの変更前と変更後の値を取得
     Dim before As Variant
     Dim after As Variant

     after = Target.Value
     Application.EnableEvents = False
     On Error GoTo myError
     Application.Undo
     before = Target.Value
     Application.EnableEvents = True

     MsgBox "変更前後のセルの値を取得しました"
 myError:
     MsgBox "エラー回避"

 End Sub
(bi) 2018/01/21(日) 14:48

横から失礼。
原因は、Undoすべきアクションが無いから。
changeの動作条件と、一回の処理と見なすかどうかの条件が微妙に違うことが要因。
 
ところで、そもそもですが、そのコードは何を意図した物ですか?
Undoしっぱなしだと、
before,afterで吸い上げたとしてもユーザーは何を入力したかすら確認できません。
部分を提示しているのだろうが、例として適切なものとは言えない気がします。
 
なお、別の質問掲示板にもマルチポストしています。
明示的に禁止はされていませんが、無駄なことです。
それに、もしマルチするなら、その旨を書くのが礼儀かと思います。
あちらは削除したほうがよいのでは?

(bi)さん、それだとApplication.EnableEvents = Falseのままですよ。
それと途中にExit Subが必要です。

(γ) 2018/01/21(日) 14:57


 γさん、指摘ありがとうございます。失礼しました。
(bi) 2018/01/21(日) 15:14

マナ様 bi様 γ様
ご回答ありがとうございます。
(D.S.) 2018/01/21(日) 16:00

γ様

至らない所ばかりで申し訳ありません。

さて、コードの意図ですが、
現在、あるソフトを作成しています。

入力が必須のセルと入力されたくないセルがあり、

入力が必須のセルについては、afterの値を設定します。
入力されたくないセルについて、
何か入力があった時(つまり、Targetが変更され、beforeが空のとき)、
"このセルへの入力はできません"と出力し、
Targetの値をbeforeに設定し直したいと考えていました。

その動作の一部を提示していたわけです。

また、掲示板にて質問するのが初めてであったこともあり、
マルチポストに関する礼儀等わからなかったもので、
無礼をお許しください。
もう一つの質問は削除致します。

Undoすべきアクションがないことが原因なのですね。
解決策がわからないのですが、教えて頂けますか。
(D.S.) 2018/01/21(日) 16:01


マルチの件、了解。
入力の抑止については、保護機能の利用も
あるでしょう。
コードの改善策は、biさんが書いてくださっています。
エラー処理が適当と思います。

(γ) 2018/01/21(日) 16:32


γ様

ご回答ありがとうございました。

また、不明点などあれば質問します。
(D.S.) 2018/01/21(日) 16:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.