即効テクニック

セル操作関連のテクニック

セルの値だけをコピーする

(Excel 2000/2002/2003/2007/2013/2016)
セルをコピーするのは簡単です。

Sub Sample1()
  Range("A1:E1").Copy Range("G1")
End Sub
上記のマクロは、セル範囲A1:E1をセル範囲G1:K1にコピーします。 コピーの操作をマクロ記録すると冗長なコードが記録されますが、Copyメソッドは引数に貼り付け先を指定することができます。 Copyメソッドによるコピーは、セル全体をコピーします。 コピー元のセルに数式が入力されていた場合、貼り付け先のセルに合わせて数式内で参照しているアドレスが自動調整されます。 また、コピー元の書式も貼り付け先に反映されます。 これはこれで便利ですが、ときにはセルの値だけをコピーしたいこともあります。 セルの値だけをコピーするには「形式を選択して貼り付け」を実行します。 マクロ記録すると、次のようなコードが記録されます。
Sub Macro1()
  Range(Selection, Selection.End(xlToRight)).Select
  Selection.Copy
  Range("G1").Select
  Selection.PasteSpecial Paste:=xlPasteValues, _
              Operation:=xlNone, _
              SkipBlanks:=False, _
              Transpose:=False
  Application.CutCopyMode = False
End Sub
不要なSelectと引数を取り除くと、次のようになります。
Sub Macro1()
  Range(Selection, Selection.End(xlToRight)).Copy
  Range("G1").PasteSpecial Paste:=xlPasteValues
  Application.CutCopyMode = False
End Sub
これでコピー元の値だけを貼り付けることができます。 セルに数式が入力されていた場合は値だけが貼り付けられ、貼り付け先の書式もそのままです。 しかし、セルの値だけをコピーするのでしたら、もっと簡単な方法があります。 たとえば次のコードは、セルA1の値をセルB1にコピーします。
Sub Sample2()
  Range("B1").Value = Range("A1").Value
End Sub
Valueプロパティを省略せずに指定するのがポイントです。 Valueプロパティはセル内のデータ(値)を表します。 セル内のデータを別のセルのデータに設定するのでから、これは、セルの値だけをコピーするのと同じことです。 もちろん、数式は値だけがコピーされ、書式も貼り付け先のままです。 ただし、ひとつだけ注意点があります。 一般的なセルのコピーでは
Sub Sample1()
  Range("A1:E1").Copy Range("G1")
End Sub
のように、コピー元セル範囲の大きさと、貼り付け先セル範囲の大きさは必ずしも等しくなくてかまいません。 上記のマクロでは、セル範囲A1:E1が「セルG1を左上とする」セル範囲にコピーされます。 しかし、Valueプロパティを利用した値のコピーでは、コピー元と貼り付け先のセルに、同じ大きさを指定しなければなりません。
Sub Sample3()
  Range("G1").Value = Range("A1:E1").Value
End Sub
というコードでは、セルG1にしかコピーされません。これは、
Sub Sample4()
  Range("G1:K1").Value = Range("A1:E1").Value
End Sub
としなければなりません。 コピー元セル範囲の大きさが不明だったり可変の場合には、Resizeプロパティを使うといいでしょう。 次のマクロは、選択したセル範囲の値だけを、セルG1より右にコピーします。
Sub Sample5()
  With Selection
    Range("G1").Resize(.Rows.Count, .Columns.Count).Value = .Value
  End With
End Sub