CSVの読み込み方法(改)
実施したいこと
・ファイル名を指定し、形式をカンマ区切り、文字列で開く、
その際、改行コードLF、CRLF、CRいずれにも対応、
セル内の","や改行についてはカラムで区切らない。
掲示板で上記のリクエストを頂きました。
ということで、対応ロジックを書いてみました。
「CSVの読込方法」この中のVBAコードを改良したものです。
Sub CSV入力() Dim varFileName As Variant Dim objFSO As New FileSystemObject Dim inTS As TextStream Dim strRec As String Dim strSplit() As String Dim i As Long, j As Long, k As Long Dim lngQuate As Long Dim strCell As String Dim blnCrLf As Boolean varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") If varFileName = False Then Exit Sub End If Set inTS = objFSO.OpenTextFile(CStr(varFileName), ForReading) strRec = CStr(inTS.ReadAll) i = 1 'シートの1行目から出力 j = 0 '列位置はPutCellでカウントアップ lngQuate = 0 'ダブルクォーテーションの数 strCell = "" For k = 1 To Len(strRec) Select Case Mid(strRec, k, 1) Case vbLf, vbCr '「"」が偶数なら改行、奇数ならただの文字 If lngQuate Mod 2 = 0 Then blnCrLf = False If k > 1 Then '改行としてのCrLfはCrで改行判定済なので無視する If Mid(strRec, k - 1, 2) = vbCrLf Then blnCrLf = True End If End If If blnCrLf = False Then Call PutCell(i, j, strCell, lngQuate) i = i + 1 j = 0 lngQuate = 0 strCell = "" End If Else strCell = strCell & Mid(strRec, k, 1) End If Case "," '「"」が偶数なら区切り、奇数ならただの文字 If lngQuate Mod 2 = 0 Then Call PutCell(i, j, strCell, lngQuate) Else strCell = strCell & Mid(strRec, k, 1) End If Case """" '「"」のカウントをとる lngQuate = lngQuate + 1 strCell = strCell & Mid(strRec, k, 1) Case Else strCell = strCell & Mid(strRec, k, 1) End Select Next '最終列の処理 If j > 0 And strCell <> "" Then Call PutCell(i, j, strCell, lngQuate) End If Set inTS = Nothing Set objFSO = Nothing End Sub Sub PutCell(ByRef i As Long, ByRef j As Long, ByRef strCell As String, ByRef lngQuate As Long) j = j + 1 '「""」を「"」で置換 strCell = Replace(strCell, """""", """") '前後の「"」を削除 If Left(strCell, 1) = """" And Right(strCell, 1) = """" Then If Len(strCell) <= 2 Then strCell = "" Else strCell = Mid(strCell, 2, Len(strCell) - 2) End If End If Cells(i, j) = strCell strCell = "" lngQuate = 0 End Sub |
※参照設定で、「Microsoft Scripting Runtime」にチェックを付けて下さい。
CrとLfの判定部分が、ちょっとまどろっこしい感じになっちゃいました。
Crだけってデータが実際にあるのか不明なのですが、これなら、大抵は大丈夫だろうと思いますし、
いろいろなパターンが出てきても、ロジックで対応可能になります。
ただですね、Cr、Lfのの組み合わせがめちゃくちゃだったりすると、どうなるか・・・
そのようなテストデータを用意するのが大変なので・・・
こういう場合に、正しく読めなかった等があれば、報告もらえれば対応しますね。
同じテーマ「マクロVBAサンプル集」の記事
CSVの読み込み方法
CSVの読み込み方法(改の改)
CSVの出力(書き出し)方法
UTF-8でCSVの読み書き(ADODB.Stream)
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)
Excelファイルを開かずにシート名を取得
Excelファイルを開かずにシート名をチェック
新着記事 ・・・新着記事一覧を見る
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)
Colorプロパティの設定値一覧|VBA技術解説(3月12日)
APIとOLEオートメーション|MOS VBAエキスパート対策(3月11日)
エラーへの対処|MOS VBAエキスパート対策(3月10日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.定数と型宣言文字(Const)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.繰り返し処理(For Next)|ExcelマクロVBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。