セルの別の箇所への複写

カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作

2016/08/13

今回は、セルの別の箇所への複写を取り上げます。

「コピー&貼り付け」(Copy)および「切り取り&貼り付け」(Cut)の二つです。

△ 関連の Program Page


《このページの目次》


    

1. 概要

 あるセル範囲を別の箇所に複写したいことがあります。その方法を取り上げます。

 「複写する」という場合、元のセル範囲をそのまま残すケース、元のセル範囲を消してしまうケースの二通りが考えられます。

 「残す」のがコピー&貼り付け
 「消してしまう」のが切り取り&貼り付けです。

 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に複写されます。

目次に戻る


2. マクロ

 下に掲げるマクロでは次の処理を行っています。

 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
-------- ここまで

目次に戻る


    

3. OLEを利用するVBScript

 前述のマクロと同じ操作を行うVBScriptを掲げます。

 マクロでは「アクティブシートが処理対象である」との暗黙の前提を使いましたが、VBScriptではそういう訳にいかないので PutData にシートオブジェクトを引き渡す形にしています。

    

△ vovXL08.vbs

 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

    

〜 以上 〜