ExcelVBA(マクロ)でセルを選択、コピー、ペーストする方法/Select、Copy、Pasteメソッドの使い方

woman IT

VBAでセルを選択し、選択したセルをコピペする方法のご紹介です。

もしExcelの基本的なコピーの仕方を知りたいという方は、下記記事をご参照ください。この記事はVBA的には基本的ですが、Excelとしてはあまり基本的ではないです。

Excelエクセルでデータをコピーする方法/コピー&ペースト、切り取り、オートフィルの使い方
Excelでは同じデータを簡単に複製することが可能です。ここではデータを「コピー」して「貼り付け」する手順、「切り取り」の方法、及び連番作成などに便利な「オートフィル」について説明します。 コピペ関連で思いつくこと全部書いてありますが、一...

また、VBAの使い方から知りたい方は下記をどうぞ。

ExcelでVBA(Visual Basic for Applications)を使う方法/マクロを記録する方法、そもそもVBAとは何か?
Visual Basicとはプログラミング言語のひとつで、これをアプリケーション(=ソフト。ここではExcelのことですが、wordなどでも使えます)で使えるように組み込んだもののことです。 Visual Basicにfor Applic...
スポンサーリンク

まとめて記述する場合

まとめて書いたほうが簡単なので、こちらを先に書きます。構文としては下記のようになります。

セルのコピペ
コピーする対象.copy 貼りつける対象

セルを切り取って貼り付け
コピーする対象.cut 貼りつける対象

このA1のデータをB1にコピーしたいと思います。
マクロを開き、Range(“A1”).Copy Range(“B1”)A1のデータをB1にコピーすると記述します。
マクロを実行すると、A1のデータがB1に複製されました。

rangeはセルを指定する命令です。Range(“A1:C3”)のように範囲指定も可能です。

複数セルをコピペした例
Range(“A1:A3”).Copy Range(“B1:B3”))。
通常のコピー同様、色や罫線、フォントなどの書式情報もコピーされます。

ワークシートをまたいでコピペしたい場合

Sheet23のA1セルに対して、
Sheet24のA1セルをコピーしたいとします。
ワークシートを指定する場合、範囲の前にSheets(“シート名”)をつけます。
この場合で言えば、Sheets(“Sheet24”).Range(“A1”).Copy Sheets(“Sheet23”).Range(“A1”)となります。
(VBAの式内では、_を付けることで折り返して記述することが可能です)
式を実行すると、シートをまたいでデータがコピペされました。

今選択しているセル、シートを対象にしたい場合

今いるシートに対して貼り付けたいのであれば、コピー先のシート名をActivesheetに変更します。
実行結果。Activesheet=作業中のシートのことです。
ただし複数シートを選択していても、コピーされるのは表示しているシートだけです。
貼り付け先をActivecellに指定することで、作業中のセルを指定することができます。
実行するとこんな感じになります。
Sheets(“Sheet24”).Range(“A1:A3”).Copy ActiveCellのように記述することで、Activecellを起点に複数セルにデータを貼りつけることも可能です。
仮に選択範囲を広くとって上のコードを実行した場合は、
こんな感じで、選択範囲の左上(Activecell)を基準に一回だけ処理が行われます。選択範囲いっぱいにコピーはされません。
逆にアクティブセルから特定のセルにデータをコピーすることもできます。
ActiveCell.Copy Sheets(“Sheet24”).Range(“A1”)のようになります。前後入れ替えただけです。
この状態で実行すると、
こうなります。
この状態で実行しても、
こうなります。繰り返しになりますが、ActiveCellは選択範囲の左上だけです(※)。
貼り付け先をA1:A3のように変更しても、全て「1」がコピーされることになります。
※正確には、選択範囲の中でアクティブセルは最初は左上にあります。
コピーするマクロの中で使う必要はあまりないと思いますが、選択範囲の中でアクティブセルを変更したい場合、Activateメソッド等を使います。

隣にあるセルをコピペ

アクティブセルの文字列を右隣にコピーするならActiveCell.Next = ActiveCell.value
左隣ならActiveCell.Previous = ActiveCell.valueで可能です。
' vba
ActiveCell.value = ActiveCell.Next' 右隣→アクティブセルにコピー
ActiveCell.value = ActiveCell.Previous' 左隣→アクティブセルにコピー
右隣、左隣をアクティブセルにコピーしたいなら前後を逆にします。

相対的な位置のセルをコピペ

