tamago8610のブログ

日々の勉強を備忘録としてブログを書いています。

CSVファイルを読み込む

※注意 この記事は、投稿者が勉強用に作成している備忘録のようなものです。

メソッドやプロパティ、変数に代入されている値の説明など省略されている箇所があります。

 

 

 

 

参照設定

文字コードが、UTF-8、その他の文字コードも読み込めれるようにADOオブジェクトを使用して使った方法を扱う。

 

文字コードがあわないCSVファイルをExcelで読み込むと文字化けを起こします。

※正味、CSVファイルをExcelで観覧したいだけならExcel機能の「外部データの取り込み」で取り込んでもいい。

Microsoft ActiveX Objects バージョン番号(最新の選ぶ) Library」にチェックしてOK

 

VBAコードの流れ

 

宣言しておく変数
  • ADODB.streamオブジェクトを生成
  • CSVファイルを開く為のパスを格納する変数
  • 1行ずつ格納するための変数
  • さらに、1行ずつ格納した変数からカンマで区切った配列を代入する変数(Variant型)
  • ループするためのi変数

 

CSVファイルを開くための準備

②ファイルを開いてCSVファイルの最後の行を読み込むまで、1行ずつシートに記述するループ

③ファイルを閉じる

 

f:id:tamago8610:20210506202832p:plain

(例) CSVを読み込み、シートに記述するコード

 

Streamオブジェクトのプロパティ

Charsetプロパティ   文字コードを指定する

UTF-8”、”Shift-JIS"、"Unicode"など (※Unicodeはデフォルト)

 

LineSeparatorプロパティ   …改行コードを指定

[指定できる定数]

  • adCR (改行復帰) カーソルを左端に戻す
  • adLF(行送り) カーソルを下の行に移動する
  • adCRLF(CR + LF) 上記2つをあわせたやつ

読み込むCSVファイルの改行コードを事前に調べておく必要がある。

CSVファイルを開いて、どれになっているかを確認。

f:id:tamago8610:20210506210011p:plain

これだったら定数adLFにする

 

Openメソッド   …Streamオブジェクトを開く(ファイル操作開始)

 

LoadFromFileメソッド   …引数で指定したパスのファイルをStreamに読み込ませる

 

Closeメソッド   …Streamオブジェクトを閉じる(ファイル操作終了)

 

テキストを読み込む抜粋

Do Until adoStr.EOS

 strBuf = adoStr.ReadText(adReadLine)

 ~~~~~~~~~~~~~~~~~~

 '処理内容

Loop

※変数「adoStr」にはADODB.streamオブジェクトが入っているとしています

 

EOSプロパティ  …

 読み取りがStreamの最後(End Of Stream)に到達しているかどうかを表します。

 

ReadTextメソッド   …

 Streamオブジェクトから1行または全文を返します。

【構文】

Streamオブジェクト.ReadText(引数:NumChars)

 

【引数NumChars】

adReadAll 全文を返します。省略した場合、デフォルトはこれ。

adReadLine 1行を返します。

 

配列の要素の最大数を取得してくれるUBound関数

UBound関数で配列のなかに、いくつ要素が格納されているかわかります。

ただし、(0)、(1)、(2)... と0から配列の要素を数えるので、配列に3つの要素が入っていたとしても「2」の数値を返します。

 

そのため、上記コードの例で、

Cells(i,1).Resize(1,UBound(arrBuf) + 1).Value = affBuf

とUBound関数で返される数値に「1」を足しています。

CSVを取り込んだ時の表示形式

CSVファイルを読み込むと、数値や日付データが思い通りに読み込むことが出来なくなる時があります。

具体的には、数値「001」の値を読み込んだあと、数値をダブルクリックでセルを編集モードにし、何も値を変更しないでEnterキーを押しただけで数値の頭にあった「0」が消え「001」が「1」になってしまいます

f:id:tamago8610:20210508215044p:plain

表示形式が変わってしまう

 

それを防ぐため、以下のような記述が必要です。

 

Columns("A").NumberFormatLocal = "@"

 

ただし、日付データの場合は、NumberFormatLocalで表示形式を指定しても、表示形式は確かに変更されますが、逆にセルをダブルクリックし、編集モードにしなければ意図した表示形式で表示されません。

なので、CSVファイルを読み取るとき、日付データは、NumberFormatLocalではなく、Format関数で表示形式を設定しましょう。

 

f:id:tamago8610:20210508222941p:plain

CSVで読み込んだ日付データ