【先着1,000名様!】1,000円分をプレゼント!

こんにちは、
現在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のメモリ(配列)の上限は2Gで」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (4件)

#2の回答者です。


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

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

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

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

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

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

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

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

いわれてみればそうでした。
今まで、条件が増えていくに付き、プログラムを別々に追加していったので、気づけませんでした。

よくよく考えてみると、組み合わせを列挙する時に、それぞれの条件に合わないものをはじけばよかったんですね・・・

まぁ、プログラムをかなり書き直さないといけないですが、ちゃんと考えないでプログラムを追加していった自分が悪かったと思って諦めます。

お礼日時:2014/03/22 19:27

回答No.1です。



私も回答No.3で提案されている、「その都度、組み合わせていって、必要なものを取り出せば済む話」ということに完全同意します。

今の処理では全ての組み合わせを生成して配列に入れ、後から順番に比較しているようですが、なんでそんな非効率なことをするのか、組み合わせの一つを生成したらその場で比較し、一致しなければ次という流れにすれば済むではないかと思えてなりません。

比較が一回ではないとしても、ループで合致する情報を探すのであれば、比較元が配列の中身だろうと都度生成した物だろうと、速度的には気にするほどの違いはないはずです。二回目以降の比較は一回目で見つけた物だけ相手にしているのなら、その一回目で見つけたものだけを入れる配列を用意すれば良いでしょう。

どうしても全部を配列に入れて処理することが避けられないなら、その多量のデータを前処理する部分だけをマクロではなくてVBの別ソフトに追い出し、Excelで扱える大きさにしてから処理することも検討されてはいかがでしょうか。VBAからVBの移植だったら難しくないし、それにVBなら純粋にメモリ限界まで配列が作れます。x64プロジェクトとすれば2GBの制約も取り払われます。
    • good
    • 1
この回答へのお礼

>>組み合わせの一つを生成したらその場で比較し、一致しなければ次という流れにすれば済むではないかと思えてなりません。

途中でとある条件の時に、出来上がった配列と別のデータ(これれも配列)の同士を行うようにしてたんですが、よくよく考えると、それぞれの要素ごとに、別のデータとの比較をすればよかったんですね。

うかつでした。

>>その多量のデータを前処理する部分だけをマクロではなくてVBの別ソフトに追い出し、Excelで扱える大きさにしてから処理することも検討されてはいかがでしょうか。

なるほどVBで作成するという手もありましたか。
その方法も考えてみます。
ありがとうございました。

お礼日時:2014/03/22 19:32

こんにちは。



String変数のメモリの理論上の上限が、2GBであるけれども、Microsoft 側では、配列の上限は、使用する保管メモリのバイト数ではなく、要素の合計数と言っています。(これは、過去の話だったかもしれません。)

http://msdn.microsoft.com/ja-jp/library/b388cb5s …

その他では、「オートメーションを利用して、Excelに渡す配列の制限」(これも昔の話)
http://support.microsoft.com/kb/177991/ja

検索してみると、かなりの数の書き込みで、同じテーマの内容が出てきますが、明確な回答を見れません。
いろんな人が、あれこれ言っていますが、そこから、Microsoft で、このような文章が出てきました。

http://msdn.microsoft.com/en-us/library/b388cb5s …

Maximum size

The article is a bit vague about the maximum size of the array. I have 32-bit machine with 3.5GB of memory and

32bit マシーンで3.5GBのメモリを搭載しているが、

Dim arrDailyMatrix() As Double
ReDim arrDailyMatrix(1 To 233, 1 To 10, 0 To 10000)

メモリの限界を越えたと出てきました。メモリの限界の正確の大きさは知ることかできませんが、3次元での最大のサイズの調整は可能だという話でしかありませんが、この数字は、各掲示板によっても違うようです。人によっては、500MBを越えないとも書いているようです。

他の掲示板で書かれている「201185*151」の要素数に関しては、そこまでは届かないようです。

