2008年07月07日

CutCopyMode

Falseといえば、もうひとつ思い出しました(以前別のところでも書いた話ですが)。
今回は、関数ではなくVBAの話です。

まずは基本的なところから。
セル範囲を選択して「コピー」や「切り取り」を実行すると、選択範囲が点線でぐるぐる囲まれます。
コピーを実行した状態を「コピーモード」、切り取りを実行した状態を「切り取りモード」といいます。

VBAでこの状態を表しているのがApplicationオブジェクトのCutCopyModeプロパティであり、それぞれの状態は、定数xlCopyまたはxlCutで表されます。
定数というのは、ある役割を持つ数値に、その意味がわかりやすいように名前を付けたもののことで、xlCopyの実際の値は1、xlCutの実際の値は2です。

Excel VBAのヘルプを見ると、CutCopyModeプロパティの戻り値は、このxlCopyとxlCut、そしてそのいずれでもない状態を表すFalseであるとしています。

でも、これっておかしいですよね?
xlCopyは1、xlCutは2なのに、なぜFalseだけ論理値なのでしょう?

実際、イミディエイトウィンドウなどで、コピーも切り取りもしていない状態でCutCopyModeプロパティの値を調べると、Falseではなく0(長整数型)が返ってきます。
もちろんFalseと0は等価なので「If Application.CutCopyMode = Flase Then 〜」のようにしても問題にはなりませんが、少なくとも「戻り値がFalse」という言い方は、正確とはいえません。
また、キーボードから「CutCopyMode =」のように入力しても、自動メンバ表示の機能で出てくるのは「xlCopy」と「xlCut」だけです。
ここはやはり、xlCopyやxlCutという定数と同じグループ(XlCutCopyModeクラス)として、0という値に対して何らかの定数を用意すべきではなかったのでしょうか?


一方、xlCopyやxlCutといった値は、現在の状態を調べることだけが可能で、CutCopyModeプロパティにこれらの値を設定することはできません。
VBAでコピーモードや切り取りモードにしたい場合は、CopyメソッドやCutメソッドを実行します。

「CutCopyModeプロパティに値を設定する」という操作を行うのは、コピーモードまたは切り取りモードの状態を解除して、通常の状態に戻したい場合です。
この場合、一般的にはFalseを設定するものとされていますし、記録機能などでこの操作を記録した場合も、やはり次のようになります。

Application.CutCopyMode = False

ところが、自分でVBAのコードを記述する場合、実際には、False以外の値であっても、コピーモードや切り取りモードは解除されます。
とにかく「何らかの数値を設定する」という操作さえ行えば解除されるので、実はxlCopyやxlCutでも解除されてしまいます(ちなみに文字列などはやはり不可です)。

まあ、Falseを設定しておくのが見た目にも一番操作の意味がわかりやすい、という判断なのでしょうが、ここでもやはり、通常の状態を意味する定数を用意しておくべきだったのではないのかなぁ、と思ってしまいます。

ちなみに、Excel VBAのヘルプでは、この操作に関する解説部分では、「FalseまたはTrueを設定する」となっています。
この解説も、間違いとまではいえませんが、正確といえるかどうかは……(^^;)
posted by 土屋和人 at 23:24| Comment(0) | TrackBack(0) | Excel
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/16730466
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック