カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
今回は、セルの別の箇所への複写を取り上げます。
「コピー&貼り付け」(Copy)および「切り取り&貼り付け」(Cut)の二つです。
あるセル範囲を別の箇所に複写したいことがあります。その方法を取り上げます。
「複写する」という場合、元のセル範囲をそのまま残すケース、元のセル範囲を消してしまうケースの二通りが考えられます。
「残す」のがコピー&貼り付け、
「消してしまう」のが切り取り&貼り付けです。
VBAのメソッドでは、コピー&貼り付けをCopyで行い、切り取り&貼り付けをCutで行います。使い方は同じで、複写先の開始番地を指定します。
Range("A1:B2").Copy Destination:=Range("A5")
とすれば、A1:B2の2×2の4個のセルをA5以下に貼り付けます。A5:B6のセル範囲に貼り付けられることになります。
ここで注意していただきたいのは、複写先のA5:B6に何か書き込まれてあった場合です。それらは失われます。つまり、上書きされてしまいます。
上書きでなく挿入したいのなら、Copyを行う前に A5:B6に対してInsertをあらかじめ実行しておく必要があります。
なお、Destination:= という記述は省略してかまいません。
Range("A1:B2").Copy Range("A5")
と書いても正しく実行されます。
次に切り取り&貼り付けですが、
Range("A1:B2").Cut Destination:=Range("A5")
とすれば、A1:B2の4個のセルがA5以下に複写されます。
このとき、A1:B2のセルは、4個とも空白セルになります。この点がコピー&貼り付けと異なる点です。
空白セルになるというのは、セルがクリア(Clear)されることを意味します。削除(Delete)されるのとは違います。したがって、切り取られるセル範囲の周辺において、下の行が繰り上がったり、右側の列が左にシフトしたりはしません。
Copy, Cut の両法とも、セル範囲を別のワークシートに複写することができます。たとえば下のような記述が可能です。
Worksheets(1).Range("A1:B2").Copy Destination:=Worksheets(2).Range("A1")
上のようにすれば、第1ワークシートのA1:B2の4個が第2ワークシートのA1:B2に複写されます。
下に掲げるマクロでは次の処理を行っています。
A5:B6の2×2は、左上と右下が残り、
A8:B9の2×2は、右上と左下が残る形になります。
いわば、たすき掛けのような並びです。
以下、マクロです。
-------- ここから
Sub Macro1()
Worksheets(1).Activate
Call PutData()
Range("A1:B2").Copy Range("A5")
Range("B5").Cut range("B8")
Range("A6").Cut range("A9")
Worksheets(1).Range("A1:B2").Copy Worksheets(2).Range("A1")
End Sub
Sub PutData()
ActiveSheet.UsedRange.Clear
Range("A1:B1").Value = Array("ice", "water")
Range("A2:B2").Value = Array("rain", "snow")
End Sub
-------- ここまで
前述のマクロと同じ操作を行うVBScriptを掲げます。
マクロでは「アクティブシートが処理対象である」との暗黙の前提を使いましたが、VBScriptではそういう訳にいかないので PutData にシートオブジェクトを引き渡す形にしています。
1Option Explicit 2Dim FSO, BookPath 3Dim EXLapp, WBobj, WSobj 4Const xlWorkbookNormal = -4143 5 6Set FSO = CreateObject("Scripting.FileSystemObject") 7BookPath = FSO.GetAbsolutePathName("Book1.xls") 8If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath) 9Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 10EXLapp.Visible = True ' Excelを見える状態に 11Set WBobj = EXLapp.Workbooks.Add() ' Workbookの新規作成 12Set WSobj = WBobj.Worksheets(1) 13Call PutData(WSobj) 14With WSobj 15 .Range("A1:B2").Copy .Range("A5") 16 .Range("B5").Cut .range("B8") 17 .Range("A6").Cut .range("A9") 18End With 19WBobj.Worksheets(1).Range("A1:B2").Copy WBobj.Worksheets(2).Range("A1") 20WBobj.SaveAs BookPath, xlWorkbookNormal 21EXLapp.quit 22 23Sub PutData(WSobj) 24 With WSobj 25 .UsedRange.Clear 26 .Range("A1:B1").Value = Array("ice", "water") 27 .Range("A2:B2").Value = Array("rain", "snow") 28 End With 29End Sub
〜 以上 〜