• ベストアンサー

確認/警告メッセージのトラップ(エクセルVBA)

複数の行、列からなるセル範囲に値設定しているとします。このセル範囲に対し、行もしくは、列単位でセルの結合を行うと、"選択範囲には複数のデータ値があります。1つのセルとして結合すると、選択したセル範囲にある最も左上端にあるデータのみが保持されます。・・・・”と表示され、”OK”、”キャンセル”ボタンが表示されます。この”OK”、”キャンセル”ボタンのトラップって出来ますか?(関数の戻り値のように) 別の言い方をすると、複数行、列に対して結合を行うと、一度”OK”ボタンを押しても、次の行列で結合を行おうとすると再びメッセージが表示されます。一度、”OK”を押すと次からメッセージが表示されない(トラップできれば、DisplayAlerts = Falseとできるのですが?)ように出来ますか?キャンセルが押された場合、エラー"実行時エラー1004"が発生しますが、明確にキャンセルボタンが押されたと判断する方法ってありますか? どなたか、詳しい方教えて頂けないでしょうか?宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.2

>VBA以外の力を借りると出来るのでしょうか? そのあたりは不勉強なので、ハッキリ自信を持ってお答えできないのと、 APIなどを利用すれば出来るのかなぁ? 程度の期待もあって、 出来ないような気がすると書きました。 詳しい方の回答を待ちましょう。 >同じモジュールでエラーNo1004が発生した場合に、ダイアログでキャンセルが押されたのか? >もしくは、それ以外の1004エラーなのかを識別する方法っあるのでしょうか? Err.Descriptionを調べてみては? 例えば Sub Test() On Error GoTo ErrorHandler ActiveSheet.Protect Range("A1:B4").MergeCells = True Cells(1, 1).Value = 1 Exit Sub ErrorHandler: MsgBox Err.Number & ":" & Err.Description Resume Next End Sub 上記のコードは2つのエラーが発生します。 どちらもErr.Numberは1004ですが、 Err.Descriptionは違っているので、 これで識別するっていうのはダメでしょうか? でも、コーディングする時に、ある程度 エラーの原因を予測しながら行うと思うので、 それで判断できると思います。 質問のように、ダイアログをキャンセルしたことによって発生するなら、 「Range クラスの MergeCells プロパティを設定できません。」 しかありえないと思いますが・・・。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 前から、ここの掲示は見ていて、ずっと気にはしていたのですが、レスつけるのか迷いがありました。 いつも、同じパターンの回答ですみませんが、私としては、究極的には、これは、その必要性があるのかどうか、というところに掛かってくるのではないか、と思いました。逆にいうと、私は、MergeCells で、Application側のエラーダイアログを待つというようなマクロは、作らないと思います。自分でエラーダイアログを作るか、エラー出さないようにしてコーディングします。 以前、同じようなご質問で解決済みにはなっていても、実際はご満足しておられなかったようですね。 今回の話は、ExcelのApplication内部に割り込んで、それを取得することですから、私などは、到底及ばないような遥か彼方のレベルの話のようです。だから、私などはお呼びではないのですが、エラーで出されるダイアログの戻り値は、プログラマー側で作らない限りは、Application側に取られてしまうと思いますから、キーを監視する以外は、私には取れるとは思えません。いつものように、レスがつけば、Win32 APIの"GetKeyboardState"あたりで解決することになるのかもしれませんが、私は、Excelの全体の設計から、そのようなコーディング・スタイルは疑問ですので、なんとも言えません。私の場合、テクニックを追いかけていくと、ある一定の時間や期間内に、完成できなくなってしまうから、あまり振り回されないようにしています。 外部的には、キャンセルキーを"EnableCancelKey" でトラップするようなことは、既にご存知かと思います。わたし的には、Application.DisplayAlerts をFalse にして処理すれば、問題は解決するように思うのですが……。 全体が、どのようなコーディングの内容になっているかにもよります。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

こんにちは。 >明確にキャンセルボタンが押されたと判断する方法ってありますか? エクセルの警告ダイアログの「OK」を押したか、 「キャンセル」を押したかを直接捕まえることは VBAだけでは、で出来ないような気がします。 が、質問の場合、セルの結合をキャンセルすることで、 発生するエラーをトラップすれば良いように思います。 >一度、”OK”を押すと次からメッセージが表示されないように出来ますか? モジュールレベルの変数を用意して 最初の「OK」でこの変数に「True」 をセットする。 セットした値をApplication.DisplayAlertsの 設定値に利用するのはどうかな? Dim flg As Boolean Sub test() On Error GoTo ErrorHandler Application.DisplayAlerts = Not flg Selection.MergeCells = True flg = True Exit Sub ErrorHandler: MsgBox "キャンセルされました。" End Sub 多分、こんな感じで良いと思いますが、 変数flgの値がリセットされることも有り得るので、 変数の代わりにTrue/Falseを ワークシートなどに書き込む方が 確実かもしれません。

vba_minarai
質問者

お礼

早速のご指導有難う御座います。 VBA以外の力を借りると出来るのでしょうか? もしくは、同じモジュールでエラーNo1004が発生した場合に、ダイアログでキャンセルが押されたのか?もしくは、それ以外の1004エラーなのかを識別する方法ってあるのでしょうか? それとも、こまめに、エラーとラップのオンオフを行い、その範囲内で生じる1004エラーは、ダイアログのキャンセルしか発生しないとみなすしか方法がないのでしょうか? 重ね重ねご指導のほど宜しくお願い致します。

関連するQ&A