• ベストアンサー

ExcelVBA:たくさんのデータの集計を早くしたい

いつもお世話になります。初心者ですが教えてください。 多くのデータを集計するマクロを作成しているのですが、実行すると5分くらいかかってしまいます。実行速度を早くしたいのですが、何かポイントはありますか? sumproduct(複数条件掛け算)の計算を約5万セル(500*100)に対して行っています。具体的な作業内容は以下です。要注意・要改善点など、どんなことでもいいので教えてください。 ---------------------------------------- 店別の商品別実績の集計をする作業です。店数約500、商品数100です。 おおもとの営業実績データ(base.xls)があります。10,000行×15列ですが、数字の羅列だけであり、人が読むのには適していません。そこで店別結果を知るために、base.xlsを加工して、店別実績表(jisseki.xls)を作るのが作業内容です。 作業の頻度は日々複数回、作業担当は私だけ、ただし出張等私不在時には他人が代行、代行者は関数・マクロの知識がほとんど無い人間も含まれます。 base.xlsは社内イントラネットから毎回ダウンロードしてます。個人用マクロブックに上述の作業を登録して動かす形をイメージしてます。 【base.xlsの構成】 A列=店番、B列=種別(預入、解約の2種類が数字で表示)、C列=商品コード、D列=実績数字、など。(他列は集計作業には無関係) 【jisseki.xlsの構成】 店番(A3:A500)、店名(B3:B500)、商品コード(C1:CX1)、商品名(C2:CX2)。同じ形式のシートを3枚作り、シート名は預入、解約、合計です。預入と解約の(C3:CX500)は、店番・商品コード・種別・金額をsumproductの掛け算方式にしています。 Range("C3").formula="=sumproduct~" を、C3:CX500に、PasteSpecial xlPasteFormulas と書いています。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

(1)VBAによって、エクセル関数セットする方法を使うのは、関数経験=>VBAの習得に入った方には、思いつきやすいことですが、データが千程度を超えると、普通はそうはしないでしょう。 (2)(A)VBAからでもできますがまた(B)手作業によるウイザード利用で、データーピボットテーブルと・・が有りますが、これを検討する手があります。 これが一番手軽で早く誤りがないでしょう。 (3)本当はプログラマを目指すなら、課題にあわせた、適当なロジック(やアルゴリズム)というものを、考える必要があります。 スピードを上げるのは、これに行き着きます。 本件は入力作業が一段落して、まとめて一度に行ってよいオフラインバッチ作業なので、パソコンが出る以前から、COBOLプログラマーなどに、初等学習が終わると課せられていた、事務処理プログラムの定番でした。 それには店番+店名+商品コードでデータをソートし、この3つをコントロールキーとし、コントロールキーが変わった(コントロールブレーク)機会に合計計数を記録します。今では情報処理試験の対策本 などに載っているのを見かけます。 そういう経験とか、教えてもらわないと、VBAの初等の本をわかっても、自己だけの世界の変なロジックでプログラムを組んでしまいます。 もっと視野を広げること、そのためにはどうすればよいか。

noname#64582
質問者

お礼

ご回答ありがとうございます。 前問でもお世話になりました。 >データが千程度を超えると、普通はそうはしないでしょう。 そうですか、それが分かってよかったです。 ピポットテーブル、この利用も考えてみたいと思います。 私はプログラマーを目指す者でもなんでもなく、また、この集計作業も自分の主業務でない割には、日々結構時間と労力を取られるので、何とか楽にしたいなと思ったのが発端なのです。 もっともっと勉強が必要なようですが、この省力化作業にやたらと時間をかけても本末転倒なので、そこを考慮してあたりたいと思います。 どうもありがとうございました。

その他の回答 (1)

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

私の勘違いかもしれませんが、セルに関数をそのままコピペしているだけということなんですか? VBAというかか別に手動でやっても同じことなんですよね?? そりゃまぁメモリ馬鹿食いでしょう。その処理なら限界までメモリを搭載した高CPUマシンで処理するぐらいしか手がないような気がしますが。VBAの処理が遅いのではなくエクセル上の計算に時間がかかっているだけ。 コード上で計算してその結果を書くだけという処理にはできないのでしょうか。 というか1万件を超えるデータなら単純にアクセスなりで処理させた方がもっと早くなる(また単純な構成のようなので手間もそんなにかからない)と思いますが。

noname#64582
質問者

お礼

ご回答ありがとうございます。 手動でやろうと思うと、いちいち数式を入れて、コピーして、とかやらねばならないことや、設問には書きませんでしたが書式の設定やら並び替えやら他の作業も入ってきたりすることもあり面倒を省きたいのです。 また、預入のシートの計算結果が終わるまで、解約のシートが作れないので待っているのが面倒だと思った次第です。 >VBAの処理が遅いのではなくエクセル上の計算に時間がかかっているだけ。 なるほど。おっしゃるとおりだと思いました。 >コード上で計算してその結果を書くだけという処理にはできないのでしょうか コード上で計算というと、ワークシート関数というものを使うということでしょうか?または他の方法でしょうか? 少し調べたところ、VBAで使えるワークシート関数に、sumproduct も入ってるようなので、やり方を再考してみます。 いろいろと勉強せねばなりませんが、大変参考となりました。 どうもありがとうございました。

関連するQ&A