- ベストアンサー
Excel2003のVBAでメモリを効率的に使用する方法
- Excel2003のVBAで大量のグラフを作成した際にエラーが発生し、ブックを閉じることもできなくなる問題が発生しています。メモリの使用状況を確認したところ、使用できるメモリの空き容量が20%以下しかないことがわかりました。メモリを効率的に使用するための方法やメモリ解放方法について教えてください。
- Excel2003のVBAで大量のグラフを作成するとエラーが発生し、ブックを閉じることもできなくなる問題があります。マクロを実行してメモリの使用状況を確認したところ、使用できるメモリの空き容量が20%以下しかないことがわかりました。メモリを効率的に使用するための方法やメモリ解放方法について教えてください。
- Excel2003のVBAで大量のグラフを作成した際にエラーが発生し、ブックを閉じることもできなくなる問題が起きています。マクロを実行してメモリの使用状況を確認したところ、使用できるメモリの空き容量が20%以下しかありません。メモリを効率的に使用する方法やメモリ解放方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
satoron666 さん こんにちは。 メモリは結構あるので大きなプログラムを作っても大丈夫です。 パソコン(Windows)はメモリに余裕があってもリソース・メモリの方が影響が大きです。 http://www5.plala.or.jp/vaio0630/win/resource.htm ・オブジェクト(データベースのアクセス用のADO、グラフ等のChartObjects等々) ・グラフィック用のリソース 等々が問題になることが多いです。 今回はグラフの図形、グラフオブジェクトの両方を大量に使っているのが問題なように思えます。 私は昔、次の方法(グラフを画像化に変換)でプログラム対応をしました。 注)昔作成したソースそのままなので、分かりにくいですがヒントになればと思います。 ActiveSheet.ChartObjects("業種月別グラフ").Chart.CopyPicture _ Appearance:=xlPrinter, Size:=xlScreen, Format:=xlPicture 複写シート.Select ActiveSheet.Pictures.Paste.Select Selection.Name = "グラフ" & NO With ActiveSheet.Shapes("グラフ" & NO) .Shadow.Type = msoShadow6 .Left = Range("A3").Left + ((NO - 1) Mod 4) * .Width .Top = Range("A3").Top + Int((NO - 1) / 4) * .Height End With : ちなみにNo.1の方には申し訳ありませんが「LongをIntegerに変えるだけで半分」は 間違いではありませんが、メモリにはほとんど影響がないかと思います。 理由:使用できるメモリ空き:1,024KB とのことですが、Longを100個確保しても 100×4バイト=400バイト 1KBの半分程度なので1,024KBの0.05%です。 ※Integerは200バイトになりますのでLongより0.025%減る程度です。 また計算速度ですが、最近CPUが32ビットや64ビットになっているのでLongの方が 早くなっているようだし大きな数値も扱えるのでオススメです。 話は遠回りしましたが、グラフを少なくしたり、グラフオブジェクトを減らしたり…等々 色々工夫して対応するしかないかと思います。 ご検討ください。
その他の回答 (2)
- tachin
- ベストアンサー率29% (136/458)
50項目を30もグラフ処理した事がないのでわかりませんが、グラフ20個ではどうですか?。10個ではどうですか?5個ではどうですか?。簡単なシステムチェックです。数を大きく減らしてもダメとなると項目数が多いのか、1項目の大きさが多きすぎるのかです。 また、マクロを組まれている場合、Redimでワークをとっている場合、Eraceしないとメモリ解放されません。使うたびにメモリ消費しているのではないですか?。 あるいは、別プログラムがやたらと立ち上がっているとか。
お礼
回答ありがとうございました! グラフが原因そうなので 対応を考えて見ます。
補足
回答ありがとうございます。 グラフの表示個数が増えると、 使っているメモリが減ります(たぶん) 空きメモリの容量は何故か減りませんが… グラフの個数は減らせないです。 Redimも使っていません。 でも、グラフが原因かもと分かってよかったです!
- usami33
- ベストアンサー率36% (808/2210)
まずは、型の見直しから たとえば、LongをIntegerに変えるだけで半分になりますよね。 計算途中でLongの精度が必要な場合は計算のみLongで行い、計算結果はIntegerに格納 配列ばど、たくさんのメモリを消費する宣言は、 各関数の内部で宣言する。 ※使用するときだけ宣言する VB系は関数を抜けると解放します。
お礼
回答ありがとうございました! グラフが原因そうなので 対応を考えて見ます。
補足
回答ありがとうございます。 型を全てLong→Integerに変更してみましたが、 メモリ使用容量は全く変わりませんでした。 うーん、なぜなのでしょうかね…
お礼
回答ありがとうございました! 違うタイトルで再度質問したいと思います。 また、図として貼り付けるのを試してみましたが 速度が遅くなるため使うのを避けたいところです… 画像は、保存する場所が無いため、避けたいです。 上記のことを考慮し、 良いプログラムを作れればなと思います! ありがとうございました!
補足
回答ありがとうございます。 グラフが原因でしたか… 画像化するにあたり、 グラフの位置を読み取り、 その上に画像を載せた後 グラフを全消去という方式にしたいと思っています。 グラフにし終わった段階で画像化したら 早いですかね… とりあえず、方法を考えてみたいと思います!