VBAでセル・シート・ファイルをコピー(値、書式のみも解説)

VBAで

セルやシート、ブックをコピーするにはどうすればいいの?
値や書式なしコピーはどうやってやるの?

と悩んでいる方も多いと思いますが、Copyメソッドを使用すれば簡単にコピーが可能です。

ここではVBAでコピーする方法全般について、以下の内容で解説していきます!

  • 【基礎】セルのコピー&ペースト(貼り付け)
  • 【基礎】シートのコピー
  • 【応用】ファイルのコピー

今回はVBAのコピーについて、使い方をわかりやすく解説します!

セルのコピー&ペースト(貼り付け)

セルをコピーするには、RangeオブジェクトのCopyメソッドを使います。

Copyメソッドは以下のように記述します。

Range(コピー元セル).Copy Range(コピー先セル)

コピー元、コピー先のセル範囲をRangeオブジェクトで指定します。

Excelシート:
Copy01

Sub macro1()
    Range("A1").Copy Range("C3")
End Sub

実行結果:
Copy02

このサンプルコードでは、セル”A1”を”C3”にコピーしています。

セルの範囲を指定してコピーする

複数のセルの範囲を指定してコピーすることもできます。

コピー元のRangeオブジェクトをセルの範囲で指定して、コピー先のRangeオブジェクトはコピー先のセルの範囲の先頭を指定します。

サンプルコードで確認しましょう。

Excelシート:
Copy03

Sub macro2()
    Range("A1:C3").Copy Range("A5")
End Sub

実行結果:
Copy04

このサンプルコードでは、セルの範囲”A1:C3”をセル範囲の先頭"A5"にコピーしています。

値のみをコピーする

値のみをコピーするなど形式を指定して貼り付けるには、PasteSpecialメソッドを使います。

PasteSpecialメソッドは以下のように記述します。

Range.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)

Rangeはコピー元のセル範囲をRangeオブジェクトで指定します。

引数はいずれも省略可能です。引数については表にまとめました

引数定数説明
PasteXlPasteType貼り付けの形式を指定
OperationXlPasteSpecialOperation貼り付け時の操作を指定
SkipBlanksTrueの場合、空白のセルを削除して貼り付け
Falseがデフォルト値
TransposeTrueの場合、行と列を入れ替え
Falseがデフォルト値

XlPasteTypeで主に指定する定数は以下のとおりです。

定数説明
xlPasteAll-4104すべて貼り付け
xlPasteFormats-4122形式を貼り付け
xlPasteFormulas-4123数式を貼り付け
xlPasteFormulasAndNumberFormats11数式と数値の書式を貼り付け
xlPasteValues-4163値を貼り付け
xlPasteValuesAndNumberFormats12値と数値の書式を貼り付け

表に記載した内容は、よく使われると思われる項目のみの一部です。

詳細は公式サイトを参照してください。

また、XlPasteSpecialOperationで指定する定数についても、公式サイトを参照してください。

それでは、値を貼り付ける場合について確認していきましょう。

値のみを貼り付けるには、引数PasteをxlPasteValuesで指定します。

サンプルコードで確認しましょう。

Sub macro3()
    Range("A1").Copy
    Range("C3").PasteSpecial xlPasteValues
End Sub

実行結果:
Copy05

このサンプルコードでは、セル”A1”をコピーし、セル”C3”に値だけを貼り付けています。

これとは別に簡単に値のみをコピーする方法があります。それは、RangeオブジェクトのValueプロパティを使う方法です。

サンプルコードで確認しましょう。

Sub macro3()
    Range("C3").Value = Range("A1").Value
End Sub

実行結果:
Copy05

書式のみをコピーする

書式のみをコピーするには、引数PasteをxlFormatsで指定します。

サンプルコードで確認しましょう。

Sub macro4()
    Range("A1").Copy
    Range("C3").PasteSpecial xlFormats
End Sub

実行結果:
Copy06

このサンプルコードでは、セル"A1"から”C3”に書式のみをコピーしています。

なお、書式のみではコピーされているかわからないので、コピーのあとに"Hello”と記入しています。

別のシートからコピーする

別のシートからコピーするには、セル範囲の指定の前にシートを指定します。

サンプルコードで確認しましょう。

なお、あらかじめ"Sheet2”は作成しておいてください。

Sub macro5()
    Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("A2")
End Sub

実行結果:
Copy07

別のブックからコピーする

別のブックからコピーするには、セル範囲の指定の前にブックとシートを指定します。

サンプルコードで確認しましょう。

なお、あらかじめブックは開いておいてください。

