セルのコピペをマクロの記録機能で保存するとCutCopyModeが記録される
セルをコピペする操作をマクロの記録で保存すると以下のようなコードが記録されます。
大体の内容はコードからSelectやCopyやPasteといったメソッドで、コピペしてるな、とわかるのですが、Application.CutCopyModeは何なんでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Macro1() ' ' Macro1 Macro ' ' ActiveCell.FormulaR1C1 = "aa" Range("A1").Select Selection.Copy Range("B2").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Copy Range("C3").Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Sub |
上の黄色の「Application.CutCopyMode = False」ですが、これはコピーや切り取りを行ったことを無効にして、セル範囲の枠線の点滅表示を無しにしています。
処理自体は1行ですが、CutCopyModeは使い方が特殊なプロパティです。
コードを書く際の候補表示が間違っていたり、ヘルプの内容も間違えていたりと、バグがありつつヘルプもバグってるというなんともややこしいプロパティです。
CutCopyModeの設定と参照
以下はCutCopyModeのヘルプです。書いている内容が不親切で、見た人の混乱をまねく恐れがとても高い内容です。
https://msdn.microsoft.com/ja-jp/library/office/ff839532.aspx?f=255&MSPPError=-2147217396
正しくは以下になります。
CutCopyModeの設定
コードでCutCopyModeに設定する場合はFalseしか設定できません。正確にはTrueもxlCopyもxlCutも100でも-0.5でも、数値は何でも設定できるのですが、何を設定してもFalseとして扱われます。
「Application.CutCopyMode =」と書くと選択候補にxlCopyとxlCutが表示されます。
しかし、どちらを設定してもFalseとして扱われます。設計ミスによるバグというか仕方無しの実装でしょうね。想定外の設定が行われた場合はエラーや例外を発生させるべきでしょうね。
定数 | 内容 |
---|---|
False | 切り取りまたはコピーしているセル範囲の枠線を点滅表示を消します。設定後はコピーモード(xlCopy)や切り取りモード(xlCut)の判定は出来なくなります。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub CutCopyModeSetTest() Application.CutCopyMode = True Debug.Print Application.CutCopyMode Application.CutCopyMode = False Debug.Print Application.CutCopyMode Application.CutCopyMode = xlCopy Debug.Print Application.CutCopyMode Application.CutCopyMode = xlCut Debug.Print Application.CutCopyMode Application.CutCopyMode = 100 Debug.Print Application.CutCopyMode Application.CutCopyMode = -0.5 Debug.Print Application.CutCopyMode End Sub |
実行結果(全部0=Falseが設定されていることを示しています)
0
0
0
0
0
0
CutCopyModeの参照
単一セルやセル範囲のコピーや切り取りを行った直後に、どちらを行ったのかを判定できます。
定数 | 値 | 内容 |
---|---|---|
xlCopy | 1 | コピーしていることを表します。 |
xlCut | 2 | 切り取りをしていることを表します。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub CutCopyModeReferTest() Dim iMode '// コピー Range("A1").Copy iMode = Application.CutCopyMode Debug.Print iMode '// 切り取り Range("A1").Cut iMode = Application.CutCopyMode Debug.Print iMode End Sub |
実行結果
1
2