VBで作成したプロジェクトを実行している最中に「メモリが不足しています」というメッセージが表示されてエラーになってしまいます。PCを変えても同じエラーが出てしまいます。
このエラーをなくしたいのですが、メモリ不足となる原因がわからず困っています。どなたか知恵を貸して頂けませんでしょうか。お願いします。

A 回答 (5件)

ラベルって、実際には実体をもたないんですよね。


ラベルがそんなにメモリを消費するとは考えずらいですね。
もし上限を超えたのであれば、メモリのメッセージではない通知をしてくるはずです。

DB系ならasiasiさんの言われた通り、開放を行うことが大事だと思います。
もしくはVariant型を多様してたり、異様な大きさの配列が存在していたりするのも、メモリ消費に大きく影響します。
DB操作の3点セット
(1)set Rs = オープン
(2)Rs.Close
(3)set Rs = Nothing

あとはSpreadにアイコンを大量に入れてた時に、ぼくも同じようなエラーを出した記憶があります。
データは出来るだけ開放。変数は必要のないものなら、共通変数にしない などなど
一概に言えることでは ありませんね。
    • good
    • 1

単にメモリ及びディスク領域の割り当てが不足しているだけでわ?



Win2000は普通に起動しても100M前後メモリを使いますし、
メモリが128MBだったりしますとBV立ち上げただけで何もできなくなってしまいます。多分ですが。。。

ちなみに自分はその様な経験はないので見当違いかもしれませんが。
    • good
    • 0

他の回答に加えて、


データのソースがACCESSを使用しているのなら、DBやテーブルの開放をしていない、閉じていないのではないでしょうか。また、テーブルを開きすぎているなど。
その他考えられるのはオブジェクトの開放を行っていないのではないでしょうか。そのあたりの詳細はインターネットでも調べて勉強してください。
    • good
    • 0

>確かに大量のラベル



一つのフォームに張りつけられたコントロール数の上限を超えているかもしれないですね。254個までだったと認識してます。

書いている内容には自信がありますが、あなたの疑問を解決しているかは不明なので、「自信なし」にしてます。
    • good
    • 0

あなたの作成しているプログラムが原因でしょう。



処理内容、開発環境、開発OSが分からないので想像でしか書けませんが、

・大容量のテキストファイルを開いている
・テキストボックスに必要以上のデータを入力させる
・はたまた別ocxの不具合?

などなどをしていれば、「メモリが足りない」なんて現象に陥ります。

ソースコードがあれば他の方も回答しやすいでしょう。

この回答への補足

確かに大量のラベルにデータを反映させています。
それが原因なのでしょうか。

環境を書くのを忘れていました。申し訳ございません。
OS WIN2000 
ツ-ル visualstudio6 sp5 です。

補足日時:2002/01/08 11:30
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qメモリを使いすぎている? VBA

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%以下しかありません。
これが普通でしょうか?


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

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

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

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


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

Sub Sample1()
Dim n As Long, msg As String
n = Application.MemoryTotal
msg = msg & "Excelが使用できる...続きを読む

Aベストアンサー

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 さん
こんにちは。

メモリは結構あるので大きなプログラムを作っても大丈夫です。
パソコン(Windows)はメモリに余裕があってもリソース・メモリの方が影響が大きです。
http://www5.plala.or.jp/vaio0630/win/resource.htm
 ・オブジェクト(データベースのアクセス用のADO、グラフ等のChartObjects等々)
 ・グラフィック用のリソース
 等々が問題になることが多いです。

