【解析屋さんのためのExcelVBA(4)】複数CSVファイルを文字列として正しく読込む(+ひとつのブックにまとめる)

はやし@color_chipsです。
ExcelVBAの記事から、ご質問をいただきました。
この記事↓

【解析屋さんのためのExcelVBA(2)】複数のデータファイル(csv)をひとつのExcelブックに読み込む:ComputerScience - color pencils
せっかくコンピューターをつかっているのだから、コンピューターを使うことの恩恵を十分に受けましょう。 というわけで、そんなたくさんのデータを扱うのに便利なExcel VBAサンプルです。 ...

今回は、ExcelでCSVファイルを読み込む際に起きてしまう文字化け(書式の自動書き換え、自動演算)を防ぐ方法です。

経緯

ツイッターでご意見頂きました。

ありがとうございます。
読み込むcsvデータを、文字列として読み込む場合、どのようにしたら良いのでしょう?とのことでした。

色々調べたら、小技で回避できるかもと思いましたが、やっぱり文字列での取り込みできると良さそうなので、
ちょっと調べてみてその方法がわかりましたので、ご回答。
(ツイートの掲載許可ありがとうございます。)

ExcelでCSVデータを読むときの弊害

csvデータとして読み込む場合、そのデータの内容によっては、EXCELが勝手に演算して内容が変わってしまったり、
書式を勝手に判断して設定してしまう
といったことが起きます。
例えば、4371-4のような文字列は、演算され4367となってしまいます。
01234というデータは、はじめの0が切り捨てられ、1234となってしまいます。
Excelの仕様で仕方ないといえば仕方ないのですが、(ExcelはCSVを読むためのツールではない)ちょっとどうにかしたいですね。

1ファイルだけであれば、インポートする方法があるようです。
ExcelでCSVファイルを簡単にインポートする方法 - SO NOTE そうのて (;^ω^)

ですが、たくさんファイルが在ると、やはりめんどくさい。
なのでVBAの出番です。

ソースコード


Option Expricit
' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
' [[                                                        ]]
' [[ 複数CSVファイル読込(内容を文字列として読込)           ]]
' [[                                                        ]]
' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Sub ReadMultiCSVFilesAsText()
    ' [[ 変数定義 ]]
    Dim varFileName As Variant
    Dim CSVWorkSheet As Worksheet
    Dim NewWorkSheet As Worksheet
    Dim SheetName As String

    ' [[ コピー範囲の変数 ]]
    Dim R1 As Integer
    Dim R2 As Integer
    Dim C1 As Integer
    Dim C2 As Integer

    ' [[ 複数ファイルパス名を取得 ]]
    varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                        Title:="CSVファイルの選択", MultiSelect:=True)

    ' [[ ファイルパス取得できなかったら ]]
    If IsArray(varFileName) = False Then
        Exit Sub
    End If

    ' [[ ファイルパス取得できたら ]]
    For Each FileName In varFileName
        Set CSVWorkSheet = OpenCSVAsText2WorkSheet(FileName)
    Next

End Sub

' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
' [[                                                                            ]]
' [[ ワークシート名を指定したワークシートの作成                                 ]]
' [[                                                                            ]]
' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Function CreateWorkSheet(WorkSheetName As String) As Worksheet

    ' 変数定義
    Dim NewWorkSheet As Worksheet
    Dim iCheckSameName As Integer

    ' ワークシートの作成
    ' ※一番最後に挿入
    Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))

    ' 同じ名前ワークシートが無いか確認
    iCheckSameName = 0
    For Each WS In Sheets
     If WS.Name = WorkSheetName Then
       MsgBox "ワークシート名:" + WorkSheetName + " この名前は既に使われています。"
       iCheckSameName = 1
     End If
    Next

    '同じ名前のワークシートがなければ
    If iCheckSameName = 0 Then
        NewWorkSheet.Name = WorkSheetName
        Set CreateWorkSheet = NewWorkSheet
    End If

End Function

' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
' [[                                                                            ]]
' [[ CSVファイルをテキストとして読み込み新しいワークシート作成                  ]]
' [[                                                                            ]]
' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Function OpenCSVAsText2WorkSheet(FileName As Variant) As Worksheet
    Dim sBuf As String
    Dim Data As Variant
    Dim Count As Integer
    Dim r As Integer
    Dim NewWorkSheet As Worksheet

    Open FileName For Input As #1

    ' [[ ファイル名で新しいシート作成 ]]
    Set NewWorkSheet = CreateWorkSheet(Dir(FileName))

    ' [[ EOFまでファイル読み込み ]]
    ' [[ ※改行コードがCRLFでないと正常に動きません ]]
    r = 0
    Do Until EOF(1)
        Line Input #1, sBuf
        Data = Split(sBuf, ",") 'カンマ区切り
        Count = UBound(Data)+1 'データ数取得
        r = r + 1
       'ワークシートにデータのコピー
        For i = 1 To Count
           With Cells(r, i)
                .NumberFormat = "@" '文字列指定
                .Value = Data(i-1)     'データ入力
           End With
        Next
    Loop
    Close #1

    ' [[ 返り値 ]]
    Set OpenCSVAsText2WorkSheet = NewWorkSheet
End Function

使い方

【解析屋さんのためのExcelVBA(2)】複数のデータファイル(csv)をひとつのExcelブックに読み込む:ComputerScience - color pencils
上記リンクとほぼ同じです。マクロ実行後出てくるファイルエクスプローラーで取り込みたいファイルを選んでください(複数選択可能)。
実行するマクロ名は「ReadMultiCSVFilesAsText」です。

注意事項

csvをテキストファイルとして読み込んで、1セルずつ読み込んでいるので、データ数によっては時間がかかるかもしれません。
読み込むファイルの改行コードは、CR+LFでお願いします。
LFの場合は未対応(後日対応したいと思います)

ご意見、「もっとこうしたらいい」とか、「動かん!」とかありましたら、@color_chipsまでご一報ください!

参考資料

参考にさせていただきました。
CSVファイルを読み込む:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

関連記事