VBAで
値や書式なしコピーはどうやってやるの?
と悩んでいる方も多いと思いますが、Copyメソッドを使用すれば簡単にコピーが可能です。
ここではVBAでコピーする方法全般について、以下の内容で解説していきます!
- 【基礎】セルのコピー&ペースト(貼り付け)
- 【基礎】シートのコピー
- 【応用】ファイルのコピー
今回はVBAのコピーについて、使い方をわかりやすく解説します!
セルのコピー&ペースト(貼り付け)
セルをコピーするには、RangeオブジェクトのCopyメソッドを使います。
Copyメソッドは以下のように記述します。
Range(コピー元セル).Copy Range(コピー先セル)
コピー元、コピー先のセル範囲をRangeオブジェクトで指定します。
Excelシート:

Sub macro1()
Range("A1").Copy Range("C3")
End Sub
実行結果:

このサンプルコードでは、セル”A1”を”C3”にコピーしています。
セルの範囲を指定してコピーする
複数のセルの範囲を指定してコピーすることもできます。
コピー元のRangeオブジェクトをセルの範囲で指定して、コピー先のRangeオブジェクトはコピー先のセルの範囲の先頭を指定します。
サンプルコードで確認しましょう。
Excelシート:

Sub macro2()
Range("A1:C3").Copy Range("A5")
End Sub
実行結果:

このサンプルコードでは、セルの範囲”A1:C3”をセル範囲の先頭”A5″にコピーしています。
値のみをコピーする
値のみをコピーするなど形式を指定して貼り付けるには、PasteSpecialメソッドを使います。
PasteSpecialメソッドは以下のように記述します。
Range.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
Rangeはコピー元のセル範囲をRangeオブジェクトで指定します。
引数はいずれも省略可能です。引数については表にまとめました
| 引数 | 定数 | 説明 |
|---|---|---|
| Paste | XlPasteType | 貼り付けの形式を指定 |
| Operation | XlPasteSpecialOperation | 貼り付け時の操作を指定 |
| SkipBlanks | ー | Trueの場合、空白のセルを削除して貼り付け Falseがデフォルト値 |
| Transpose | ー | Trueの場合、行と列を入れ替え Falseがデフォルト値 |
XlPasteTypeで主に指定する定数は以下のとおりです。
| 定数 | 値 | 説明 |
|---|---|---|
| xlPasteAll | -4104 | すべて貼り付け |
| xlPasteFormats | -4122 | 形式を貼り付け |
| xlPasteFormulas | -4123 | 数式を貼り付け |
| xlPasteFormulasAndNumberFormats | 11 | 数式と数値の書式を貼り付け |
| xlPasteValues | -4163 | 値を貼り付け |
| xlPasteValuesAndNumberFormats | 12 | 値と数値の書式を貼り付け |
表に記載した内容は、よく使われると思われる項目のみの一部です。
詳細は公式サイトを参照してください。
また、XlPasteSpecialOperationで指定する定数についても、公式サイトを参照してください。
それでは、値を貼り付ける場合について確認していきましょう。
値のみを貼り付けるには、引数PasteをxlPasteValuesで指定します。
サンプルコードで確認しましょう。
Sub macro3()
Range("A1").Copy
Range("C3").PasteSpecial xlPasteValues
End Sub
実行結果:

このサンプルコードでは、セル”A1”をコピーし、セル”C3”に値だけを貼り付けています。
これとは別に簡単に値のみをコピーする方法があります。それは、RangeオブジェクトのValueプロパティを使う方法です。
サンプルコードで確認しましょう。
Sub macro3()
Range("C3").Value = Range("A1").Value
End Sub
実行結果:

書式のみをコピーする
書式のみをコピーするには、引数PasteをxlFormatsで指定します。
サンプルコードで確認しましょう。
Sub macro4()
Range("A1").Copy
Range("C3").PasteSpecial xlFormats
End Sub
実行結果:

このサンプルコードでは、セル”A1″から”C3”に書式のみをコピーしています。
なお、書式のみではコピーされているかわからないので、コピーのあとに”Hello”と記入しています。
別のシートからコピーする
別のシートからコピーするには、セル範囲の指定の前にシートを指定します。
サンプルコードで確認しましょう。
なお、あらかじめ”Sheet2”は作成しておいてください。
Sub macro5()
Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("A2")
End Sub
実行結果:

別のブックからコピーする
別のブックからコピーするには、セル範囲の指定の前にブックとシートを指定します。
サンプルコードで確認しましょう。
なお、あらかじめブックは開いておいてください。
Sub macro6()
Workbooks("Book1.xlsx").Sheets("Sheet1").Range("A1").Copy _
Workbooks("Book2.xlsx").Sheets("Sheet1").Range("A2")
End Sub
実行結果:

コピーモードを解除(クリア)する
Copyメソッドを実行して、PasteSpecialメソッドなどで貼り付けた場合、コピー元が点線の枠で囲まれ枠が点滅しているかと思います。

これはコピーモードが継続している状態です。
引き続きPasetSpecialメソッドなどを使って、別の場所に貼り付けする場合はこのままコピーモードを継続して構いませんが、貼り付けが終了したらコピーモードを解除しましょう。
コピーモードを解除するには、ApplicationオブジェクトのCutCopyModeプロパティをFalseに指定します。
サンプルコードで確認しましょう。
Sub macro7()
Range("A1").Copy
Range("C3").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
実行結果:

