IT技術が進んだ現代でもCSVファイルを使う場面が多く見られます。Excelファイルなどと違って機能が少ない分シンプルで取り扱いが簡単です。同時にCSVファイルをめぐっては、色々なトラブルを見ることがあります。代表的なのはExcelで開いたときにデータが意図せず変換されてしまうというもの。Power Queryを使って開く方法もありますが、大きなファイルを開く際に時間がかかるなどの欠点があります。
それに折角読み込んだけれど、その後の処理が大変だったりしませんか?読み込んだ順番を並び替えたり、指定した行だけ読み込んだり、計算したりの処理が読み込みと同時にできると便利ですよね。
そんな時に僕がオススメするのがExcelでADODB.Connectionオブジェクト(以下、ADO。Excelに標準で搭載されている)を使った方法です。ちょっと高度になりますが、使い方が解れば便利この上ありません。簡単確実なうえに、色々な応用方法もあります。
ADOはもともとデータベースを扱う技術なのですが、CSVファイルも扱うことができます。単にファイルを読み込むことに使ってもなんら問題ありません。本書ではADOを使ってCSVファイルを簡単に開く方法をご紹介します。データベースやSQL(Structured Query Language:データベース管理システムに指示を出すための言語)の入門にもなりますよ!!皆様の日常業務のお役に立てれば幸いです。
尚、本書はExcelのVBA(Visual Basic for Applications)の以下の基本的な知識がある方を対象としています。
・基本的な制御構文、変数の使い方を理解して簡単なプログラムを書くことができる
・シート、セルの基本操作ができる
・テキストファイルの入出力操作ができる
・フォームコントロール等を使って簡単なツールを作れる
ご了承ください。
本書で使用するファイル、ツールは以下よりダウンロードできますのでご活用ください。
https://github.com/hirocom777/excelvba-ado-csv
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
CSVファイルはとても便利なデータ形式で、色々な場面で使用できます。その反面、運用時のトラブルもよく聞かれます。なかでも代表的なものが、Excelで開くと内容が誤変換されてしまうというもの。どうしてこのようなトラブルが発生してしまうのでしょうか。
CSVファイルのCSVとは、Comma Separated Value(カンマで区切られた値)の略です。テキストファイルですので、Windowsでメモ帳などのテキストエディターで開いて内容を確認できます。CSVファイルに含まれるデータは、このカンマで区切られた値のみです。機能が少ない分シンプルで取り扱いが楽なことが特徴で、現在でも多くの場面で使われています。
このように手軽に使えるCSVファイルなのですが、Wndowsの場合、デフォルトではExcelで開けるように関連付けられていることが多いようです。この場合、当然Excelを使ってCSVファイルを開くのですが、このときデータが意図せず変換されてしまうケースが見受けられます。
実際の例を見ていきましょう。以下はテキストエディターで開いた状態のCSVファイルです。ファイル名を「Test01.csv」とします。
ID,NAME,CLASS,START,COMMENT
001,Sato,1-2,2020-3,(1)
002,Yamada,2-5,2021-5,(A)
003,Tanaka,13-4,2019-12,
このCSVファイルをExcelで開いてみると、シート上に以下のように表示されました。
一番上の項目名はいいとして、まず一番左のID列。3桁の数字で表しているはずが、先頭のゼロがなくなっています。NAME列は問題ないようですが、次のCLASS列が問題です。クラス分けを表示したものらしいですが、こちらも日付表記に変換されています。それだけならいいのですが、3行目。「1-2」が「1月2日」、「2-5」が「2月5日」なのに、「13-4」が「4月13日」って何でしょうか?START列は開始の時期を年と月で表していると思うのですが、表示形式が変わってしまっています。最後のCOMMENT列は1行目の「(1)」が「-1」に変わっています。2行目の「(A)」は「(A)」のままです。
どうしてこういうことが起きるのでしょうか?
これは、Excelの標準状態でセルに値を入力した際に適用される変換です。CSVファイル内のデータをキーボードから直接Excelのセルに入力してみると、同じように変換されます。「001」と入力すると表示は「1」となり、「(1)」と入力すると表示は「-1」となります。CLASS列とSTART列も日付データとして、自動的に表記が変換さているのです。
データタブのデータの取得から読み込むと、ある程度、誤変換を防ぐことができます。手順の概要は以下の通りです。
1.データタブのデータの取得から「テキストまたはCSVから」を選択
2.ダイアログが現れるのでCSVファイルを選択
3.ビューが現れるので右下のボタンで「読込先…」を選択
4.データのインポートのウィンドウが出るので「テーブル」を選択
5.「データを返す先」を指定してOKボタンを押す
「データを返す先」で指定した場所に、以下のようにテーブル形式で表示されます。
ID列とSTART列以外は正しく読み込めています。実はもう少し手順を追加すると、正しく読み込めます。でも、この段階でもちょっと手間がかかりすぎです。それになんだか時間がかかりませんか?繰り返し使う場合はちょっと躊躇しますね。
次章では、この問題の解決方法として、ExcelVBAとADOを用いた方法をご紹介します。