【Excel VBA】CSVファイルを読み込んでシートにコピーする2つの方法を紹介

ExcelのVBAを使っていて、他のCSVファイルやエクセルファイルのデータを読込んで操作したいことがあります。

この記事では、CSVファイルを開いてシートのデータをコピーして保存する方法を2つご紹介します。

CSVファイル読込後イメージ
目次

シートをコピーしてシート名を変更する

既存のエクセルに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ファイルの読込は、使える場面が多いので、ぜひこの記事の内容を参考にして活用してみて下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次