0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Excel】選択したCSVファイルを一括で読み込むだけ

Posted at

・ログCSVを画面ぽちぽちして読み込むのが嫌すぎた
・見ればなんとなくわかるけどあまり書いたことない

やりたいこと

  • 指定したcsvファイル(複数選択可)のデータをほぼ加工なしでExcelに一括で1ファイル=1シートで取り込む
  • 値の前後に入る空白、および囲みのダブルクォートだけ削除
  • シート名称=取込CSVファイル名称
  • 極力簡潔にしたい(業務で使用する際に長いと書くのが面倒)

CSVファイル一括読み込みできた

ImportAllCSVFiles
Sub ImportAllCSVFiles()
    Dim ws As Worksheet
    Dim csvPath As Variant
    Dim csvFileName As String
    
    ' ファイルダイアログで複数のCSVファイルを選択
    csvPath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", , , , True)

    ' 選択されたファイルが配列の場合
    If IsArray(csvPath) Then
        For Each csvFile In csvPath
            csvFileName = Dir(csvFile)
            
            ' 新しいシートを作成
            Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            
            Dim qtbl As QueryTable
            
            ' CSV を開く
            Set qtbl = ws.QueryTables.Add(Connection:="TEXT;" & csvFile, Destination:=ws.Range("A1")) 
            
            With qtbl
                .TextFilePlatform = 65001        ' 文字コード(UTF-8)
                .TextFileCommaDelimiter = True   ' カンマ区切り
                .TextFileTextQualifier = xlTextQualifierDoubleQuote ' ダブルクォートをテキスト限定子として設定
                .RefreshStyle = xlOverwriteCells ' 上書き
                .Refresh                         ' 表示する
                .Delete                          ' CSVの接続を解除
            End With
            
            ' 空白文字をトリムする
            TrimSpaceCells ws
            
            ' ダブルクォートを削除する
            RemoveDoubleQuotes ws
            
            ' シート名をCSV名に設定
            ws.Name = Left$(csvFileName, InStrRev(csvFileName, ".") - 1)
        Next csvFile
    End If
End Sub

Sub TrimSpaceCells(ws As Worksheet)
    Dim rng As Range
    For Each rng In ws.UsedRange
        ' セルの値から前後の空白を取り除く
        rng.Value = Trim(rng.Value)
    Next rng
End Sub

Sub RemoveDoubleQuotes(ws As Worksheet)
    Dim rng As Range
    For Each rng In ws.UsedRange
        ' セルの値がダブルクォートで囲まれている場合のみ処理
        If Left$(rng.Value, 1) = """" And Right$(rng.Value, 1) = """" Then
            ' ダブルクォートを削除
            rng.Value = Mid$(rng.Value, 2, Len(rng.Value) - 2) 
        End If
    Next rng
End Sub

ざっくり解説

ImportAllCSVFiles

CSVファイルをインポートして、ワークブック内に新しいシートとして追加。
ファイルダイアログから複数のCSVファイルを選択させ、選択されたファイルごとに新しいシートを作成。
各シートに対してCSVファイルを読み込み、後述の処理(空白トリム、ダブルクォート削除)を行う。

RemoveDoubleQuotes

セルの値前後のダブルクォートを取り除く。

TrimSpaceCells

全てのセルから前後の空白を取り除く。(テキストでの読込時に空白が残ってしまうため)

使用した主な関数

Dir

指定したフォルダ内のファイル名やフォルダ名を取得するために使用。
引数にフォルダのパスを与えると、フォルダ内のファイル名やフォルダ名を取得可能。CSVファイルのファイル名を取得するために使用。

QueryTables.Add

データクエリの実行で外部データをワークシートに取り込むために使用。
Connectionパラメータにファイルのパスを指定、Destinationパラメータに取り込んだデータの配置場所を指定する。そのほか、テーブルスタイルの指定や元データ自動更新の設定等も可能。

Trim

文字列の前後から空白文字(スペースやタブ)を削除する。
例) ” Hello “では“Hello”という文字列に変換

参照

VBA CSV ファイルの読み込み (QueryTables.Add 関数を使う)
VBA入門:Excelのマクロを基礎から学習|エクセルの神髄


感覚的に「これ出来るよね?」と思ったことは大抵多少はどうにか出来る印象を受けました。
ただし拡張子や文字コード、データ内容によって扱いやすさにかなり差があるなとは思うので、わかりやすいところから手をつけていきたいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?