Excel VBAでセルをコピーするまたは切り取り-CopyメソッドとCutメソッド

Excelにデータを入力する以外、コピー、貼り付け、切り取りなどの操作が最も一般的に使用される操作です。そのため、Excelインターフェイスのデザイナーがこれらの機能を最も目立つ位置に配置しました。 リボンインターフェイスのデザイナーは、ユーザーが頻繫に使用する機能をたくさんの調査を行った後、今のインターフェイスを作成しました。 切り取り、コピー、貼り付けは、ユーザーが最も頻繁に使用する操作であるため、優先順位に設定しました。 次には、VBAコードでセルをコピー、切り取り、貼り付けなどの方法を説明します。

まず、RangeオブジェクトのCopyメソッドをご覧ください。次のコードを実行します。

Range('A1').Copy

ワークシートは次のようになります。

ワークシートでは、セルA1の周りは流れる破線のフレームになっており、セルA1のデータがクリップボードにコピーされたことを示しています。

次のコードを実行します。

Range('A1').CopyRange('B3')

セルA1のデータをセルB3にコピーすると、結果が次の図のようになります。

これより、RangeオブジェクトのCopyメソッドの構文は次のようになります。

Rangeオブジェクト.Copy (Destination)

説明:

  • Copyメソッドは、セルまたはセル範囲を指定されたセル、セル範囲、またはクリップボードにコピーします。
  • 引数のDestinationは省略可能です。コピー先のセル範囲を指定します。この引数を省略すると、クリップボードへコピーされます。

次にはRangeオブジェクトのCutメソッドをご覧ください。次の図の左側に示されているワークシートで次のコードを実行します。

Range('A1').Cut

結果は次の図の右側に示されているようです。Copyメソッドと同様に、セルA1の周りに流れる破線のフレームは、セルA1のデータがクリップボードにコピーされたことを示します。

次のコードを実行します。

Range('A1').CutRange('B3')

次の図のように、セルA1のデータがセルB3に移動されました。

セルA1のデータも同時にクリアされます。

これにより、RangeオブジェクトのCutメソッドはCopyメソッドに類似しているとわかり、構文は次のようになります。

Rangeオブジェクト.Cut (Destination)

説明:

  • Cutメソッドは、セルまたはセル範囲を指定されたセルまたはセル範囲、あるいはクリップボードに移動されます。
  • 引数のDestinationは省略可能です。コピー先のセル範囲を指定します。この引数を省略すると、クリップボードへコピーされます。
  • 指定したセルまたは範囲にデータが移動された後、元のセルまたは範囲のデータがクリアされます。
  • 複数のセルを切り取りの場合は、隣接するセルで構成されている必要があります。

CopyメソッドとCutメソッドの使い方

元のセルを保持したまま、セルまたはセル範囲のコピーを新しいセルまたはセル範囲に配置する必要がある場合は、Copyメソッドを使用します。

セルまたはセル範囲を新しいセルまたはセル範囲に移動し、元のセルを同時に削除する必要がある場合は、Cutメソッドを使用します。

例1

条件を満たすデータを見つけて、関連するデータを指定された範囲にコピーします。

次のワークシートでは、左側がデータ範囲、右側が検索範囲と結果範囲です。セルK1に果物名を入力し、プログラムを実行すると、データ範囲の対応する果物の販売データが結果範囲に表示されます。

コードを次となります。

Sub FindAndCopy()
Dim lngDataLastRow As Long 'データ範囲の最終行
Dim lngFindLastRow As Long '結果範囲の最終行
Dim strValue As String '検索値
Dim strFirstRng As String '最初に見つかったセル
Dim rng As Range
Dim r As Long '行番号を増やすために使用される
'データ範囲の最終行の行番号
lngDataLastRow = Range('A' &Rows.Count).End(xlUp).Row
'結果範囲の最終行の行番号
lngFindLastRow = Range('I' &Rows.Count).End(xlUp).Row
r = 1
'結果範囲をクリアする
If lngFindLastRow > 2 Then
'結果範囲の3行目以降、データがある場合は、クリアする
Range('I3:N' &lngFindLastRow).Value = ''
'結果範囲の最終行の行番号
lngFindLastRow = Range('I'& Rows.Count).End(xlUp).Row
End If
'検索値はセルK1にある
strValue = Range('K1').Value
'最初に見つかったセルを変数に割り当てる
Set rng = Range('A2:F' &lngDataLastRow).Find(What:=strValue, LookAt:=xlWhole)
'セルが見つかったかどうかを確認する
If Not rng Is Nothing Then
'見つかった場合は、位置を保存する
strFirstRng = rng.Address
Do
'見つかったデータ行を結果範囲にコピーする
rng.Offset(0, -1).Resize(1, 6).CopyRange('I' & lngFindLastRow + r)
'検索し続ける
Set rng = Range('A2:F'& lngDataLastRow).FindNext(After:=rng)
r = r + 1 '1行を追加する
'見つかったのは最初のセルではない場合、続行する
Loop While Not rng Is Nothing Andrng.Address <> strFirstRng
End If
End Sub

例えば、セルL1に[リンゴ]を入力すると、データ範囲でリンゴの販売データを検索します。 コードを実行した後の結果を次の図に示します。

コードにあるコメントはプログラムの詳細を意味します。

例2

特定のデータを指定された範囲にコピーする

次の図に示すように、ワークシートの値(赤いセル)は、手動で1行ずつコピーするのではなく、セルG1から始まる右側の部分に一回で入力されます。

コードは次となります。

Sub CopyAreas()
Dim rngDest As Range
Dim rng As Range
'コピー先のセルを設定する
Set rngDest = Range('G1')
'ワークシート内の定数であるデータ範囲を検索し、それらのデータを新しいセル範囲にコピーする
For Each rng InCells.SpecialCells(xlCellTypeConstants, 1).Areas
'新しい範囲にコピーする
rng.Copy Destination:=rngDest
'コピー先のセルを更新する
Set rngDest =rngDest.Offset(rng.Rows.Count)
Next rng
End Sub

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です