[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『モジュールのコード最大何行までかけますか?』(たん)
お世話になります。 マクロでモジュールのコードを書いていますが、最大 何行までかけますでしょうか? よろしくお願いします。 WindowsXP Excel2003
メモリー依存な気がしますけど、はっきりわかりません。 とりあえず、複数モジュールですが 5000行〜30000行くらいのコードは書いた事がありますがエラーは出た事はありません。
よほどのシステムじゃなければ大丈夫じゃないでしょうか? その場合でもモジュールを分けたり、サブプロシージャを別ブックにしたりすれば 特に問題なさそうに思いますが。 (momo)
私もVBAのメモリ管理を知っているわけではありません。
新規ブックにて、 「ツール」----「マクロ」-----「セキュリティ」とクリックして セキュリティダイアログを表示させてください。 「信頼のおける発行元」というタブをクリックしてください。 ここで 「Visual Basic プロジェクトへのアクセスを信頼する」に チェックを入れて OKボタンをクリックしてください。
ここからは、VBEにて操作してください。
標準モジュールに
'=========================================================== Option Explicit Sub test1() Dim g0 As Long Dim g1 As Long Dim cmp As Object Set cmp = ThisWorkbook.VBProject.VBComponents.Add(1) With cmp.CodeModule .DeleteLines 1, .CountOfLines .InsertLines 1, "sub sample1()" For g0 = 2 To 1150 .InsertLines g0, "cells(" & g0 - 1 & ",1).value=1" Next .InsertLines g0, "end sub" End With End Sub '================================================================= Sub test2() Dim g0 As Long Dim cmp As Object Set cmp = ThisWorkbook.VBProject.VBComponents.Add(1) With cmp.CodeModule .DeleteLines 1, .CountOfLines
For g0 = 1 To 5000 .InsertLines 3 * (g0 - 1) + 1, "sub sample" & g0 & "()" .InsertLines 3 * (g0 - 1) + 2, "cells(1,1).value=1" .InsertLines 3 * (g0 - 1) + 3, "end sub" Next End With End Sub
まず、test1を実行してみて下さい。
新しい標準モジュールが作成され、1151行のコードが作成されます。 sample1を実行してください。
私の環境では、これで「プロシジャーが大きすぎます」というエラーが発生します。 尚、 >For g0 = 2 To 1150 を For g0 = 2 To 1149 では、正常に作動しました。
test1で作成されたモジュールを一度、削除してください。
次に test2を実行してください。 一つのプロシジャーは、3行です。これが5000個ですから、15000行のコードが 記述されました。VBEにて、「ツール」---「マクロ」とクリックすると、 時間はかかりますが、マクロダイアログが表示され、任意のマクロを実行すると 正常に作動します。 >For g0 = 1 To 5000 を For g0 = 1 To 10000
でも結果は同じでした。興味があったら、10000以上で確認してみてください。 プロシジャー単位でページングしているのでしょうかねえ・・・。
Win2000&Excel2002 メモリ512Mで実験しました。
他の環境でも確認してみて下さい。
モジュール分割やプロシジャー分割という知識があれば、こんなことは 殆ど気にしなくても良いはずですよ!! もちろん、ただ物理的に分割するのではなく、きちんと機能分割するということですが・・。 何らかのモジュール設計法のドキュメントを一読することは、お勧めします。
あっ、実験が終わったら、
> 「ツール」----「マクロ」-----「セキュリティ」とクリックして >セキュリティダイアログを表示させてください。 >「信頼のおける発行元」というタブをクリックしてください。 >ここで 「Visual Basic プロジェクトへのアクセスを信頼する」に >チェックを入れて OKボタンをクリックしてください。
ここのチェックは、はずしておいてください。
ichinose@桃屋のラー油、おいしいけど、品切れおこすほどでは・・・
なるほど。 WinXP、XL2003、Mem1G でもエラーになりました。
あまりメモリー依存は無いのかな さすがに1つのプロシージャで1000行とかは書いたことが無いので新しい発見でした。
モジュールレベルでの制限は無さそうですが、 それでもせいぜい1モジュールに対して30プロシージャくらいまでしか書きませんから 通常であればなんの問題も無いという見解ですね。
(momo)
これによると、VBAは言語仕様上はVB6.0に相当します だそうです。
日本語ページが用意されていないみたいですが、翻訳してみてください(汗)。
『プロシージャが大きすぎます』については、64KBが制限のようです。コンパイル後のサイズみたいなので、『何行何文字』は、命令文のコストによって変わってくるんだと思います。
フォーム、クラス、標準モジュールという単位では65,536行、1行は最大1,023バイト... という制限もあるみたい。
(ramrun)
>64KBが制限のようです。 1セグメント=64KB ですから、これは納得ですね!!
1モジュールに5000プロシジャーの実験でも正常に作動はしても 一覧表示だけで結構の時間がかかりました。 限界値は、知識として持っていても 適切な分割はやはり必要ですね!!
ramrunさん、参考サイトありがとうございます。
ichinose
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.