【VBA】列を指定してCSVファイルを読み込む

以下のようなCSVファイル(4列あり)を…

CSVファイル(4列あり)
CSVファイル(4列あり)

列を指定して読み込むことができます!
※例えば「1列目」と「4列目」のみを読み込むことができます。

列を指定してCSVファイルを読み込んだ

CSVファイルに「0001」とある場合、
シート上も「0001」となるようにします!
※0が消えて「1」とならないようにします。

読み込む際の文字コードは
 ・UTF-8
 ・Shift_JIS
を指定できます!

ただ今回ご紹介する方法では
 ・読み込み開始セルが必ずセル「A1」から
になります…。
※読み込み開始セルの指定は不可です。

PR

前提

今回ご紹介する「VBAによる列を指定したファイルの読み込み」は、「txt」ファイルでのみできます。「csv」ファイル等ではできません。
※これは本当にイマイチです。
※VBAからPower Query(M言語)を使用すれば、CSVファイル等でもできると思います(未確認)。
※ただVBAからPower Query(M言語)の使用は、難易度が高いと思います(個人的な感想)。

よって読み込む前に「csv」ファイルを一時的に「txt」ファイルへ変更します
※ファイルの拡張子を変更します。

PR

VBAコード

ここでは例として、
 ・デスクトップ配下のCSVファイル「employee.csv」の
 ・1列目「id列」と4列目「section列」のみを
 ・シート「input」へ
 ・文字コード「UTF-8」で読み込み
をします。
※2列目「name列」と3列目「sex列」は読み込まないようにします。

CSVファイル(4列あり)
CSVファイル(4列あり) 。文字コードは「UTF-8」。
Option Explicit

Sub readCsvFile()

    Dim sheetName As String
    Dim csvFile As String
    Dim fso As Object
    Dim sheet As Worksheet
    
    '読み込むファイル(CSV)を指定
    csvFile = "C:\Users\user\Desktop\employee.csv"
    'CSVファイルを読み込むシート名を指定
    sheetName = "input"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '読み込むファイルの拡張子を「csv→txt」へ変更 ※ファイル名の末尾に「txt」を付与する
    fso.GetFile(csvFile).name = fso.GetFileName(csvFile) & ".txt"
    
    '作成予定のシートが既に存在する場合は削除
    For Each sheet In ThisWorkbook.Worksheets
        If sheet.name = sheetName Then
            '確認メッセージを非表示
            Application.DisplayAlerts = False
            'シート削除
            Worksheets(sheetName).Delete
            '確認メッセージを表示
            Application.DisplayAlerts = True
        End If
    Next
    
    '新規ブックへtxtファイルを読み込み(列指定)
    '1列目:2(文字列として読み込み)
    '2列目:9(読み込まない)
    '3列目:9(読み込まない)
    '4列目:2(文字列として読み込み)
    Workbooks.OpenText fileName:=fso.GetFile(csvFile & ".txt"), _
                       Origin:=65001, _
                       Comma:=True, _
                       FieldInfo:=Array(Array(1, 2), Array(2, 9), Array(3, 9), Array(4, 2))
                           
    '新規ブックの「txtファイルを読み込んだシート」のシート名を変更
    Workbooks.item(Workbooks.Count).Sheets(1).name = sheetName
    
    '新規ブックから「txtファイルを読み込んだシート」を移動 ※新規ブックは自動的に閉じる
    Workbooks.item(Workbooks.Count).Sheets(1).Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    
    '読み込むファイルの拡張子を「txt→csv」へ戻す
    fso.GetFile(csvFile & ".txt").name = fso.GetFileName(csvFile)
    
    '後片付け
    Set fso = Nothing
    
End Sub

「読み込むCSVファイル」を指定します(11行目)。
「CSVファイルを読み込むシート名」を指定します(13行目)。

読み込むファイルの拡張子を「csv→txt」へ変更します(18行目)。

作成予定のシートが既に存在する場合は削除します(21~30行目)。

「Workbooks」オブジェクトの「OpenText」メソッドを使用して、
 ・新規ブックへ列を指定したtxtファイルを読み込み(列指定)
をします(37~40行目)。
※ファイルを読み込む方法は複数ありますが、列を指定した読み込みができるのは「OpenText」メソッドのみです。
※「OpenText」メソッドでファイルを読み込んだ場合、新規ブックがされ、新規ブックへ読み込まれます。

文字コードを「UTF-8」とするために、
 ・「Origin」に「65001」
を指定しています(38行目)。
※Shift_JISの場合は「932」を指定します。

区切り文字を「カンマ」とするために、
 ・「Comma」に「True」
を指定しています(39行目)。
※区切り文字が「スペース」の場合は、「Space」に「True」を指定します。
※区切り文字が「カンマ、スペース」以外の場合は、「Other」や「OtherChar」を使用します。

1列目「id列」と4列目「section列」のみ読み込むように、FieldInfoに以下を指定しています(40行目)。

Array(1, 2)・・・1列目を「2(文字列として読み込み)」
Array(2, 9)・・・2列目を「9(読み込まない)」
Array(3, 9)・・・3列目を「9(読み込まない)」
Array(4, 2)・・・4列目を「2(文字列として読み込み)」
※「2(文字列として読み込み)」とすることで、「0001」の0が消えて「1」とならないようにします。

新規ブックの「txtファイルを読み込んだシート」のシート名を変更します(43行目)。

新規ブックから「txtファイルを読み込んだシート」を移動します(46行目)。
※「Worksheet」オブジェクトの「Move」メソッドにより移動します。
※シートの移動により新規ブックは自動的に閉じます。

読み込むファイルの拡張子を「txt→csv」へ戻します(49行目)。

PR

実行結果

列を指定したCSVファイルの読み込みができました。

列を指定してCSVファイルを読み込んだ
列を指定してCSVファイルを読み込んだ
PR

参考①

シート上の表(一連のセル範囲)をテーブル化することで、
 ・スタイルの設定
 ・テーブル化した範囲の名前定義
ができます。

詳細は以下の記事をご確認ください。

PR

参考②

CSVファイル読み込みにより作成された表のデータの並び替え(ソート)もできます。

詳細は以下の記事をご確認ください。

PR

参考③

もちろん普通にCSVファイルを読み込むこともできます。

詳細は以下の記事をご確認ください。

PR

参考④

CSVファイルの読み込み後、不要なデータを削除したほうが良いかもしれません。

オートフィルタを使用して不要なデータを削除できます。

詳細は以下の記事をご確認ください。


PR

参考⑤

シートへ読み込んだデータを、配列へ格納することもできます。

詳細は以下の記事をご確認ください。


PR

参考⑥

上記のVBAコードで使用した以下の詳細は、公式サイトをご確認ください。

●「Workbooks」オブジェクトの「OpenText」メソッド


「Worksheet」オブジェクトの「Move」メソッド