VBAでのCSVの扱い方まとめ
マクロVBAでCSVの読み書きする方法はいくつもあり、当サイトでも複数のページでそれぞれVBAコードを掲載しています。
順次記事を掲載しているので、それぞれどのような特徴があるかが良く分からなくなってしまっているようです。
そこで、CSVに関するページをまとめておきました。
本サイトにあるCSV関連記事一覧
※ほとんどの記事でUTF-8に対応しています。
以下で簡単に内容を紹介します。
CSVの読込方法
内容を紹介
・テキストファイルとして読み込む
・ワークブックとして読み込む
・クエリーテーブルを使う
・ADOを使う
・Power Queryを使う
大別するとこのようになります。
このページでは、以下について解説及びVBAコードを掲載しています。
もっとも簡単かつ良くあるCSV読み込みVBAコード
「,」「"」に対応したCSV読み込みVBAコード
CSVをExcelブックとして開くVBA
クエリーテーブルを使ったCSV読み込みVBAコード
CSVの読み込み方法(改)
内容を紹介
これに対して、以下の要望を受けて対応をしたVBAになります。
・ファイル名を指定し、形式をカンマ区切り、文字列で開く
・その際、改行コードLF、CRLF、CRいずれにも対応
・セル内の","や改行についてはカラムで区切らない
CSVの読み込み方法(改の改)
内容を紹介
CSVの形式について
タブ区切り
UTF-8
Unicode
Unicode big endian
結果として、上記の区切り文字と文字コードの組み合わせが存在することになります。
全ての組み合わせで処理可能なVBAコードを作ることが目的です。
UTF-8でCSVの読み書き(ADODB.Stream)
テキストの文字コードを判定を加えたものです。
CSV読み込みVBAコード
配列を使ってシートにまとめて出力する場合
QueryTablesを使ったCSV読み込みVBAコード
CSVの読み込み方法(ジャグ配列)
内容を紹介
以下の予告をもとに作成したVBAコードを公開したページになります。
上記のマクロVBAでは、1フィールドごとにセルに出力しています。
これは明らかに処理速度が遅くなってしまいます。
(数万件くらいまでなら、そもそもそんなに時間もかかりませんが)
ここは、一旦配列に入れておいて、最後にまとめてシートに出力したいところです。
なのですが、
世の中には、お行儀のよいCSVばかりではありません。
行によって列数(つまりカンマの区切り数)が不定となっているようなものもあったりします。
先頭行は10列ではじまっているのに、途中から12列になっていたりという事です。
このようなCSVにおいては列数を事前に決められない為、配列を用意するのが難しくなります。
これらに対応するには、列数を多めにとった配列を用意するか、
一旦ジャグ配列(要素も配列である配列)として確保して、最後に2次元配列に入れ直してからシートに出力する等の工夫が必要です。
・列数が決まっていれば、その列数で配列を用意
・列数不明の時は、1行目の列数取得後に配列を用意
・列数不定の場合は、ジャグ配列で処理
以上のどれかで対応することになります。
下に行くにしたがって、VBAの難易度は上がっていきます。
上記VBAの主な変更点は、
・CsvInTextで配列を用意
・PutCellの
ws.Cells(i, j) = strCell
このws.Cells(i, j)を配列に変更
固定列数であれば、そんなに多くの修正は必要ないと思います。
配列の行数は最初は少し大きめに確保しておいて、行数が足らなくなったらRedim Preserveで確保すれば良いでしょう。
このような面倒な処理の必要性がないのは、シートのセルを直接利用する最大の利点ともいえます。
興味のある方は、ぜひ配列化にチャレンジしてみてください。
要望があり機会があれば、当サイトでも公開しようと思います。
CSVの読み込み方法(ジャグ配列)(改)
内容を紹介
そこで、
文字コードの判定を全て完璧に行うのは無理ですが、簡易的にでもUTF-8Nを判定したいところです。
そこで、きわめて簡易的ではありますが、これに対応するVBAを書いてみました。
また、使うにあたって参照設定が面倒な場合もあるので、参照設定せずにCreateObjectに変更しています。
SHIFT_JISで使われていてUTF-8で使われていないと思われる文字コードの範囲を判定しています。
つまり、SHIFT_JISと判定できる場合以外は、UTF-8という事にしています。
CSVの出力(書き出し)方法
まずは、エクセルの機能をそのまま利用します。
他システム、特にDB等へアップロードする場合には、このままでは出来ない事があるのです。
例えば、日付は、表示形式のままの文字列で出力されてしまいます。
また数値もカンマ付の場合は、"12,345"のように、文字列として出力されます。
CSV出力前に、当該シートの書式を全て直してから行えばよいのですが、
書式の変更も面倒なら、また元に戻す必要があり、何かと不都合です。
このような場合は、直接CSVを出力するようにします。
行列がでこぼこに入力されている場合でも、正しく最終判定をする為に使用しています。
通常の一覧なら、End(xlUp)等でも良いでしょう。
FileSystemObjectを使用していますが、昔からある、
Open ファイル For Output As #1
でも良いです。
UTF-8でCSVの読み書き(ADODB.Stream)
内容を紹介
アクティブシートの内容をUTF-8でCSV出力します。
※本記事を掲載後に、BOM無しのUTF8(UTF8N)でCSVを作成することがありましたので追記します。
このようにすることで、BOM無し(UTF8N)でCSVを作成できます。
UTF-8のCSVを行単位で読込、アクティブシーヘ書き出しています。
Close メソッドを使って、Stream を閉じます。
Write メソッドまたは WriteText メソッドを使って、バイトまたはテキストを Stream に入力します。
Read メソッドまたは ReadText メソッドを使って、Stream からバイトを読み取ります。
Flush メソッドを使って、ADO バッファにある Stream データを基になるオブジェクトに書き込みます。
CopyTo メソッドを使って、Stream の内容を別の Stream にコピーします。
SkipLine メソッドおよび LineSeparator プロパティを使って、ソース ファイルから行を読み取る方法を制御します。
EOS プロパティおよび SetEOS メソッドを使って、ストリーム位置の末尾を設定します。
SaveToFile メソッドおよび LoadFromFile メソッドを使って、ファイル内のデータを保存および復元します。
Charset プロパティを使って、Stream の保存に使う文字セットを指定します。
Cancel メソッドを使って、非同期 Stream 操作を停止します。
Size プロパティを使って、Stream 内のバイト数を設定します。
Position プロパティを使って、Stream 内の現在の位置を制御します。
Type プロパティを使って、Stream 内のデータ型を設定します。
State プロパティを使って、Stream の現在の状態 (開いている、閉じている、または実行中) を設定します。
Mode プロパティを使って、Stream のアクセス モードを指定します。
ADOでCSVの読み込み(SQL)
内容を紹介
ADOではSQL文が必要になりますが、
ここではSQL文の詳細については説明を省略します。
エクセルのブックと同一フォルダにある「TESTCSV.csv」を読み込み、
シート「CSV」に貼り付けています。
同じテーマ「マクロVBAサンプル集」の記事
VBAでのCSVの扱い方まとめ
CSVの読み込み方法
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)
CSVの読み込み方法(ジャグ配列)
CSVの読み込み方法(ジャグ配列)(改)
CSVの出力(書き出し)方法
UTF-8でCSVの読み書き(ADODB.Stream)
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- VBAでのCSVの扱い方まとめ
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。