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

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

CSVファイル(4列あり)
CSVファイル(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コード

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

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

Sub readCsvFile()
    
    '作成予定のシート名を設定
    Const INPUT_SHEET_NAME As String = "input"

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

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

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

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

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

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

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

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行目)。
※新規ブックは自動的に閉じます。

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

PR

実行結果

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

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

参考①

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

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

PR

参考②

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

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

PR

参考③

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

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

PR

参考④

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

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

タイトルとURLをコピーしました