【VBA】コピー&ペーストするには?ペーストを指定すると幅が広がります。


今回は、VBAでコピーをする方法をやってみます。普段使わないような指定方法がいろいろあるので、憶えておいて損はないですね。
<GoogleAppsScriptでのコピー&ペーストはこちら>
- VBAでコピー&ペーストをしたい人
- ペーストのいろいろな方法を知っておきたい人
- コピー以外に同じようなことをやりたい人

単純なコピーでも奥が深いんだにゃ。コピーだけではなく、ループを回して代入することもできるから考え方を憶えて欲しいんだにゃ。
コピーの方法
一番シンプルなコピー&ペースト

まずは、一番簡単なコピー&ペーストから。1行でかけちゃいます。
Sub sample()
Dim ws1, ws2 As Worksheet
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
ws1.Range("A1").CurrentRegion.copy Destination:=ws2.Cells(1, 1)
End Sub

引数の「Destination:=」は省略可能だにゃ。シンプルにコピーを実施したい場合はこれに限るにゃ。
ペースト方法の指定をする場合

次に、ペースト方法を指定する場合です。ペーストには、色々あって、普段使っている全てを選択するだけでなく、値、数式、書式などなど色々指定できます。
セル.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)

指定できる引数は4つ。基本は貼り付けを指定するPasteだけ記載すれば良いのにゃ。もし指定先との演算が必要ならOperationを指定し、そのほか細かな指定が必要なら残り2つも指定すると良いにゃ。

ペーストで指定できるのは、通常の「形式を選択して貼り付け」と同じものです。何ができるのかざっくり憶えておいて、必要に応じで調べなが使うと良いでしょう。指定できる引数の一覧は次のとおりです。
引数 | 行動 | 内容 | パラメータ |
Paste | 貼り付け | すべて | xlPasteAll |
罫線を除くすべて | xlPasteAllExceptBorders | ||
すべての統合されている条件式書式 | xlPasteAllMergingConditionalFormats | ||
コピー元のテーマを使用してすべて貼り付け | xlPasteAllUsingSourceTheme | ||
列幅 | xlPasteColumnWidths | ||
コメント | xlPasteComments | ||
書式 | xlPasteFormats | ||
数式 | xlPasteFormulas | ||
数式と数値の書式 | xlPasteFormulasAndNumberFormats | ||
入力規則 | xlPasteValidation | ||
値 | xlPasteValues | ||
値と数値の書式 | xlPasteValuesAndNumberFormats | ||
Operation | 演算 | 加算 | xlPasteSpecialOperationAdd |
乗算 | xlPasteSpecialOperationDivide | ||
除算 | xlPasteSpecialOperationMultiply | ||
減算 | xlPasteSpecialOperationSubtract | ||
しない | xlPasteSpecialOperationNone | ||
SkipBlanks | 空白のセルを無視する | True / False | |
Transpose | 行/列の入れ替え | True / False |

実際のコードは次のとおりです。
Sub sample()
Dim ws1, ws2 As Worksheet
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
ws1.Range("A1").CurrentRegion.Copy
ws2.Cells(1, 1).PasteSpecial (xlPasteAll)
Application.CutCopyMode = False
End Sub
Sub sample()
Dim ws1, ws2 As Worksheet
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
ws1.Range("A1").CurrentRegion.Copy
ws2.Cells(1, 1).PasteSpecial Paste:=xlPasteFormats
ws2.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub

もし、値と書式だけコピーしたいと思う場合、同じ場所に形式だけ指定して繰り返せば良いんだにゃ。使い方は無数にあるから、必要な時に必要な分重ねる感じだにゃ
代入という考え方

さて、最後にちょっと変わった考え方です。コピーと言ってもエクセルのコピー機能を使う必要がない場合は、セルからセルへ代入という考え方をしてみるのもありですね。
次の例では、必要部分をForループで回して、代入しています。コピーと同じように、別のシートに値が順次代入されていきます。
Sub sample()
Dim ws1, ws2 As Worksheet
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
For i = 1 To ws1.Cells(Rows.Count, 1).End(xlUp).Row
For j = 1 To ws1.Cells(1, Columns.Count).End(xlToLeft).Column
ws2.Cells(i, j) = ws1.Cells(i, j)
Next
Next
End Sub

このやり方だと、値以外は代入されないんだにゃ。でも、わざわざコピーを指定せず、値だけで済む分効率が良い場合もあるんだにゃ。いろいろなやり方を憶えて、引き出しを増やして欲しいところだにゃ。

今回はコピーの方法について見ましたが、最後の代入という考えも持っても面白いと思います。値だけとはいえ、書式を設定し直せば使えますし、場合によっては配列を使うのも面白い場合もあるかもしれませんしね。色々考えてVBAを使いこなしていきましょう!
【GAS】スプレッドシートでコピー&ペーストの実行の仕方!GASでどこまでできる?
プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。
- オンラインで選抜された現役エンジニアから学ぶことができる
- 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
- 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている

無料体験や相談もあるから、一度試してみてもいいんだにゃ!
\無料体験、無料相談はこちらから/