• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリを使いすぎている? VBA)

Excel2003のVBAでメモリを効率的に使用する方法

このQ&Aのポイント
  • Excel2003のVBAで大量のグラフを作成した際にエラーが発生し、ブックを閉じることもできなくなる問題が発生しています。メモリの使用状況を確認したところ、使用できるメモリの空き容量が20%以下しかないことがわかりました。メモリを効率的に使用するための方法やメモリ解放方法について教えてください。
  • Excel2003のVBAで大量のグラフを作成するとエラーが発生し、ブックを閉じることもできなくなる問題があります。マクロを実行してメモリの使用状況を確認したところ、使用できるメモリの空き容量が20%以下しかないことがわかりました。メモリを効率的に使用するための方法やメモリ解放方法について教えてください。
  • Excel2003のVBAで大量のグラフを作成した際にエラーが発生し、ブックを閉じることもできなくなる問題が起きています。マクロを実行してメモリの使用状況を確認したところ、使用できるメモリの空き容量が20%以下しかありません。メモリを効率的に使用する方法やメモリ解放方法について教えてください。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.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の方が    早くなっているようだし大きな数値も扱えるのでオススメです。 話は遠回りしましたが、グラフを少なくしたり、グラフオブジェクトを減らしたり…等々 色々工夫して対応するしかないかと思います。 ご検討ください。

satoron666
質問者

お礼

回答ありがとうございました! 違うタイトルで再度質問したいと思います。 また、図として貼り付けるのを試してみましたが 速度が遅くなるため使うのを避けたいところです… 画像は、保存する場所が無いため、避けたいです。 上記のことを考慮し、 良いプログラムを作れればなと思います! ありがとうございました!

satoron666
質問者

補足

回答ありがとうございます。 グラフが原因でしたか… 画像化するにあたり、 グラフの位置を読み取り、 その上に画像を載せた後 グラフを全消去という方式にしたいと思っています。 グラフにし終わった段階で画像化したら 早いですかね… とりあえず、方法を考えてみたいと思います!

その他の回答 (2)

  • tachin
  • ベストアンサー率29% (136/458)
回答No.2

 50項目を30もグラフ処理した事がないのでわかりませんが、グラフ20個ではどうですか?。10個ではどうですか?5個ではどうですか?。簡単なシステムチェックです。数を大きく減らしてもダメとなると項目数が多いのか、1項目の大きさが多きすぎるのかです。  また、マクロを組まれている場合、Redimでワークをとっている場合、Eraceしないとメモリ解放されません。使うたびにメモリ消費しているのではないですか?。  あるいは、別プログラムがやたらと立ち上がっているとか。

satoron666
質問者

お礼

回答ありがとうございました! グラフが原因そうなので 対応を考えて見ます。

satoron666
質問者

補足

回答ありがとうございます。 グラフの表示個数が増えると、 使っているメモリが減ります(たぶん) 空きメモリの容量は何故か減りませんが… グラフの個数は減らせないです。 Redimも使っていません。 でも、グラフが原因かもと分かってよかったです!

  • usami33
  • ベストアンサー率36% (808/2210)
回答No.1

まずは、型の見直しから たとえば、LongをIntegerに変えるだけで半分になりますよね。 計算途中でLongの精度が必要な場合は計算のみLongで行い、計算結果はIntegerに格納 配列ばど、たくさんのメモリを消費する宣言は、 各関数の内部で宣言する。 ※使用するときだけ宣言する VB系は関数を抜けると解放します。

参考URL:
http://www.nda.co.jp/memo/dim.html
satoron666
質問者

お礼

回答ありがとうございました! グラフが原因そうなので 対応を考えて見ます。

satoron666
質問者

補足

回答ありがとうございます。 型を全てLong→Integerに変更してみましたが、 メモリ使用容量は全く変わりませんでした。 うーん、なぜなのでしょうかね…

関連するQ&A