こんにちは。
田中です。
※あくまで考え方の一例なので、これが正解不正解というものではありません。
※もっといいプログラムの組み方があるかもしれませんので、参考程度に。
基本的には元データ1つにつき、集計結果ファイルは1つ。
けれども時には、Excelにはシートがあり、シートごとに結果を記載する場合もある。
例を挙げると、1つの商品に対して、年齢層ごとにデータをまとめるとして。
・結果ファイルは「商品A_年齢層.xlsx」
・1つの地域につき1シート
みたいな感じする場合というところ。
○基本的な1つのデータにつき、結果ファイルが1つの場合
Sub Sample1
For 元データ
resultFile = 元データをもとに結果ファイル名を作成
resultFileを作成
resultFileを開く
resultFileに元データの内容を記載
resultFileを閉じる
Next
End Sub
こういうロジックになるでしょうか?
これをもとに複数バージョンにしたのが下。
○結果ファイルを全ファイル開いて、元データを一件ずつ見ては該当するシートに記載していくパターン
Sub Sample2
For 元データ
resultFile = 元データをもとに結果ファイル名を作成
If 結果ファイルがない then
resultFileを作成
resultFileを開く
End If
resultFileをアクティブ
該当するシートをアクティブ
resultFileに元データの内容を記載
Next
開いているresultFileをすべて閉じる
End Sub
結果ファイルがあればそれをアクティブにして、なければを作っては開いたままにして該当したファイルごとに記載していく。
欠点:メモリをとにかく喰う!!
resultFileを開きっぱなしにするわけだから、当たり前といえば当たり前。
開いているファイルの数とか、開くファイルが大きかったりすると致命的。
「メモリが足りません」エラーが出て、元データのファイルが開かない、ファイルが保存できないなど障害が起きる。
例でいうところの地域が都道府県別だったりしたら48シート分…
ということで、次っ!!
Sub Sample3
For 元データ
resultFile = 元データをもとに結果ファイル名を作成
If 結果ファイルがない then
resultFileを作成
End If
resultFileを開く
resultFileをアクティブ
該当するシートをアクティブ
resultFileに元データの内容を記載
resultFileを閉じる
Next
End Sub
今度は、元データごとに該当するresultFileを開いては閉じてというする方法。
これでメモリの問題は解決する。
もちろん、完璧なプログラムなど存在しない。
欠点:処理時間がかかる
ただ、数が少なければ無難な方法。
Sub Sample4
For 元データ
resultFileObject作成
Key:resultFile value:該当する元データ
※元データが複数の場合、私は"*"とかで区切って一つの文字列にしてしまったりする
Next
For resultFileObjectのKey
resultFileを作成
※ここで"*"で区切ったものをばらす
For 元データ(resultFilesObjectのValue)
該当するシートをアクティブ
元データの内容を記載
Next
resultFileを閉じる
Next
End Sub
resultFileを作る前に、一度該当するファイルをまとめて見ました!
これなら、結果ファイルを開くは一度だけ。
結果的にこのやり方が処理時間が短く、なんとかメモリも範囲内に収まった模様。
ちなみに、Sample4で処理が止まったときの原因の一因について記載する。
・エラーもなく無言で処理が終わる
→ワークブックの数十回以上の開閉
→クリップボードのデータ量が多い
結果的に処理速度、メモリのことを考えると、ひとつひとつファイルを閉じて開いてを繰り返したほうがよさそう。