バージョン 1705 以降の Excel 2016 でコピー範囲が保持されるようになった動作のプログラムへの影響


こんにちは、Office 開発サポート チームの中村です。

 

今回の投稿では、Excel のコピー動作の変更に関して記載します。

これまで、Excel ではセル範囲をコピーした後、他のセルに値を入力したり、セルの挿入や削除などを行うと、コピー範囲が解除されて貼り付けられなくなっていました。

この動作について、クイック実行版の Excel 2016 バージョン 1705 (16.0.8067.xxxx) で、Excel のセル範囲をコピーした後、他の操作を行っても、コピー範囲が解除されないように変更されました。このバージョンは、Current Channel 向けに 2017 年 5 月に提供されたものとなり、他のチャネルへは順次提供されます。この新しい動作については、以下の公開情報で確認できます。

 

タイトル : Office 365 の新機能

アドレス : https://support.office.com/ja-JP/article/95c8d81d-08ba-42c1-914f-bca4603e1426

該当箇所 : “2017 年 5 月の更新プログラム” 内の “コピーを保持する”

 

例)

  1. 以下のように A1 セルをコピーします。

図 1. A1 セルのコピー

図 1. A1 セルのコピー

 

  1. B1 セルに文字を入力します。

図 2. B1 セルへの値入力

図 2. B1 セルへの値入力

 

  1. Enter キーを押下して、入力を完了すると、A1 セルのコピーが維持されたままとなっており、そのまま C1 セルに貼り付けられます。

図 3. C1 セルへの貼り付け

図 3. C1 セルへの貼り付け

 

これに伴って、画面操作では、行などの挿入を行うときに [コピーしたセルの挿入] と [挿入] を選択できるようになっています。

図 4. 行の挿入 (セル範囲がコピーされている場合)

図 4. 行の挿入 (セル範囲がコピーされている場合)

 

この動作変更は、画面操作を行うユーザーにとっては都度コピーを行うことなくシートを編集できるため、利便性が向上します。ただ一方で、プログラムの実装によっては、以前と異なる動作となる場合がありますのでご注意ください。

 

プログラムで動作が変更される場合

以下のコードでは、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 行挿入されます。

図 5. 以前の動作

図 5. 以前の動作

 

バージョン 1705 からの動作

2 行挿入され、行に A1 / A2 セルの値が繰り返し入力されます。

図 6. バージョン 1607 以降の動作

図 6. バージョン 1607 以降の動作

従来の動作では、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

 

今回の投稿は以上です。

 

本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。

 

Skip to main content