ExcelのVBAを使っていて、他のCSVファイルやエクセルファイルのデータを読込んで操作したいことがあります。
この記事では、CSVファイルを開いてシートのデータをコピーして保存する方法を2つご紹介します。


シートをコピーしてシート名を変更する
既存のエクセルにCSVデータのシートごとコピーする方法について紹介します。
Sub データ読込_シートコピー()
Dim MyBookName As String
Dim MySheet As Worksheet
Dim CopyBookName As String
Dim FName As String
Dim CopySheetName As String
'動作非表示
Application.ScreenUpdating = False
'このブック名保存
MyBookName = Application.ThisWorkbook.Name
'初期フォルダをブックと同じフォルダを指定
ChDir ThisWorkbook.Path
'ファイル指定のダイアログを開く
FName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", Title:="読込みたいCSVファイルを選択して下さい。")
'キャンセルを押された場合、メッセージを表示して抜ける
If FName = "False" Then
MsgBox "ファイルが選択されていないため終了します。"
End
End If
'ファイルを開き、ブック名とシート名を保存
Workbooks.Open FName
CopyBookName = ActiveWorkbook.Name
CopySheetName = ActiveSheet.Name
'ブック名を確認し、違う場合はメッセージを表示してファイルを閉じる
If Not CopyBookName Like "CSV*" Then
MsgBox "対象のcsvファイルではありません。"
ActiveWorkbook.Close 'アクティブブックを閉じる
End
End If
'既存のブックのCSVシートを削除
Workbooks(MyBookName).Activate '既存ブックをアクティブ
For Each MySheet In Worksheets '既存ブックのシートに対して繰り返す
If MySheet.Name Like "CSV*" Then 'CSVの名前を含むシートを削除
Application.DisplayAlerts = False '警告非表示
MySheet.Delete
End If
Next
'CSVシートをコピーして名前を変更
'データを読込むシートを初期化し、データをコピーする
Workbooks(CopyBookName).Sheets(CopySheetName).Copy After:=Workbooks(MyBookName).Sheets("メイン")
ActiveSheet.Name = "CSVデータ"
'CSVファイルを閉じる
Workbooks(CopyBookName).Close
MsgBox ("データを読み込みました。")
End Sub
少しコードが長くなっていますが、コードをコピーして一部を変更してもらえばそのまま使えるように作成しました。
全体の流れとしては、次の通りです。
- 読込みたいCSVファイルをGetOpenFilenameで指定
- 指定したファイルを開く
- 既存のCSVデータのシートを削除
- CSVシートをコピー
- 読込んだファイルを閉じる
キャンセルが押された場合のエラー回避として、22~25行に「If FName = “False” Then・・・」を記述しています。
違うファイルが選択された場合の対策として、33~37行に「If Not CopyBookName Like “CSV*” Then・・・」を記述しています。
既存のExcel(ブック)に読み込むCSVシート名が重複しないよう、コピーする前に、40~46行目に既存のExcelからシートを削除するコードを記述しています。
詳細についてはコメントに記載している通りです。
シートのデータのみをコピーする
次は、CSVデータのシートのデータ(中身)をコピーして既存の読込専用シートに貼り付ける方法について紹介します。
Sub データ読込_データコピー()
Dim MyBookName As String
Dim CopyBookName As String
Dim FName As String
Dim CopySheetName As String
Dim PastePnt As Range
Dim CopyAr As Range
'動作非表示
Application.ScreenUpdating = False
'このブック名保存
MyBookName = Application.ThisWorkbook.Name
'初期フォルダをブックと同じフォルダを指定
ChDir ThisWorkbook.Path
'ファイル指定のダイアログを開く
FName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", Title:="読込みたいCSVファイルを選択して下さい。")
'キャンセルを押された場合、メッセージを表示して抜ける
If FName = "False" Then
MsgBox "ファイルが選択されていないため終了します。"
End
End If
'ファイルを開き、ブック名とシート名を保存
Workbooks.Open FName
CopyBookName = ActiveWorkbook.Name
CopySheetName = ActiveSheet.Name
'ブック名を確認し、違う場合はメッセージを表示してファイルを閉じる
If Not CopyBookName Like "CSV*" Then
MsgBox "対象のcsvファイルではありません。"
ActiveWorkbook.Close 'アクティブブックを閉じる
End
End If
'データを読込むシートを初期化し、データをコピーする
Workbooks(MyBookName).Sheets("CSVデータ").UsedRange.ClearContents 'CSVデータシート初期化
Set PastePnt = Workbooks(MyBookName).Sheets("CSVデータ").[A1] '貼り付け先セット
Set CopyAr = Workbooks(CopyBookName).Sheets(CopySheetName).UsedRange 'コピー元セット
CopyAr.Copy PastePnt 'コピーして貼り付け
ActiveWorkbook.Close 'アクティブブック(開いたブック)を閉じる
'メインシート選択
Workbooks(MyBookName).Sheets("メイン").Activate
MsgBox ("データを読み込みました。")
End Sub
こちらもコードが長くなっていますが、コードをコピーして一部を変更してもらえばそのまま使えるように作成しました。
全体の流れとしては、次の通りです。
- 読込みたいCSVファイルをGetOpenFilenameで指定
- 指定したファイルを開く
- データを消して、コピー元と貼り付け先を設定する
- コピーして貼り付ける
- 読込んだファイルを閉じる
エラー対策については、シートコピーと同じになります。
詳細についてはコメントに記載している通りです。
シートコピーとデータコピーの違い
CSVファイルをコピーして保存するだけであれば大きく違いはありませんが、シートコピー(シートをそのままコピーする場合)とデータコピー(シートのデータをコピーする場合)には次のような違いがあります。
シートコピーのメリット
シートをそのままコピーすることができるため、行の高さや列幅、セルの書式設定、関数などもそのままコピーできます。
関数は、対象のシート外のセルを参照しているとエラーが出ることがありますのでご注意ください。
データコピーのメリット
シートのデータのみをコピーするため、読込専用シートの行の高さや列幅を保持したままコピーすることができます。
また、貼り付けする際にPasteSpecialメソッドを使えば、セルの書式設定などを維持したままデータの値のみをコピーするといったことできます。

CSVファイルは、数値や文字列のデータのみがほとんどだと思うので、データコピーのほうがおすすめです。
まとめ
この記事では、CSVファイルを読み込んでデータをコピーする方法について2つご紹介しました。
コードをコピペして一部を修正すれば実務でそのまま使えるよう、エラー対策や既存シートを確認して削除するコードなど、色々盛り込んでいます。そのため、コードが長くなり少し難しく感じるかもしれませんが、ひとつひとつをわけて考えれば、理解できるかと思います。
CSVファイルの読込は、使える場面が多いので、ぜひこの記事の内容を参考にして活用してみて下さい。
コメント