ExcelマクロVBAサンプル集
CSVの読み込み方法(改)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2018-12-26

CSVの読み込み方法(改)


実施したいこと
・ファイル名を指定し、形式をカンマ区切り、文字列で開く、
 その際、改行コードLF、CRLF、CRいずれにも対応、
 セル内の","や改行についてはカラムで区切らない。


掲示板で上記のリクエストを頂きました。

ということで、対応ロジックを書いてみました。

CSVの読込方法」この中のVBAコードを改良したものです。
エクセルのVBAでのCSVの読込方法としては。・テキストファイルとして読み込む ・ワークブックとして読み込む ・クエリーテーブルを使う ・ADOを使う ・PowerQueryを使う 大別するとこのようになります。この記事を書いた当初はエクセルのVBAでCSVの読み込みについてネットで検索したところ



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 lngQuote 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でカウントアップ
  lngQuote = 0 'ダブルクォーテーションの数
  strCell = ""
  For k = 1 To Len(strRec)
    Select Case Mid(strRec, k, 1)
      Case vbLf, vbCr '「"」が偶数なら改行、奇数ならただの文字
        If lngQuote 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, lngQuote)
            i = i + 1
            j = 0
            lngQuote = 0
            strCell = ""
          End If
        Else
          strCell = strCell & Mid(strRec, k, 1)
        End If
      Case "," '「"」が偶数なら区切り、奇数ならただの文字
        If lngQuote Mod 2 = 0 Then
          Call PutCell(i, j, strCell, lngQuote)
        Else
          strCell = strCell & Mid(strRec, k, 1)
        End If
      Case """" '「"」のカウントをとる
        lngQuote = lngQuote + 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, lngQuote)
  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 lngQuote 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 = ""
  lngQuote = 0
End Sub


※参照設定で、「Microsoft Scripting Runtime」にチェックを付けて下さい。


CrとLfの判定部分が、ちょっとまどろっこしい感じになっちゃいました。

Crだけってデータが実際にあるのか不明なのですが、これなら、大抵は大丈夫だろうと思いますし、

いろいろなパターンが出てきても、ロジックで対応可能になります。

ただですね、Cr、Lfのの組み合わせがめちゃくちゃだったりすると、どうなるか・・・

そのようなテストデータを用意するのが大変なので・・・

こういう場合に、正しく読めなかった等があれば、報告もらえれば対応しますね。



同じテーマ「マクロVBAサンプル集」の記事

CSVの読み込み方法
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)
CSVの読み込み方法(ジャグ配列)
CSVの出力(書き出し)方法
UTF-8でCSVの読み書き(ADODB.Stream)
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)
Excelファイルを開かずにシート名を取得
Excelファイルを開かずにシート名をチェック


新着記事NEW ・・・新着記事一覧を見る

Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • CSVの読み込み方法(改)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