2017年3月18日土曜日

エクセルVBAマクロ 外部ファイルのデータ読み込み


仕事で久しぶりにマクロをいじった
やはりプログラミングは楽しい

現在施設関係の仕事をしていて、膨大な施設から回収したデータの処理が必要になった
データはエクセルファイル形式で提出されていて、まずは集計が必要
手作業できる数ではないので、マクロを組んで一覧にするのが目的

方法はいろいろあるんだろうけど、先人の作成したマクロがあって、その設計は
①対象ファイル列挙
②列挙ファイルを一つずつOpen
③データ領域コピーして集計ファイルにペースト
④ファイルCloseして次のファイル
って感じ

ちょっと使いづらいところもあるので工夫したうえで、私がやりたかったのは
列挙ファイルをOpenしないでデータを直接ファイルから読み取ること
いろいろ調べてみると方法は二種類あった

1 セルにリンク式を書き込む
='ファイルパス[ファイル名]シート名'!アドレス
こんな感じでセルに参照式を書き込むと対象ファイルのオープンなしで値を読んでくれる
マクロではこの参照式の文字列を作成してセルに書き込む作業をすれば良い
ただし取得したデータはあくまで参照しているだけなので、いつかの段階で式からデータに直す必要がある

2 直接データを取得する
ExecuteExcel4Macro('ファイルパス[ファイル名]シート名'!アドレス)
この式でマクロ内でデータを直接取得出来る
「Excel4Macro」って何?って感じだけど、古いマクロで今は標準では使わないのかな???
でもとにかくいけます
ただし注意として、このコマンドで使うアドレスはRC型に限られるので、A1型だと変換が必要
address=Application.ConvertFormula(address, xlA1, xlR1C1, 1)
で変換できる(最後のパラメータ「1」は必須!)

3 考察
上記2で出来たので結構満足、1は要するにリンク文字列をマクロで大量に作成しているだけなのでベタすぎて気に入らない
しかし!!!
実行速度的にはあまり変わらない???
一度実行しちゃうとキャッシュされるので正確な計測は微妙なんだけど、2でも高速感はない
思うに、閉じているファイルのデータを取得することって無理だから、1も2も、結局バックグランドでは対象ファイルをオープンしているのかなと
となると、先人の書いたマクロと見た目は違うけど結局やってることは同じなのかなと
それじゃあ意味ないじゃん!?!?!
今のxlsx形式って実態はZIPだから、どこかで解凍してから読み込んで、と言う作業をやってるはず
これを考えると、ファイルの開閉を繰り返すのがすごく嫌だったんだが、結局は同じなのかな~

4 考察2
ちなみに、時間短縮のために集計側のファイルの画面描画を止めて作業してたんだけど、描画した場合としない場合の処理時間を計測するようにしてみたら、ほとんど変わらない結果になってしまった。
対象ファイル数は500くらい
描画ストップ時は何をやってるのか全くわからなくなってしまうので、現在**ファイル中*番目を処理中、のようなカウンタ画面を表示するようにしてはみたんだけど、それに時間がかかってるのだろうか????

いろいろ疑問は残ったものの、今はわからないことはすぐネットで検索できるし、良い時代ですね
そしてプログラミングはやはり楽しいです
仕事を忘れて久しぶりに楽しめた!!!

0 件のコメント:

コメントを投稿