Excel

CSVファイル取込で起こる問題・Line Input # ステートメントの場合

CSVファイルを読み込む場合、保存方法等で問題が起こることがあります。

保存方法の違い

文字コードを変えて保存した csvファイル です。

  • 上:ANSI
  • 下:UTF-8
csvファイル

このファイルをダブルクリックで開いた場合

文字コードの問題ではないですが、両方とも先頭が0で始まる数字は0なしで表示されます。

参考:CSVファイルを開くと0で始まるデータが0なしで表示される

  • 上:ANSI
  • 下:UTF-8
エクセルで開いたcsvファイル

UTF-8の問題点

  • 文字化け:UTF-8
  • 5列で表示されるデータだが4列で表示されている
  • データがずれている

Line Input # ステートメントでデータを配列に格納した場合の問題

次のマクロを実行した場合、UTF-8で保存したcsvファイルは問題があります。

コードの最後に「stop」を入れています。

Sub sample()      
    Dim fName As String
    Dim lastR As Long, lastC As Long
    Dim buf As String, tmp As Variant, ary() As Variant
    Dim r As Long, c As Long, i As Long, cnt As Long
  
    fName = "F:\sample\csvコンマ区切り.csv"
    lastR = CreateObject("Scripting.FileSystemObject").OpenTextFile(fName, 8).Line
    ReDim ary(lastR - 2, 4) As Variant
  
    Open fName For Input As #1
    Do Until EOF(1)
       Line Input #1, buf
       tmp = Split(buf, ",")
       For c = LBound(tmp) To UBound(tmp)
           ary(r, c) = tmp(c)
       Next c
       r = r + 1
    Loop
    Close #1 
  stop
End Sub

8行目

最終行のデータがわからない前提です。次のコードで最終行を取得します。

 lastR = CreateObject("Scripting.FileSystemObject").OpenTextFile(fName, 8).Line

9行目

4行目の「dim ary() As Variant」の動的配列のサイズ変更です。

ReDim ary(lastR - 2, 4) As Variant

ファイルの末尾は6行目の「EOF」です。配列は0からはじまるので、行数は「lastR - 2」で列数は固定という前提で「4」にしています。

CSVファイル

ANSI

ローカルウィンドウで確認すると、問題なく配列に格納されています。

ローカルウィンドウ

UTF-8

文字化けしたまま配列に格納されます。

ローカルウィンドウ

もう一つの問題は、3行目と4行目を1行として読込んでいるので、配列「ary」の大きさを超えてしまってます。

CSVファイルをエクセルで開いた

続きは後日追記予定。

-Excel
-

© 2021 オフィスのQ&A