今回はグラフの図形、グラフオブジェクトの両方を大量に使っているのが問題なように思えます。
私は昔、次の方法(グラフを...続きを読む

Qメモリ不足になってしまう。

教えてください。
現在陥っている現象:「メモリ不足になってしまう」配列の領域をRedimで動的に確保しようとしています。
例えば、
dim A() as byte
dim B() as byte
dim C() as byte
redim A(8000,60000)
redim B(8000,60000)
redim C(8000,60000)
上記のように配列を確保する予定なのですが、
メモリ不足になってしまいます。
ひとつの変数の容量が480MB程度であると思います。
3つ全部でも1440MBであるのですが、物理的な
メモリ容量は、512M*4を実装しています。
上記の変数名で言いますと、
Aの変数の領域確保には問題なく成功するのですが、
その次の行のBのところでエラーになります。
現在、物理的なメモリには空きがあるにもかかわらず
このような現象になってしまい、困っています。
どなたか原因解決の糸口になるような回答をお持ちの方、
教えてください。

Aベストアンサー

>メモリ容量は、512M*4を実装しています。
>物理的なメモリには空きがあるにもかかわらず
配列だけ考えれば確かにそうですが、その他にも物理メモリを使用しているモノがたくさんあるので、足りなくなることがあります。
ハードディスクの空きはありますか?
十分あるのに不足になる原因として考えられるのは、動的に大きな連続した領域を確保しようとしているからだと思います。
動的に確保しなければならないのには理由があるのですか?
静的な確保に変更可能ならば、多少多めに確保しても仮想メモリに割り当てるので確保できるはずです。
また、一度に多くの配列を割り当てるのではなく、細かく分割した方が、メモリ待避・解放のレスポンスも向上しますし、メモリ不足を回避するのにも役立ちます。
最後に単なる思いつきですが、3つのredimの間に適当な処理をはさむとうまくいくかもしれません。

Q実行時エラー7 メモリが不足しています。

vbaでie操作をしていて、ループしているのですが

strURL = objIE.Document.body.innerHTML
の部分で、

「実行時エラー7
メモリが不足しています。」

と言うエラーで一時中止になりますが、
そのままF5を押すと、通過できます。

エラーではないのでしょうか?
中断すると治るエラーなのでしょうか?

Aベストアンサー

こんにちは。

> strURL = objIE.Document.body.innerHTML
strURL という名の変数に格納するのなら、
  strURL = objIE.Document.url
とか
  strURL = objIE.LocationURL
という事がしたいのかな?と迷う面もありますが、
取得したいのは.body.innerHTMLということでお応えします。

> 「実行時エラー7
> メモリが不足しています。」
問題のエラーに関しては、同じシチュエーションでは経験したことがありません。
他の場面で遭遇したことがある同様のエラーとしては、解決策として、
  Dim strURL As String
と文字列型で宣言してあげることでエラーを回避できるケースがあります。
今回は"vba"に関するご質問ということですから、一旦、変数の型宣言を確認してみてください。

もう一点。
これは「想像の解決策」といった程度で確度は低いですが、
 objIE.ReadyState が READYSTATE_COMPLETE
に変わるタイミングと
 objIE.Document.ReadyState が "complete"
に変わるタイミングにはズレがありますから、
それが原因で、.body.innerHTMLにとんでもない値が格納される場合があったように思います。
> エラーではないのでしょうか?
> 中断すると治るエラーなのでしょうか?
"中断すると治る"ようなエラーへのアプローチとしては、
タイミングの最適化を図るのは、まあよくあることではあります。
以下、対策例です。

' ' ///

Sub Re8727064()
Dim objIE As Object ' SHDocVw.InternetExplorer
Dim objDoc As Object ' MSHTML.HTMLDocument
Dim strHTML As String

  Set objIE = CreateObject("InternetExplorer.Application") ' Set objIE = New SHDocVw.InternetExplorer
  objIE.Visible = True

  objIE.Navigate "http://oshiete.goo.ne.jp/qa/8727064.html"
  Do While objIE.Busy Or objIE.ReadyState < 4
    DoEvents
  Loop

  Set objDoc = objIE.Document
  Do While objDoc.ReadyState <> "complete"
    DoEvents
  Loop

  strHTML = objIE.Document.body.innerHTML

  ' ' 処理(strHTML)
End Sub

' ' ///

後は、実際にエラーが発生するコードと実際のURLの提示があれば、
より的確なアドバイスが得られるかも知れません。

うまく解決に導けなかったならすみません。

こんにちは。

> strURL = objIE.Document.body.innerHTML
strURL という名の変数に格納するのなら、
  strURL = objIE.Document.url
とか
  strURL = objIE.LocationURL
という事がしたいのかな?と迷う面もありますが、
取得したいのは.body.innerHTMLということでお応えします。

> 「実行時エラー7
> メモリが不足しています。」
問題のエラーに関しては、同じシチュエーションでは経験したことがありません。
他の場面で遭遇したことがある同様のエラーとしては、解決策として、
  Dim strURL As Str...続きを読む

Qエクセルでメモリ不足のエラーが出ます

エクセルで2つのファイルを開くと「メモリ不足」のエラーが表示されます。

エクセルで作業をするためにファイル(1.86MBのファイル)を開け、続けて別のファイル(1.80MBのファイル)を開くと「メモリ不足」のエラーが表示されます。2つのファイルのシート数は両方とも75シートです。

教えて!gooに登録されている過去の質問を参考にさせていただきましたが解決しませんでした。
ちなみに参考にした回答は次の通りです。
1.そのファイルを別名保存してファイルが開けるか?
2.そのファイル内のシートの倍率を確認。100%以外のシートがある場合は100%に修正してから別名保存してファイルが開けるか?

当方のパソコン環境は次の通りになっています。
OSはWindowsXP HomeEdition SP2
メモリは512MB
ソフトのバージョンはExcel2000
対象ファイルのサイズは(A)1.86MBおよび(B)1.80MB
対象ファイルのシート数は両方75

みなさま、宜しくお願いいたします。

Aベストアンサー

こんにちは。

>対象ファイルのシート数は両方75

まず、ここがネックですね。

ここで、そのシートの限界値を実験してくれた方がいましたが、空の状態では、百は越えるのですが、何かを入れた状態では、1つのブックで、せいぜい40程度ではなかったか、と記憶しています。それが、二つになった時に、果たしてどうかは、そのときの実験にはありませんが、Excelアプリケーション(全体)として、芳しくないはずです。

また、ぎっしりと配列数式が詰まっていたり、外部参照式が多く入った状態では、解決の見通しが立ちません。配列数式は、Excel2000では、6,000個は使えないはずです。何が、配列数式かは、にわかには区別つかないこともあります。INDEX関数やLOOKUP関数も配列数式に変わることがあります。

また、Excel2000は、公開されていない、メモリ制限があります。「使用可能なメモリ」とヘルプにはありますが、何が使用可能かは、書かれていません。

Excelの使うメモリは、物理的なメモリとは違いますので、その周辺をいじっても、直らないことが多いです。おそらく、それぞれの機能のメモリの割り振りがありますので、トータルの数ではないはずです。#1さんのおっしゃっている「Excel2002/2003/2007等が使えるなら」は、その点で、Excel2002になった時に、内部的な制限がなくなったことを、以前掲示板で知りました。

コントロールツールや画像オブジェクト、プリンタ・ドライバ、アドインなどもExcel用として割り当てられたメモリを使います。

ある程度は、[システム]-[詳細設定]-[パフォーマンス] の値を増やせば直る可能性がありますが、先ほどのメモリの割り振りからすると、Excelのハングの可能性が高いです。

なお、他のブックで同様の問題は出ているとすれば、個人用マクロブックや*.xlbファイルを削除して、Excelの設定をリセットすることによって改善することもあります。

私がお勧めする方法は、ひとつは、データベースファイルにすることと、他は、VBAマクロの効用です。ブックからブックへという作業自体を全て、VBAにさせてしまうことで、メモリ負担を減らします。残念ながら、今のままでは、解決する望みは少ないと思います。

こんにちは。

>対象ファイルのシート数は両方75

まず、ここがネックですね。

ここで、そのシートの限界値を実験してくれた方がいましたが、空の状態では、百は越えるのですが、何かを入れた状態では、1つのブックで、せいぜい40程度ではなかったか、と記憶しています。それが、二つになった時に、果たしてどうかは、そのときの実験にはありませんが、Excelアプリケーション(全体)として、芳しくないはずです。

また、ぎっしりと配列数式が詰まっていたり、外部参照式が多く入った状態では、解決の見...続きを読む

Qメモリの解放の仕方

恐れ入ります。
メモリを解放するとはどういうことなんでしょうか?
for loopをくりかえしてるうちにどんどんどんどんメモリの使用率があがっちゃって。おそらくメモリを解放すればあがらなくなるとおもうのですがその解放の仕方がよくわかりません。そもそもメモリとvbの関係ってどういう関係なんですか?おしえてください。お願いします。

Aベストアンサー

システム(Windows)から確保したメモリ領域をシステムに返却するということですね。一般的には、変数などで領域を確保したものを解放することを指します。

VBでは、メモリの確保と解放は自動的にされていて、プログラム上で意識することはありません。たとえば、プロシージャレベルの変数だとプロシージャが呼び出されたときに自動的に確保されてプロシージャを抜ける時に解放されています。
V

C言語だと、変数の確保をする命令もありますし解放する命令があります。メモリを確保だけして解放しないと、繰り返し実行させている内にメモリが足りなくなります。これをメモリがリークしている、と言います。

#VC.netだと自動化されているらしい(未確認)

QExcelのメモリ(配列)の上限は2Gではないのか

こんにちは、
現在ExcelのVBAで大量に配列を必要なマクロを作成しています。

その為、計算量が増えるとどうしても、
メモリ不足というエラーが発生してしまい困っています。

そこで、現在使っているExcelがどれだけの配列とメモリを使用できるのか
下記コードを使用してテストしてみました。

そうすると、下記のような値の時メモリ不足というエラーが発生してマクロが終了しました
(下図参照)
・メモリ(プライベートワーキングセット)  :1249716 K (約1G?)
・String型配列数(各要素"01,02,03,04,05,06") :約28000000(2800万個)

私の知識では、32bitアプリケーションのメモリの上限は2Gだと聞いています。
ですが、実際にはその半分しか使われていません。
そこで質問となるのですが

・32bitアプリケーションの上限が2Gと言われているのはプラベートワーキングセットの値のことではないのか?

・32bit版Excelを使用して、これ以上のメモリ(配列)を使用することは可能か

・可能であれば、その方法はどんな方法か?

以上のことについてお聞きしたいと思っております。
上のどれか一つでもいいです。知っていることがあれば教えてください。

補足となりますが、テストしたPCの簡単な環境を下に記載して置きます。
どのPCでも上記結果とほぼ変わりはありませんでした。

PC1
Windows7 32bit メモリ 4G Excel2013(32bit)

PC2
Windows7 64bit メモリ 8G Excel2010(32bit)

以下は使用したプログラムコードです

---------------------------------------------------------------


Public Sub 配列上限取得計算()
On Error GoTo ErrEnd
Dim i As Long
Const kankaku As Long = 1000000


Dim Moji As String
Moji = "01,02,03,04"

Dim ans() As String
ReDim ans(1 To kankaku) As String
i = 1
Do
If i Mod kankaku = 0 Then
ReDim Preserve ans(1 To i + kankaku) As String
End If

ans(i) = Moji
i = i + 1
Loop
Erase ans
Exit Sub
ErrEnd:
MsgBox Err.Description & vbCrLf & "これ以上の配列を設定できません。" & vbCrLf & "上限は" & i & "です。"
Erase ans
Err.Clear

End Sub

こんにちは、
現在ExcelのVBAで大量に配列を必要なマクロを作成しています。

その為、計算量が増えるとどうしても、
メモリ不足というエラーが発生してしまい困っています。

そこで、現在使っているExcelがどれだけの配列とメモリを使用できるのか
下記コードを使用してテストしてみました。

そうすると、下記のような値の時メモリ不足というエラーが発生してマクロが終了しました
(下図参照)
・メモリ(プライベートワーキングセット)  :1249716 K (約1G?)
・String型配列数(各要素"01,02,03,04,05...続きを読む

Aベストアンサー

#2の回答者です。
>何百万どころか数千万単位で必要です。
>やっていることは、50個あるサンプルで複数の実験を行います。

そういう理由で、配列を使うという所に疑問を感じます。

>50個あるうち6個の組み合わせを考えた場合、
>15890700(1589万700個)通りの文字列を一度配列に格納し、それから各条件に合うかどうか各要素ごとに確認していく作業をしています

時々、ここの掲示板でも、年に一度ぐらい、似たような話は出会いますが、果たして一覧を配列の中にすべて収める必要があるのでしょうか?その都度、組み合わせていって、必要なものを取り出せば済む話だと思うのです。まさか、出来上がってみなければ分からないというような話ではないと思います。もちろん、人間の判断を要するものだとしても、1500万件もの量を、個人でこなしきれるものではないとは思います。

何十年と、こうした掲示板を見ている私でも、組み合わせをすべて配列に入れるという話は、初めてです。もちろん、#1の人の書いた、配列の分散という方法もあるはずだとは思うのですが、今度は、本体のExcel側が果たして要求に応えるか分かりません。

ただし、Excelのアドインの"Solver"の開発元の会社のツールで、組み合わせを解決するという話は聞いたことがあります。ただ、10数万円もするアプリですので、容易には手が出ません。その代わり、VB6時代で、いくつかのアルゴリズムは公開されているはずです。

#1のお礼欄
>64bitOfficeはまだ一般的でなく、また、32bitOfficeと同時にインストールはできなかったと記憶しております。

64bit Officeは、現在の最新バージョン(2013)でも、Microsoft 側は、使用をお勧めしていません。

#2の回答者です。
>何百万どころか数千万単位で必要です。
>やっていることは、50個あるサンプルで複数の実験を行います。

そういう理由で、配列を使うという所に疑問を感じます。

>50個あるうち6個の組み合わせを考えた場合、
>15890700(1589万700個)通りの文字列を一度配列に格納し、それから各条件に合うかどうか各要素ごとに確認していく作業をしています

時々、ここの掲示板でも、年に一度ぐらい、似たような話は出会いますが、果たして一覧を配列の中にすべて収める必要があるのでしょうか?その都度、組...続きを読む

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qエクセル2003 リソース不足

ご質問です。

エクセルのマクロ実行中に下記エラーが出ます。
「リソース不足のため、このタスクを完了することができません。選択データを少なくするか、他のアプリケーションを終了して再度試してください。」
しかし、現在このエクセルのみを実行しています。
ただ、このエクセルファイルが5Mほどある大きなものです。
これが影響していますか?

もし、対処の方法がありましたら
お教え下さい。

よろしくお願い致します。

Aベストアンサー

こんにちは。

私は、アドバイスにも至らないけれど、スタック不足なら分かるけれど、リソース不足というのは、マクロのコード自体の問題ですが、たぶん、根本的なものです。おそらくは、コード全体を書き換えないと、直すことは不可能だと思います。私自身は、ブックのトラブル以外は、それは出しませんが、相談は以前受けたことがあります。残念ながらお断りしました。手が付かなかったのです。記録マクロではうまく行かないわけで、作り上げる前に、ある程度の設計をしないとダメなのです。

1.ループの中にRange 型のオブジェクト変数を置き、それを溜めて解放しない。
2.モジュールの中に、数式を数百も置き、それを、Formula プロパティで、それぞれ、セルに埋め込む。
この2点に限るように思います。

1.は簡単に直るけれども、2.は簡単ではありません。R1C1方式に慣れていれば、統一式が見出せるのですが、A1方式では、別々のものに見えてしまいます。それで、中身は同じ数式をいくつもマクロの中に書いてしまう例が多いです。まず、ダブりを省くことを考えます。

おそらく、コードを公開しない理由としては、コードが長すぎて、ここには書けない、ということではありませんか?

私の経験でお話を書かせていただきましたが、違っていましたら、ご容赦ください。

プロシージャは、基本的に、長くても100行程度を目処にします。そして、構造化していきます。また、モジュールは標準モジュールを使いわけます。ローカルモジュールには、あまり大きなものは入れない、というぐらいを、今は書いておきます。

こんにちは。

私は、アドバイスにも至らないけれど、スタック不足なら分かるけれど、リソース不足というのは、マクロのコード自体の問題ですが、たぶん、根本的なものです。おそらくは、コード全体を書き換えないと、直すことは不可能だと思います。私自身は、ブックのトラブル以外は、それは出しませんが、相談は以前受けたことがあります。残念ながらお断りしました。手が付かなかったのです。記録マクロではうまく行かないわけで、作り上げる前に、ある程度の設計をしないとダメなのです。

1.ループの中...続きを読む

Qエクセル キャッシュメモリーの解放

エクセルで シュミレーションをしています。
パラメータは 10個 パラメーター変化数 5
5*5*---10乗 の計算
秒で 20個ほど パラメーターは進む? で まあ 1週間も有れば・・・・
所が、1日めで ハングでもない、とにかく 止まるというか
パラメータ全く動かず。
VBの実行の 中断、実行でも 動かず。
保存して

タスクマネージャーの メモリーを見ると

ハング状態          :リセットした状態のメモリー
合計     4002       : 4002
キャッシュ 2200(曖昧)   : 416 
利用可能 2000(曖昧)    : 2435
空メモリー 200(正確)    : 2461  

空メモリーが 200 と 少ない。
これが原因だろうと 思うのですが。

キャッシュを開放する方法って 有るのでしょうか

ループの中で
DIM set など 一切 ありません。
セルに値を代入。クリヤーせずに 全て上書き
自動計算 ON
相関係数算出などは 有りますが

キャッシュが 原因か それなら解放は?
それ以外の原因は?

何かご教示願えれば幸いです。
  

エクセルで シュミレーションをしています。
パラメータは 10個 パラメーター変化数 5
5*5*---10乗 の計算
秒で 20個ほど パラメーターは進む? で まあ 1週間も有れば・・・・
所が、1日めで ハングでもない、とにかく 止まるというか
パラメータ全く動かず。
VBの実行の 中断、実行でも 動かず。
保存して

タスクマネージャーの メモリーを見ると

ハング状態          :リセットした状態のメモリー
合計     4002       : 4002
キャッシュ 2200(曖昧)   ...続きを読む

Aベストアンサー

No1です。

おそらく勘違いをなさっていると思いますが、
「空きメモリー」=「電気だけ食って何の役にも立っていないメモリー」
です。
OSしか動いていない状態だと空きはかなりあるでしょうけど、プログラムがそれなりに動いている状態だと、高速化のためには空きメモリーゼロが理想的。とはいえ全くゼロだと急なメモリ使用変動に追いつけないので、空きは要りますが、数百MB空いていれば十分です。

アプリケーションプログラムが使っていないメモリーは余らせておくのは無駄なので、WindowsOSが、キャッシュやバッファに有効利用します。


普通は、必要なメモリサイズ > 物理メモリサイズ なので、足りない分をディスクを使って何とかします。とはいえ、足りなすぎるとメモリアクセスがディスクアクセスばかりになり大変遅くなる。

No1に書いたように、Windows7でOfficeをがんがん使うには4GBはやや不足です。
Excelのコミットサイズはどれだけですか???


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング