2016
9
01

ExcelVBAでCSVファイルを2次元配列に格納してから処理する

VBAでCSVファイルをExcelへ読み込むということは結構あると思うのですが、CSVのデータを一旦2次元配列に格納しておいてからの処理という場面に遭遇したのでメモっておきます。


ご案内

こちらの記事はCSVを2次元配列に格納して処理する方法を紹介していますが、後にクラスモジュールを使ったコレクションへ格納したほうが効率がいいなと思って別記事を書きました。

どちらも同じことができますが、コードの可読性とかも結構違うので比べてみてください(・ω・)ノ

構想

こんな形のCSVファイルがあるとします。

今回欲しいのはIDと値だけなんですが、まぁこういう形だったとして。

こいつを、ExcelのこんなシートのA列のIDと照合して一致するF列にCSVの値を入れるとします。

160901-1

ただ値を入れるだけだったら、CSVファイルを1行ずつ見ていってシートのID位置を探して書き込んでおしまいなのですが、今回はCSV側に値がないものには、Excel側にはゼロを入れる処理も加えたいとします。

そうすると、一度CSVファイルを読み込んで配列に格納しておいてから、Excelシートのデータを1行ずつ見ていって、配列の中身と照合して、CSV側に値があればそれを、なければゼロをExcel側に書き込んでいく、という処理になるのかなと。

コード

解説

今回、CSVデータを格納するのに2次元配列を使います。配列名(行数, 列[項目]数)と指定するのですが、項目数はID・名称・値の3つと決まっていて、行数は毎回違うものとします。

従って、8行目でまず指定のCSVファイルの行数を取得し、9行目で配列を再定義します。配列の数はゼロからはじまるので、どちらも -1 した数です。

12~21行目で、CSVファイルを開いて配列に格納しています。15行目は、CSVファイルがカンマ区切りの例なので適宜変更してください。

24~35行で、格納した配列データをシートと照合して書き込んでいきます。Excel側のデータを1行ずつ見ていって、IDを配列の0列目と照合し、一致したら2列目の値を、なければゼロを変数valに入れておいて、最終的に33行目で指定のセルに書き込んでいます。

ご注意

28行目で、配列内のIDary(i, 0)とセル上のIDCells(n, 1)を比べているのですが、今回のような数値のみのIDだと、ary(i, 0)は文字列、Cells(n, 1)は数値という扱いになってしまって、一致しないと判断されてしまうので、CStr(Cells(n, 1))と、文字列変換して比べています。

結果

160901-2

実行すると、このようになります。

参考

ありがとうございました!

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

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


コメントを残す




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


back to top