Moji="01,02,03,04", 11 byte*2(Unicode) =22 byte (ただし、String型が持つ本来のメモリ数は入れていません。)

この文字列に対して、ご質問に書かれている要素数の限界値と、この要素数とも、だいたいの数字は、合っているようです。ただし、アプリ内で使用されているメモリにも影響を受けるようです。

さて、現実の問題として、理論値は別として、果たして、何百万もの要素数を持った配列を作る必要性があるのか、というところに行き着いてしまうと思います。格納は簡単には出来たけれども、その後の処理で、シーケンシャルで扱えば、かなりの手間を掛けてしまうことにもなります。このままでは、それを、どう扱うかという実際の作業を考えなければ、単なる理論値だけの話に終わってしまうと思います。
    • good
    • 0
この回答へのお礼

>>検索してみると、かなりの数の書き込みで、同じテーマの内容が出てきますが、明確な回答を見れません。

そうなんですよね。私も調べてみましたが、解決策はあまり見つかっていません。唯一3Gスイッチというのが使えそうであるんで試してみ見る価値ありそうですが。


>>さて、現実の問題として、理論値は別として、果たして、何百万もの要素数を持った配列を作る必要性があるのか

何百万どころか数千万単位で必要です。
やっていることは、50個あるサンプルで複数の実験を行います。
1つのサンプルにつき複数の実験値(データ)があるのですが
50個あるサンプルから数個の組み合わせを取り、さまざまな条件によってその組みわせを絞っていくというものですが、

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

まだ、メモリを削減できそうな予知はあるのですが、プログラムを抜本から書き換えないといけないところが多く、工数がかかり大変です。なので、なんとか上限を増やせないか試行錯誤していました。

配列は要素を削除するなんてことが上手くできないので、条件に合わない要素を削るときに、いったん別の配列にコピーしてしまっているのも悪いかもしれません。

いっそのこと配列をコレクションに書き換えた方がいいのでしょうか・・

お礼日時:2014/03/19 20:32

32bitアプリのメモリ上限である2GBというのは、そのアプリ全体での話であり、もっと言うとWin32プロセスが利用できる限界値でもあります。

つまり配列だけで2GB使ってしまったら、Excel本体やVBAを実行するためのメモリがなくなってしまいます。それでは困るから、通常この程度残しておけば大丈夫であろう…というメモリ残量を下回りそうな事態になった時、メモリ不足の警告を出します。

仮想記憶があるだろうと思われるかも知れませんが、仮想記憶で対応できるのは、他にも2GB要求するプロセスが登場したような時です。この時には、仮想記憶が使っていない方のメモリをディスクにページアウトして、メモリを工面してくれます。しかしそれはあくまで2GBの要求が複数来ても、順番に割り当てて対応できるというだけであって、1プロセス=2GBという数字は変わりません。4GBの物理メモリ空間で、2GBのユーザーメモリ空間を3つ以上持たせることを可能にする仕組みです。

なので2GBで足りない仕事をさせるのなら、32bitアプリでは無理で、64bitアプリを持ってくる必要があります。ただし、アプリが利用可能なメモリ容量の限界と、実際にアプリ内でユーザーに開放しているメモリ容量は全く個別の問題であって、アプリの実装次第で変わってしまいます。なのでもしかしたら、今は巨大配列一個でだめだけど、それが10個作れるようになった、でも一個の大きさは変わらない、みたいな可能性もあります。
    • good
    • 0
この回答へのお礼

なるほど。確かに配列だけで2Gいってしまったら、ソフト自体が動かなくなる可能性もありますからね。

でも、空き容量がまだたくさんあるのなら、それを使ってほしい気もします。(まだ1Gほど余裕あるのに・・・)



>>なので2GBで足りない仕事をさせるのなら、32bitアプリでは無理で、64bitアプリを持ってくる必要があります。

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

