・ログCSVを画面ぽちぽちして読み込むのが嫌すぎた
・見ればなんとなくわかるけどあまり書いたことない
やりたいこと
- 指定したcsvファイル(複数選択可)のデータをほぼ加工なしでExcelに一括で1ファイル=1シートで取り込む
- 値の前後に入る空白、および囲みのダブルクォートだけ削除
- シート名称=取込CSVファイル名称
- 極力簡潔にしたい(業務で使用する際に長いと書くのが面倒)
CSVファイル一括読み込みできた
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のマクロを基礎から学習|エクセルの神髄
感覚的に「これ出来るよね?」と思ったことは大抵多少はどうにか出来る印象を受けました。
ただし拡張子や文字コード、データ内容によって扱いやすさにかなり差があるなとは思うので、わかりやすいところから手をつけていきたいですね。