【解析屋さんのためのExcelVBA(4)】複数CSVファイルを文字列として正しく読込む(+ひとつのブックにまとめる)
Category:ComputerScience
はやし@color_chipsです。
ExcelVBAの記事から、ご質問をいただきました。
この記事↓
今回は、ExcelでCSVファイルを読み込む際に起きてしまう文字化け(書式の自動書き換え、自動演算)を防ぐ方法です。
経緯
ツイッターでご意見頂きました。
@color_chips 初めましてブログから飛んできました。解析屋さんのためのExcelVBA(2)を見てサンプルを使わせていただいています。こちらなんですが、シート作成時に全て文字列として読み込むにはどうしたら良いでしょうか。電話番号が含まれるため、教えて頂けると助かります。
— 瀧沢 竜作@Lineスタンプ2個審査中 (@R_T_0317) 2015, 5月 13
ありがとうございます。
読み込むcsvデータを、文字列として読み込む場合、どのようにしたら良いのでしょう?とのことでした。
@color_chips ただ、住所が都道府県、都市区、町以下に分かれているため、町以下の列に番地以下のみで取り込まれたデータ(1-8-26)が年月日(2026/1/8)と認識されてしまうようで、やはり文字列での取り込みが必要なようです。面倒な内容で申し訳ないですm(_ _)m
— 瀧沢 竜作@Lineスタンプ2個審査中 (@R_T_0317) 2015, 5月 19
色々調べたら、小技で回避できるかもと思いましたが、やっぱり文字列での取り込みできると良さそうなので、
ちょっと調べてみてその方法がわかりましたので、ご回答。
(ツイートの掲載許可ありがとうございます。)
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