本当は64bit版インストールできればそれがいいのでしょうが、実際にマクロを使う人はエクセルにあまり慣れてない人なので、あまり推奨はできません・・・

>>アプリが利用可能なメモリ容量の限界と、実際にアプリ内でユーザーに開放しているメモリ容量は全く個別の問題で・・・

そうなのですか。ということはユーザーが配列として使えるのは1GB分ぐらいということですね・・・

お礼日時:2014/03/19 19:58

このQ&Aに関連する人気のQ&A

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

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

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

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

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)
で切り上げです。

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

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

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アプリケーション(全体)として、芳しくないはずです。

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

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
...続きを読む

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等々)
 ・グラフィック用のリソース
 等々が問題になることが多いです。

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

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

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の間に適当な処理をはさむとうまくいくかもしれません。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

Qエクセルでの作業領域を拡大したい。

XPのエクセルで作業をしているのですが、
リソース不足、セルの追加ができません、仮想メモリーがどうとか
というメッセージが出て、意図したシートを作成・保存できません。

各店舗から送られてきた、ある程度画一化されたシートをコピペして
再計算させたいのです。
データー量は大したことないと思うのですが、セルに色を塗って送ってきたりしているせいか思ったより書式のパターンが多いようです。

作業領域とかメモリーの割り当てを変更することはできないんでしょうか?
(当方かなり素人です。)

Aベストアンサー

こんにちは。

まず、Excelでは、物理的なメモリは、ほとんど関係ありません。

>メモリーはシステムメモリーは256MBです。
OS は、Win XP ですか?

Excelは、仮想メモリ(キャッシュ)に展開して、そこで作業をしています。
ただ、エラーとかメッセージが出ているときは、多くは、ファイルが壊れていて、メモリーリークしていることが考えられます。(言い方は問題があるかもしれません。というのは、Excelは、使っていれば、メモリが少しずつ膨らんできます。どちらかというと、ゴミが混じる、というほうが正しいです。)しかし、通常、XP では、一杯になることは、めったにありません。何かのトラブルがあるほうが多いです。どうしても、バイナリファイルを、通信で変換してやり取りするというのは、リスクが大きいかもしれません。

やはり、CSV などが、本来は安全です。慎重なところでは、バイナリの場合は、LHAやZIPなどで圧縮を奨励させられます。

>書式のパターン
書式パータンは、別にメモリ枠を取られていますから、メモリ枠の全体量から比較するとはるかに小さく、すぐに一杯になります。そして、別のエラーが発生します。

>作業領域とかメモリーの割り当てを変更することはできないんでしょうか?

仮想メモリ領域を増やせばよいのですが、おそらくは期待できません。

[コントロールパネル]-[システム]-[詳細設定]-[パフォーマンス]
 -[詳細設定]-[仮想メモリ]-[変更]と進み、[カスタムサイズ]をクリック

[初期サイズ]を大きくし、[最大サイズ]を初期サイズ以上にする。

>コピペする際に「形式を選択指定して貼り付け」(値だけ)
>にすれば、メモリーとかを抑えられますか??

これに関しては、なんとも言えません。もしメモリリークのような現象があるとすると、そのブック自身に問題があることが多いです。ブックのシートを、Ctrl + A で、シートに貼り付けるような方法で、ブックを新しくして、更新させれば、直るかもしれません。

こんにちは。

まず、Excelでは、物理的なメモリは、ほとんど関係ありません。

>メモリーはシステムメモリーは256MBです。
OS は、Win XP ですか?

Excelは、仮想メモリ(キャッシュ)に展開して、そこで作業をしています。
ただ、エラーとかメッセージが出ているときは、多くは、ファイルが壊れていて、メモリーリークしていることが考えられます。(言い方は問題があるかもしれません。というのは、Excelは、使っていれば、メモリが少しずつ膨らんできます。どちらかというと、ゴミが混じる、と...続きを読む

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ランキング