2016
10
04

ExcelVBAでクラスモジュールを活用してCSVファイルをコレクションに格納する

先日CSVファイルを2次元配列に格納するコードを書いたのですが、クラスを使うととっても便利だということがわかったのでご紹介します。


はじめに

この記事は、

こちらの内容を活用してクラスモジュールを作り、

こちらの記事でやっている「CSV→2次元配列へ格納」の処理を、「CSV→クラスを使ったコレクションへ格納」に置き換えてみよう、という内容です。コードの効率や可読性がこんなに違うんだー、というところが書けたらなと。

クラスモジュールの使い方は前述の記事でガッッツリ書いていてるので(めっちゃ長い)、まずはそちらからご覧ください。

クラスの概念はデータベースのテーブルに似ている

前述のクラスモジュールの記事で、説明にこんな図を描きました。

160914-09

Class1さんの運営する配車センターがあって、複数の荷台のついた車の手配をしてくれます。最初は看板を持って「この形の車を手配しますよー」って言っているだけなので、車はまだありません。

車を使いたいときは、Class1さんにお願いして、実際に手配してもらいます。この車を「インスタンス(実体)」と呼び、荷物を載せることができます。Class1さんに言えば、同じ形の車を何台も手配してもらえます。

Name Price Number
いちご 150 5
りんご 200 3
みかん 180 10

車に載せた荷物は、表にするとこんな感じで表せます。これを考えていて、思いました。何かに似ていないか…?

161004-2

データベースのテーブル…

161004-1

似てる!!! (( ゚д゚)ガタッ

と、業務でデータベースを扱うことの多いわたしは、自分にとってのクラスの使いどころはココなんじゃ!? と思い、早速CSVファイルをクラスを使って処理してみようと思いました。

CSVファイルをクラスを使ったCollectionへ

それではまず、こんな形のCSVファイルがあったとします。

クラスモジュール(Class1)に、プロパティ設定/取得のための記述をしましょう。

今回は特にプロパティに読み書き制限は設けませんので、Pubulic変数で簡単に書いてしまいます。CSVを格納するだけなら上の3つだけでOKなのですが、勉強も兼ねて、取得した値を計算して使う「売上」プロパティも作ってみましょう。Getプロシージャだけ(読み取り専用)のプロパティにしておきます。

SQLでも、SELECTのときに計算フィールドつくれたりしますよね。やっぱりちょっと似ている…。

次に標準モジュール(Module1)に、実際の処理を書きましょう。

せっかくクラスを使ってオブジェクト指向っぽいことをしているので、もうちょっと書き方もモダン(?)っぽく、変数の宣言と値のセットを「:」で1行にまとめちゃいました。

CSVの中身を1行ずつ見ていって要素を分割し、インスタンスを作成してそれぞれプロパティへ値を入れ、そのオブジェクトをコレクションに追加、というのをCSVの行数ぶん繰り返しています。

一応これでも動くんですが、ループ内のメインとなる10~15行目だけ見てみましょう。

objという変数でインスタンスを作って、それぞれプロパティに値を入れた後、5行目でコレクションに追加しています。このコードは同じプロシージャ内で何度もループするので、その都度きちんと破棄しないと不具合が出ますので、6行目は省略できません。

ここで、何度も出てくるobjは省略できないのかなー、と思って調べてみたら、いつもお世話になっているthomさんのブログで、With文でコレクションに追加する方法が紹介されていました。

なにこれすてき!!!

このように、クラスモジュールへ自己参照を返すプロパティを追加してやれば、

こんなふうに、インスタンス変数を作らなくてもコレクションに追加できちゃうのです。しかもこの書き方ならWithを抜けるときにインスタンスが破棄されるので、Nothingしなくていい。すごい。

追記:正しくは、「インスタンスへの参照が破棄される」でした。これに関してめちゃくちゃわかりやすい記事をthomさんが書いてくださいました!

というわけで、最終的には標準モジュールではこのようなコードに。

実行するとイミディエイトウィンドウにこのように出ます。

161004-3

2次元配列に格納していたときは、CSVファイルを開く前に中の行数を調べてその数で配列を宣言したり、取得するときには数値で指定しなければならなかったりと、比較するとやや難解です。

クラスを使ってコレクションに入れてしまえば、名称を取得したいときにはitem.Name、値段ならitem.Priceと、とってもわかりやすいですね! コードも短いですし。

以上です! 積極的にクラス使ってみたいですね。

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2016/10/04
更新日:2016/10/09


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top