「選択したセルとその下のセルを特定セルにコピー」とかであれば、Offset(上下左右)プロパティで対応できます。
Resizeプロパティでも、起点となるセルや範囲から見た範囲を取得できます(その他選択系VBA)。
Row・Columnプロパティでも、「選択したセルの行番号を取得し、別の列+取得した行のセルを操作」的なことができます。
「検索したセルの右隣をコピー」とかになると、これはFindメソッドになります。英単語帳の作り方で一回数値操作するのに使っているので、仮にリンク貼っときます。Row・Columnの実用例にもなってます。

条件つきコピー、繰り返しコピー

For nextFor each in next、Do Whileステートメントを使用することで、広範囲で何度もコピペを繰り返させることができます。また、If文関数などと組み合わせることで、条件を色々絞ることが可能です。
たとえば下記記事ではFor nextとIf文を使い、空欄がある場合上のセルをコピーする、という処理を何度も繰り返しています。表のサイズにより、100回でも10000回でもワンクリックでコピペが可能です。

ExcelVBA(マクロ)で表中の空白のセルに上のセルと同じ内容を自動で入力する方法/Copy、For Nextの使い方
CopyメソッドとFor Next(ついでにIf Then)の組み合わせとして、「列の中で、もし空白のセルがあったら上のセルをコピペ」というマクロを組んでみました。
スポンサーリンク

別々に行う場合

「選択」「コピー」「ペースト」を別々に行う形で説明します。

セルを選択する方法

最初にどこのデータをコピーするかを指定します。セルの選択にはSelectメソッドを使います。

セルの選択
対象.Select

特定のセルを指定したい(例:A1)ならRange(“A1”)、またはCells(1,1)と指定します。
Cellsは()に行番号、列番号を数字で入れることで場所を指定できます。A2であればCells(2,1)、B1であればCells(1,2)となります。
上記の通りRangeでは範囲指定が可能ですが、Cellsでは不可です。ただしCells.Selectで全体指定は可能です。

cells(1,2).select
1行目2列目のセルを選択する)の実行結果。
Range(A1:B3).select
A1からB3までのセルを選択する)の実行結果。

別のシートのセルを選択

シートを選択するには、Sheetsオブジェクトを指定します。

シートの選択
Sheets(“シート名”).Select
Sheet25からマクロを使い、
Sheet24のC3セルを選択したいとします。
Copyメソッドであれば、Sheets(“sheet24”).Range(“C3”).Copy ActiveCellのような書き方が可能です。
しかしSelectメソッドだと、Sheets(“sheet24”).Range(“C3”).Selectのようにまとめて書くとエラーになります。理由は知りませんが、そういう仕様です。
なので、Sheets(“sheet24”).SelectRange(“C3”).Selectを別々に書いてあげます。
実行結果です。

セルをコピーする方法

セルが選択できたら、指定したセルをコピーします。

データのコピー
対象.copy

データの切り取り
対象.cut

選択したセルをコピー/切り取りして、貼り付けできる状態にします。通常のコピー同様、新たにコピーするとそれ以前のデータはクリップボードから削除されます。

' vba
' セルを選択してコピー
Cells(1,1).Select
Selection.copy

「対象」は現在選択している部分をコピーする「selection」を使用していますが、直接RangeやCellsで指定することも可能です。

セルをペーストする方法

コピーしたデータの貼り付けを行います。下記の「対象」はActiveSheetを指定し、現在選択されているセルに実行します。

コピーしたデータの貼り付け
対象.paste
コピー用データを作っておきます。
Select→Copy→Pasteの実行結果。A1セルがA2~A5にコピーされました。
' vba
' セルを選択してコピー
Cells(1,1).Select
Selection.copy
' セルを選択して貼り付け
Range("A2:A5").Select
ActiveSheet.Paste

Copyの対象の省略について

selection.copyは省略して、直接cells/Rangeからcopyすることも可能です。
ただしpasteは直接指定は不可です。また、SelectionではなくActiveSheetsから指定する必要があります。

なぜpasteにはselectionが使えないのかについては、okwaveで解答がありましたので、そちらのリンクを貼っておきます。

計算結果だけをコピーしたい場合

このような計算があるとします。
A1をB1にコピーするマクロを実行すると……。
通常このように関数自体がコピーされます。
では、計算結果だけをコピーしたい場合はどうすればいいでしょうか?

このような場合は、Valueプロパティを用います。=を入れるのと、式の右辺が左辺にコピーされる点に注意してください。

計算結果のコピペ
貼りつける対象.value = コピーする対象.value
Range(“B1”).Value = Range(“A1”).ValueA1の計算結果をB1に代入すると記述します。
この状態で式を書いたA1にマクロを実行すると……。
計算結果だけがB1にコピーされました。
やりたいことから方法を探すエクセル(Excel)操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント

モバイルバージョンを終了