VBA・マクロでbook間でコピー貼付けをする方法について紹介します
この記事で理解できること↓
- 複数のbook間のデータ処理
- コピーと値貼付け方法
- セルの全選択
実務において単体のbookだけで作業が完結することってあまりないと思いませんか?
何かしら欲しいデータが別のbookもしくはcsvであって、そこからコピペでデータを引っ張てきませんか?
コピペはいつもするから、コピペだけでも自動化させたいと思い
マクロの記録を使って自動化させようと思っても、うまく動かなかったりしますよね
そこで今回は複数のbookを操作し、book間でコピー貼付けをする方法について紹介していきます
ソースコードが見たい・欲しい方は目次で飛んでください
※マクロ形式(.xlsm)の作成方法やマクロのコードの貼付け方がわからない方は、詳細をこちらで紹介していますのでよかったら参考にしてください
book間でコピー貼付けをする流れ
- コピーする「欲しいデータのファイル」と、「ペーストするマクロbook」を変数に設定する
- 「欲しいデータのファイル」のコピーしたいシートと、「ペーストするマクロbook」の貼り付けたいシートを変数に設定する
- コピーしたい範囲を決め、コピーする
- 貼付けたいbookの貼付ける位置を決め値貼付けする
変数(bookとSheetを変数に入れる)
操作したいbook、もしくはcsvファイルを変数に入れます
変数とはデータを入れる「箱」をイメージしてください
その変数という箱に数値や文字などを入れて使用していきます
今回はbookやSheetを入れていきます
最初は「ペーストする」マクロbookを変数に設定します
Sub VBA()
'ファイルを開く//////////////////////////////////////
Dim wb_このマクロbook
Set wb_このマクロbook = ThisWorkbook
3行目: Dim wb_このマクロファイル
「Dim」と書くと、これから変数を決めるよという意味になります
スペースを入れ好きな変数名を入れます
形式: Dim 変数名
5行目: Set wb_このマクロbook = ThisWorkbook
作った変数にマクロbook(ファイル)を入れます
「ThisWorkbook」とはマクロbook(ファイル)のことを指してます
※マクロbook(ファイル)のコードエディター(VBE)にThisWorkbookと記述しているので記述しているこのbookという意味になる
ここで注意ですが、ファイルなどを変数にいれるときは必ず先に「Set」を書きます
「Set」を書かないとエラーが起こりますので注意です
しかし、数字や文字を設定するときは「Set」を入れる必要がありません
「Set」を付けるか付けないかわからないときは、とりあえず書いてコードを実行させて
エラーが出たら「Set」を書けば大丈夫です
そのうちどれが必要でどれが必要でないかわかってきます
次にペーストするシートを変数に設定します
Dim ws_ペーストするシート
Set ws_ペーストするシート = wb_このマクロbook.Sheets("ペーストするシート")
1行目: Dim ws_ペーストするシート
ペーストする変数を決めています
3行目: 作成した「Dim ws_ペーストするシート」にペーストしたいシートを設定します
先ほど設定した「wb_このマクロbook」のシートに欲しいデータ貼り付けたいので
「Set ws_ペーストするシート =」の後にwb_このマクロbook.Sheets(“ペーストするシート“)で場所を指定してあげます
赤い部分には貼り付けたいシート名を入れてください
ここでも「Set」を忘れずに記入してください
コピー元、ペースト先と2つのbookを開いている場合、「book名.sheet名」と正確に場所を記述する必要があります
Sheets(“ペーストするシート”)だけだと、PCは「コピー元、ペースト先どっちのbook?」と判断ができません
初心者あるあるのよく起こるエラーで、私もVBAを始めたころよく苦しめられました
同じように欲しいデータファイルとシートも変数に入れます
Dim wb_欲しいデータファイル
Set wb_欲しいデータファイル = Workbooks("欲しいデータのファイル名.拡張子")
Dim ws_欲しいデータのシート
Set ws_欲しいデータのシート = wb_欲しいデータファイル.Sheets(1)
3行目: 欲しいデータのファイル名.拡張子は、実際に欲しいデータのファイル名.拡張子を入れてください
セルの全選択(CurrentRegion)
コピーしたいデータの範囲を取得します
マウスでやるときもドラッグで引っ張り範囲を決める→右クリック→コピーってやりますよね?
VBAでもまずコピーの範囲を決めます
ちなみにセルを1つ選択した状態で「Ctrl+A」って押したことはありますか?
これをすると数値や文字が入っているセルを全選択してくれます
この動作をVBAで書くとこうなります
Range("A1").CurrentRegion
「Range」はセルのことを指していてRange(“A1”)でA1のことを指定しています
そしてA1を起点に全選択(CurrentRegion)するという意味になります
今回の場合だとこうなります
ws_欲しいデータのシート.Range("A1").CurrentRegion.
これでコピーしたい範囲を取得できます
けどこの時に「Cur….」って長い、発音しにくい、覚えられないと思いませんか?
そこで補完機能を使います、コードを書いている途中で候補を出してくれるあれです
けど厄介なのが補完が出ない時があるんです
そこで何もコードを書いていないところで、Range(中は何でもいい).だけ打ってください
そうすると補完機能がでできますので、cuを入れると「CurrentRegion」がでできます
※Rangeの後の「.」ドットを忘れずに
あと補完機能は「Ctrl+space」で呼び出せますよ
コピーと値貼付け
最後に本題のコピーと値貼付けです
値貼付けする理由は欲しいのはデータだけで、書式はいらないことが多いと思うので値貼り付けにしました
'コピペ///////////////////////////////////////////////
ws_欲しいデータのシート.Range("A1").CurrentRegion.Copy
ws_ペーストするシート.Range("A1").PasteSpecial xlPasteValues
2行目: ws_欲しいデータのシート.Range(“A1”).CurrentRegion.Copy
「ws_欲しいデータのシート.Range(“A1”).CurrentRegion」で欲しいデータの範囲を全選択しています
選択した範囲を「Copy」と記述し、コピーしています
4行目: ws_ペーストするシート.Range(“A1”).PasteSpecial xlPasteValues
「ws_ペーストするシート.Range(“A1”)」でペーストする位置を決めています
そして値貼り付けは「PasteSpecial xlPasteValues」となります
ごちゃごちゃしてますね
まず「PasteSpecial」でペーストするけど、ただペーストするだけじゃないよという意味になり
「xlPasteValues」値貼付けにしてという意味です
赤い部分のxlはVBAの形式です、あまり気にされずに
ってか「PasteSpecial xlPasteValues」長い!覚えられない!となりますよね?
そこで補完機能を使いましょう!
ここでも何もコードが書かれていないところに
Range(中は何でもいい).打てば補完機能が作動するので
「pa」と打てば候補に「PasteSpecial」が出てきます、選択した後にスペースを押すと「xl」から始まる候補が出てきますので、その中の「xlPasteValues」を選んでください
ソースコード
Sub VBA()
'book_Sheetを変数にいれる//////////////////////////////////////
Dim wb_このマクロbook '「Dim」はDimに続く、文字を変数にするって意味、「wb_このマクロbook」という変数を作成、まだ中身はありません
Set wb_このマクロbook = ThisWorkbook '「wb_このマクロbook」名の変数に、このマクロbookを入れます
Dim ws_ペーストするシート '「Dim」はDimに続く、文字を変数にするって意味、「ws_ペーストするシート」という変数を作成、まだ中身はありません
Set ws_ペーストするシート = wb_このマクロbook.Sheets("ペーストするシート") '「ws_ペーストするシート」名の変数に、このマクロbookの「ペーストするシート」名のシートを入れる
Dim wb_欲しいデータファイル '「Dim」はDimに続く、文字を変数にするって意味、「wb_欲しいデータファイル」という変数を作成、まだ中身はありません
Set wb_欲しいデータファイル = Workbooks("欲しいデータのファイル名.拡張子") '「wb_欲しいデータファイル」名の変数に、欲しいデータファイルを入れる
Dim ws_欲しいデータのシート '「Dim」はDimに続く、文字を変数にするって意味、「ws_欲しいデータのシート」という変数を作成、まだ中身はありません
Set ws_欲しいデータのシート = wb_欲しいデータファイル.Sheets(1) '「ws_欲しいデータのシート」に欲しいデータファイルのSheet1を入れる
'コピペ///////////////////////////////////////////////
ws_欲しいデータのシート.Range("A1").CurrentRegion.Copy 'CurrentRegionはショートカットキー「Ctrl+A」と同じ意味、ここで全体をコピーしている
ws_ペーストするシート.Range("A1").PasteSpecial xlPasteValues 'ペーストするシートのA1に値貼付けします「PasteSpecial Paste:=xlPasteValues」が値貼付けという意味
End Sub
13行目: 欲しいデータのファイル名.拡張子は、実際に欲しいデータのファイル名.拡張子を入れてください
コメント