バージョン 1705 以降の Excel 2016 でコピー範囲が保持されるようになった動作のプログラムへの影響
こんにちは、Office 開発サポート チームの中村です。
2018/11/1 Update
この記事で説明する機能は、以下のコミュニティ投稿の通り、製品品質上の理由で現在全てのチャネルで無効化されました。将来的に機能改善ののち再公開される見込みですが、その際には本ブログ記事で説明する動作が変更される可能性があります。
タイトル : Keep the Copy
アドレス : https://techcommunity.microsoft.com/t5/Excel-Blog/Keep-the-Copy/ba-p/86164
今回の投稿では、Excel のコピー動作の変更に関して記載します。
これまで、Excel ではセル範囲をコピーした後、他のセルに値を入力したり、セルの挿入や削除などを行うと、コピー範囲が解除されて貼り付けられなくなっていました。
この動作について、クイック実行版の Excel 2016 バージョン 1705 (16.0.8201.xxxx) で、Excel のセル範囲をコピーした後、他の操作を行っても、コピー範囲が解除されないように変更されました。このバージョンは、Current Channel 向けに 2017 年 5 月に提供されたものとなり、他のチャネルへは順次提供されます。この新しい動作については、以下の公開情報で確認できます。
タイトル : Office 365 の新機能
アドレス : https://support.office.com/ja-JP/article/95c8d81d-08ba-42c1-914f-bca4603e1426
該当箇所 : “2017 年 5 月の更新プログラム” 内の “コピーを保持する”
例)
- 以下のように A1 セルをコピーします。
[caption id="attachment_1345" align="alignnone" width="465"] 図 1. A1 セルのコピー[/caption]
- B1 セルに文字を入力します。
[caption id="attachment_1355" align="alignnone" width="464"] 図 2. B1 セルへの値入力[/caption]
- Enter キーを押下して、入力を完了すると、A1 セルのコピーが維持されたままとなっており、そのまま C1 セルに貼り付けられます。
[caption id="attachment_1365" align="alignnone" width="464"] 図 3. C1 セルへの貼り付け[/caption]
これに伴って、画面操作では、行などの挿入を行うときに [コピーしたセルの挿入] と [挿入] を選択できるようになっています。
[caption id="attachment_1357" align="alignnone" width="464"] 図 4. 行の挿入 (セル範囲がコピーされている場合)[/caption]
この動作変更は、画面操作を行うユーザーにとっては都度コピーを行うことなくシートを編集できるため、利便性が向上します。ただ一方で、プログラムの実装によっては、以前と異なる動作となる場合がありますのでご注意ください。
プログラムで動作が変更される場合
以下のコードでは、A1 ~ A2 セルに値を入力し、これをコピーして B1 ~ B2 セルに貼り付けた後、6 行目に行を挿入しています。
<サンプル コード>
Sub Sample()
Range("A1").Value = "A1"
Range("A2").Value = "A2"
Range("A1:A2").Copy
Range("B1:B2").Select
ActiveSheet.Paste
Rows("6:6").Select
Rows("6:6").Insert
End Sub
これまでの動作
空白の行が 1 行挿入されます。
[caption id="attachment_1305" align="alignnone" width="535"] 図 5. 以前の動作[/caption]
バージョン 1705 からの動作
2 行挿入され、行に A1 / A2 セルの値が繰り返し入力されます。
[caption id="attachment_1315" align="alignnone" width="535"] 図 6. バージョン 1705 以降の動作[/caption]
従来の動作では、Paste の実行によって、次の行の挿入時にはコピー範囲が保持されていなかったため、明示的にコピー モードのリセットを行わなくても空白行が挿入されていました。
バージョン 1705 以降では、Paste 後もコピー範囲が保持されるため、明示的にコピー モードを解除せずに行を挿入すると、このような動作となります。
回避方法
以前の動作と同等の動作としたい場合は、Application.CutCopyMode プロパティを使用してコピー範囲をリセットしてから Insert 関数を呼び出します。
タイトル : Application.CutCopyMode プロパティ (Excel)
アドレス : https://msdn.microsoft.com/ja-jp/library/office/ff839532(v=office.15).aspx
<サンプル コード>
Sub Sample()
Range("A1").Value = "A1"
Range("A2").Value = "A2"
Range("A1:A2").Copy
Range("B1:B2").Select
ActiveSheet.Paste
Application.CutCopyMode = False '回避コード
Rows("6:6").Select
Rows("6:6").Insert
End Sub
今回の投稿は以上です。
本情報の内容 ( 添付文書、リンク先などを含む ) は、作成日時点でのものであり、予告なく変更される場合があります。