[[20090812223654]] 『Cancel ってなんですか』(Poo) ページの最後に飛ぶ

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

 

『Cancel ってなんですか』(Poo)

 イベントマクロを作るとき、たとえばダブルクリックイベントなどの時、自動的に

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

 みたいな式ができるのですが、引数の Target は、ダブルクリックしたセルを表す、と
 思うのですが、Cancel って何なのでしょう?これまで自分で何かするとき、
 Cancel を使わなくても簡単な処理はできていたので、気にしていなかったのですが、
 ふと気になりました。

 As Boolean とあるので、True か False の値をとるものと思うので、

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox Cancel
 End Sub

 としてみると、False が表示されました。

  デフォルトで False のようなのですが、これをTrue にすると、何がどうなるの
 でしょう?


 こんにちは。かみちゃん です。

 > Cancel って何なのでしょう?

 以下のようなコードで Cancel = True を記述する場合としない場合でどう違うか確認されてはいがですか?

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox Cancel
 '   Cancel = True
 End Sub

 Cancel = True を記述しない場合、Targetのセルが編集状態になるかと思います。
 記述した場合は、Targetのセルが編集状態にはなりません

 (かみちゃん)
 2009/08/12 22:51

 かみちゃん、ありがとうございます。

 >Cancel = True を記述しない場合、Targetのセルが編集状態になるかと思います。
 >記述した場合は、Targetのセルが編集状態にはなりません

 動作は確認できました。

 Cancel とは、「編集状態のキャンセル」ということと考えていいのでしょうか。

 で、VBAの基本がまだよくわかっていないのですが、この Cancel は
 「プロパティ」とか「変数」とかでいうと、何なんでしょう?

 VBAEditor で Cancel にカーソルを持って行ってF1キーを押しても
 「キーワードが見つかりません。」といわれます。

 (Poo)

 [EXCEL2003 HELP引用]
 Cancel メソッド

 実行中の非同期メソッドの呼び出しの実行をキャンセルします。

 (dack)これ?

 dack さん、ありがとうございます。

 Help で Cancel は検索してみたのですが、ここで問題にしている Cancel は
 True とか False とかの値を持つので、メソッドではないと思っていました。
 値を持つメソッドってあるのですか?

 それと、Editor で F1キーでヘルプが出ないのはどうしてでしょう?
 ちなみに、Target も「キーワードが見つかりません。」となります。
 Target と Cancel は同じように使われていますが、Target もメソッドなのでしょうか。?

 (VBAの基本がまだよくわかっていないPoo)


 > VBAEditor で Cancel にカーソルを持って行ってF1キーを押しても
 > 「キーワードが見つかりません。」といわれます。

 その『Cancel』は、仮引数ですから、変数名なんて、何だっていいんです。
 『キャン』にでも変更して同じ実験をしてみてください。

 『Target』も同じです。ついでに『Tgt』とでも変更してみてください。

 ヘルプを見るなら『Worksheet.BeforeDoubleClick』の方がいいでしょう。

 私のXL2007では以下(抜粋)の様に記述されています。

 式.BeforeDoubleClick(Target, Cancel)

 Cancel 
  必須 ブール型 (Boolean) 
  イベントが発生すると、False が渡されます。

  イベント プロシージャでこの引数を True に設定すると、
  プロシージャが終了しても既定のダブルクリックの操作は実行されません。

 (半平太) 2009/08/12 23:54

 かぶりましたが(汗

 いえ、Subステートメントのhelpで書かれているように引数を表す変数です。
 あくまでも変数ですのでF1でヘルプは表示されません。
 ただ、通常の引数との違いはシステムとやり取りをするための引数ということになります。
 (選択範囲を利用者へ示したり、対応する動作のキャンセルをシステムへ指示したり)
 (独覚)

 Cancelの説明は既に投稿されているようですが、
 この引数Cancelの事をアーギュメントと呼ぶのか、パラメータと呼ぶのか?
 すぐ曖昧になります。

 それはともかく、こういうのは自分でイベントを作ってみると理解が深まります。

 Worksheetのイベントには、今回取り上げられたBeforeDoubleClick以外に

 Worksheet_Changeイベントなんていうのもあります。

 このイベントには、

 Worksheet_Change(ByVal Target As Range)

 で、Cancelがありません。「これにCancelという引数をカスタマイズして追加しよう」

 という例です。

 Wsht_Change(ByVal Target As Range,Cancel as Boolean)

 Cancelは、Boolean型で 既定値は False
 プロシジャー内でTrueに設定すると、Tagetの内容はクリアされ、再度選択される。

 新規ブック(Sheet1という名のワークシートがあるブック)で試してみてください。

 まず、クラスモジュールを作成してください。クラス名は、例題ですから既定名のClass1でよいです。

 このClass1のモジュールに

 '==============================================================================
 Option Explicit
 Public WithEvents wsht As Worksheet 
 '↑Changeイベントをカスタマイズするワークシートオブジェクト
 Event Change(ByVal Target As Range, Cancel As Boolean)
 '↑イベントの定義
 Private Sub Class_Terminate()
    Set wsht = Nothing 
 End Sub
 '==============================================================================
 Private Sub wsht_Change(ByVal Target As Range)
    Dim Cancel As Boolean
    Cancel = False
    RaiseEvent Change(Target, Cancel) 'イベントの作動
    If Cancel = True Then 'CancelがTrueだったら
       Application.EnableEvents = False
       Target.ClearContents          '対象セルのデータのクリア
       Application.Goto Target, True '元のセル範囲を選択
       Application.EnableEvents = True
    End If
 End Sub

 Thisworkbookのモジュールに

 '===========================================================================
 Option Explicit
 Private WithEvents sht As Class1
 '===========================================================================
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Set sht = Nothing
 End Sub
 '===========================================================================
 Private Sub Workbook_Open()
    Set sht = New Class1 'Class1というオブジェクトの作成
    Set sht.wsht = Worksheets("Sheet1") 'プロパティwshtにSheet1を割り当てる
 End Sub
 '===========================================================================
 Private Sub sht_Change(ByVal Target As Range, Cancel As Boolean) 'Changeイベント
    Dim ctarget As Range
    Set ctarget = Application.Intersect(Target, Worksheets("sheet1").Range("a1"))
    If Not ctarget Is Nothing Then 'Sheet1のセルA1が変更されたセルなら、
       If Val(ctarget.Value) < 1 Or Val(ctarget.Value) > 9 Or Int(Val(ctarget.Value)) <> Val(ctarget.Value) Then
          '1から9の整数でないなら
          MsgBox "1から9の整数を指定して下さい"
          Cancel = True
       End If
    End If
 End Sub

*適当な名前で保存して、一度閉じて、再度開いてください。

 Sheet1のセルA1に適当な文字や数字を入れてください。
 1から9の整数以外を入力すると、メッセージ後、セルをクリアして再び、セルを選択します。

 このイベント自体、必要性はなさそうですが、このコードを解析すると、
 元々のBeforeDoubleClickのCancelの理解につながると思います。

 ちょっと難しいかもしれませんが、投稿内容から、非常に研究熱心な方のように
 思えたのでちょっと掘り下げてみました。

 ichinose

 


 半平太さん、独覚さん、ichinoseさん、ありがとうございます。

 半平太さん
 >その『Cancel』は、仮引数ですから、変数名なんて、何だっていいんです。

 そういうことだったのですね。

 >ヘルプを見るなら『Worksheet.BeforeDoubleClick』の方がいいでしょう。

 ヘルプでヒットしませんでした。Worksheet_BeforeDoubleClick でもダメでしたが、
 BeforeDoubleClick でヒットしました。(Excel2003です)
 Cansel については必須ではなく「省略可能です」とありました。説明内容は
 同じでした。
 ちょっとわかったような気がしました。

 独覚さん
 >通常の引数との違いはシステムとやり取りをするための引数ということになります。

 Cancel が「対応する動作のキャンセルをシステムへ指示」する変数である、という
 ことがわかりました。つまり、これを True にすると、「ダブルクリックをした」と
 いうことがキャンセルされるので、このプロシージャの処理が行なわれたあと、
 セルが編集状態にならない、ということなのですね。

 ichinoseさん
 >ちょっと難しいかもしれませんが、

 ちょっとどころか、ものすごく難しいです。今の私のレベルでは取り組めそうにありません。

 >投稿内容から、非常に研究熱心な方のように思えたので

 といっていただいているので、これから研究して、こういう話が理解できるように
 なっていきたいと思います。

 (Poo)


このやりとり、大変参考になりました。ありがとうございました。(awazo)

参考になりました。ありがとうございました。

コメント返信:

[ 一覧(最新更新順) ]


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