プロが教える店舗&オフィスのセキュリティ対策術

Excel2003です。
いつも大変お世話になっております。

以前、
大量のグラフ(項目数50のグラフを30個以上)
などを作った際にエラーが出て、
ブックを閉じることも、デバックをキャンセルすることも
保存することも出来なくなったことがありました。

今後二度とこのようなことが無いようにしたいのですが、
何が原因でしょうか?


原因の特定のため、
拾ってきたマクロを実行しました。

Sub Sample1()
Dim n As Long, msg As String
n = Application.MemoryTotal
msg = msg & "Excelが使用できるメモリの総容量:" & Format(n / 1024, "#,##0") & "KB" & vbCrLf
n = Application.MemoryUsed
msg = msg & "Excelが使用しているメモリの総容量:" & Format(n / 1024, "#,##0") & "KB" & vbCrLf
n = Application.MemoryFree
msg = msg & "Excelが使用できるメモリの空き容量:" & Format(n / 1024, "#,##0") & "KB"
MsgBox msg
End Sub


実行したところ、
「使用できるメモリ総量:5,256KB
 使用してるメモリ総量:4,232KB
 使用できるメモリ空き:1,024KB」
と表示されました。

メモリ空きは少しありますが、
残り20%以下しかありません。
これが普通でしょうか?


メモリ解放方法や、何かメモリをあまり使わないようにする為に
見るポイントなどありましたら教えてください。
よろしくお願い致します!

A 回答 (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の方が
   早くなっているようだし大きな数値も扱えるのでオススメです。

話は遠回りしましたが、グラフを少なくしたり、グラフオブジェクトを減らしたり…等々
色々工夫して対応するしかないかと思います。

ご検討ください。

この回答への補足

回答ありがとうございます。
グラフが原因でしたか…

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

とりあえず、方法を考えてみたいと思います!

補足日時:2013/12/27 09:52
    • good
    • 1
この回答へのお礼

回答ありがとうございました!
違うタイトルで再度質問したいと思います。

また、図として貼り付けるのを試してみましたが
速度が遅くなるため使うのを避けたいところです…

画像は、保存する場所が無いため、避けたいです。

上記のことを考慮し、
良いプログラムを作れればなと思います!
ありがとうございました!

お礼日時:2013/12/27 11:55

 50項目を30もグラフ処理した事がないのでわかりませんが、グラフ20個ではどうですか?。

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

この回答への補足

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

グラフの個数は減らせないです。
Redimも使っていません。

でも、グラフが原因かもと分かってよかったです!

補足日時:2013/12/27 09:16
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/12/27 11:55

まずは、型の見直しから


たとえば、LongをIntegerに変えるだけで半分になりますよね。
計算途中でLongの精度が必要な場合は計算のみLongで行い、計算結果はIntegerに格納

配列ばど、たくさんのメモリを消費する宣言は、
各関数の内部で宣言する。
※使用するときだけ宣言する
VB系は関数を抜けると解放します。

参考URL:http://www.nda.co.jp/memo/dim.html

この回答への補足

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

補足日時:2013/12/25 16:55
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/12/27 11:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!