Sub macro6()
    Workbooks("Book1.xlsx").Sheets("Sheet1").Range("A1").Copy _
    Workbooks("Book2.xlsx").Sheets("Sheet1").Range("A2")
End Sub

実行結果:
Copy08

コピーモードを解除(クリア)する

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

Copy05

これはコピーモードが継続している状態です。

引き続きPasetSpecialメソッドなどを使って、別の場所に貼り付けする場合はこのままコピーモードを継続して構いませんが、貼り付けが終了したらコピーモードを解除しましょう。

コピーモードを解除するには、ApplicationオブジェクトのCutCopyModeプロパティをFalseに指定します。

サンプルコードで確認しましょう。

Sub macro7()
    Range("A1").Copy
    Range("C3").PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub

実行結果:
Copy09

このサンプルコードでは、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

実行結果:
Copy10

このサンプルコードでは、シート"Sheet1"を自分の後ろにコピーしています。

シートのコピーに関しては以下で詳しく解説していますので、気になる方は見てみてくださいね!

【VBA入門】シートのコピーと移動(複数コピーや名前の変更も解説)
更新日 : 2019年3月29日

別のブックにコピーする

別のブックにコピーする場合は、Copyメソッドの引数で指定するシートの前にブックを指定します。

サンプルコードで確認しましょう。

なお、あらかじめブックは開いておいてください。

Sub macro9()
    Workbooks("Book1.xlsx").Sheets("Sheet1").Copy _
    After:=Workbooks("Book2.xlsx").Sheets("Sheet1")
End Sub

実行結果:
Copy10

シート名をリネームする

シートをコピーしたあとで、シート名を変更するにはWorksheetオブジェクトのNameプロパティを変更します。

Sub macro10()
    Sheets("Sheet1").Copy After:=Sheets("Sheet1")
    ActiveSheet.Name = "test"
End Sub

実行結果:
Copy11

ファイルのコピー

ファイルをコピーするには、FileCopyステートメントを使います。

FileCopyステートメントは以下のように記述します。

FileCopy source, destination

引数のsourceはコピー元のファイルのパスを指定します。引数のdestinationはコピー先のファイルのパスを指定します。

現在開いているファイルに対して使用すると、エラーが発生します。

サンプルコードで確認しましょう。

Sub macro11()
    FileCopy "C:\2017\09\Test.txt", "C:\2017\10\Test.txt"
End Sub

上書きでコピーする

FileCopyステートメントはすでに同名のファイルが存在する場合、上書きでコピーをします。

上書きコピーをする際に、特に何かを設定する必要はありません。

逆に上書きコピーを防止するために、Dir関数を使用して確認してからコピーすることをオススメします。

Sub macro12()
    Dim rtn As Long
    
    If Dir("C:\2017\10\Test.txt") <> "" Then
        rtn = MsgBox("ファイルがすでに存在します" & vbCrLf & _
                    "上書きしますか?", vbYesNo)
        If rtn = vbNo Then
            Exit Sub
        End If
    End If
    
    FileCopy "C:\2017\09\Test.txt", "C:\2017\10\Test.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\09\*.txt", "C:\2017\10\*.txt"
End Sub

このサンプルコードでは、フォルダ”C:\2017\09”に存在するtxtファイルをワイルドカードを使ってすべてフォルダ”C:\2017\10”にコピーしています。

ファイルをリネームして移動する

Nameステートメントを使うと、ファイルを移動することができます。

Nameステートメントは以下のように記述します。

Name oldpathname As newpathname

引数のoldpathnameはコピー元のファイルのパスを指定します。引数のnewpathnameはコピー先のファイルのパスを指定します。

移動の際に、フォルダ名は同じでファイル名を変えるとリネームしたことになります。

サンプルコードで確認しましょう。

Sub macro14()
    Name "C:\2017\09\Test.txt" As "C:\2017\09\Test.csv"
End Sub

コピー元のファイルを削除する

コピー元のファイルを削除するには、Killステートメントを使います。

Killステートメントは以下のように記述します。

Kill pathname

引数pathnameには、削除するファイルのパスを指定します。

サンプルコードで確認しましょう。

Sub macro15()
    FileCopy "C:\2017\09\Test.txt", "C:\2017\10\Test.txt"
    Kill "C:\2017\09\Test.txt"
End Sub

まとめ

ここでは、セルやシートのコピー、ファイルのコピーについて説明しました。

セルをコピーするにはRangeオブジェクトのCopyメソッドを使用します。シートをコピーするにはWorksheetオブジェクトのCopyメソッドを使用します。

また、ファイルをコピーするにはFileCopyステートメントを使用します。

いずれも使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説