このサンプルコードでは、ApplicationオブジェクトのCutCopyModeプロパティをFalseに指定してますので、コピーモードが解除されコピー元のセル”A1”は点線で囲まれていません。
シートのコピー
シートをコピーするには、WorkSheetオブジェクトのCopyメソッドを使用します。
Copyメソッドは以下のように記述します。
Worksheet.Copy(Before, After)
WorkSheetはWorksheetオブジェクトを指定します。
引数Beforeは直前の位置にシートを挿入するときに、そのシートを指定します。引数Afterは直後の位置にシートを挿入するときに、そのシートを指定します。引数はいずれも省略可能です。
引数を省略した場合は新しいブックにシートをコピーします。
サンプルコードで確認しましょう。
Sub macro8()
Sheets("Sheet1").Copy After:=Sheets("Sheet1")
End Sub
実行結果:

このサンプルコードでは、シート”Sheet1″を自分の後ろにコピーしています。
シートのコピーに関しては以下で詳しく解説していますので、気になる方は見てみてくださいね!
別のブックにコピーする
別のブックにコピーする場合は、Copyメソッドの引数で指定するシートの前にブックを指定します。
サンプルコードで確認しましょう。
なお、あらかじめブックは開いておいてください。
Sub macro9()
Workbooks("Book1.xlsx").Sheets("Sheet1").Copy _
After:=Workbooks("Book2.xlsx").Sheets("Sheet1")
End Sub
実行結果:

シート名をリネームする
シートをコピーしたあとで、シート名を変更するにはWorksheetオブジェクトのNameプロパティを変更します。
Sub macro10()
Sheets("Sheet1").Copy After:=Sheets("Sheet1")
ActiveSheet.Name = "test"
End Sub
実行結果:

ファイルのコピー
ファイルをコピーするには、FileCopyステートメントを使います。
FileCopyステートメントは以下のように記述します。
FileCopy source, destination
引数のsourceはコピー元のファイルのパスを指定します。引数のdestinationはコピー先のファイルのパスを指定します。
現在開いているファイルに対して使用すると、エラーが発生します。
サンプルコードで確認しましょう。
Sub macro11()
FileCopy "C:2017 9Test.txt", "C:201710Test.txt"
End Sub
上書きでコピーする
FileCopyステートメントはすでに同名のファイルが存在する場合、上書きでコピーをします。
上書きコピーをする際に、特に何かを設定する必要はありません。
逆に上書きコピーを防止するために、Dir関数を使用して確認してからコピーすることをオススメします。
Sub macro12()
Dim rtn As Long
If Dir("C:201710Test.txt") <> "" Then
rtn = MsgBox("ファイルがすでに存在します" & vbCrLf & _
"上書きしますか?", vbYesNo)
If rtn = vbNo Then
Exit Sub
End If
End If
FileCopy "C:2017 9Test.txt", "C:201710Test.txt"
End Sub
ワイルドカードで複数のファイルをコピーする
ワイルドカードを利用して、複数のファイルをコピーするには、FileSystemObjectオブジェクトのCopyFileメソッドを使用します。
CopyFileメソッドは以下のように記述します。
FileSystemObject.CopyFile source, destination[, overwrite]
「[ ]」内は省略することが可能です。
引数のsourceはコピー元のファイルのパスを指定します。引数のsourceにはワイルドカードを利用できます。
ワイルドカードに該当するファイルが1つも存在しない場合はエラーが発生します。
また、ワイルドカードが使えるのは、ファイル名の部分に対してだけです。フォルダ名の部分に使用するとエラーになります。
引数のdestinationはコピー先のファイルのパスを指定します。
引数destinationの文字列が「」で終わる場合は、フォルダが指定されたと判断され、指定したフォルダにコピーします。
この場合、フォルダが存在しなければエラーが発生します。
コピー先に同じ名前のファイルが存在する場合、引数overwriteをTrueに指定すると上書きを行い、Falseを指定するとエラーが発生します。
引数overwriteを省略するとTrueとみなされます。
サンプルコードで確認しましょう。
Sub macro13()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile "C:2017 9*.txt", "C:201710*.txt"
End Sub
このサンプルコードでは、フォルダ”C:2017 9”に存在するtxtファイルをワイルドカードを使ってすべてフォルダ”C:201710”にコピーしています。
ファイルをリネームして移動する
Nameステートメントを使うと、ファイルを移動することができます。
Nameステートメントは以下のように記述します。
Name oldpathname As newpathname
引数のoldpathnameはコピー元のファイルのパスを指定します。引数のnewpathnameはコピー先のファイルのパスを指定します。
移動の際に、フォルダ名は同じでファイル名を変えるとリネームしたことになります。
サンプルコードで確認しましょう。
Sub macro14()
Name "C:2017 9Test.txt" As "C:2017 9Test.csv"
End Sub
コピー元のファイルを削除する
コピー元のファイルを削除するには、Killステートメントを使います。
Killステートメントは以下のように記述します。
Kill pathname
引数pathnameには、削除するファイルのパスを指定します。
サンプルコードで確認しましょう。
Sub macro15()
FileCopy "C:2017 9Test.txt", "C:201710Test.txt"
Kill "C:2017 9Test.txt"
End Sub
まとめ
ここでは、セルやシートのコピー、ファイルのコピーについて説明しました。
セルをコピーするにはRangeオブジェクトのCopyメソッドを使用します。シートをコピーするにはWorksheetオブジェクトのCopyメソッドを使用します。
また、ファイルをコピーするにはFileCopyステートメントを使用します。
いずれも使いこなすことができるように、この記事を何度も参考にして下さいね!






