[[20100906145225]] 『モジュールのコード最大何行までかけますか?』(たん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『モジュールのコード最大何行までかけますか?』(たん)

 お世話になります。
 マクロでモジュールのコードを書いていますが、最大 何行までかけますでしょうか?
 よろしくお願いします。
 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)

興味があったのでちと調べてみました。

Visual Basic 中学校 関連用語集 - VBA
http://homepage1.nifty.com/rucio/main/material/Glossary/G022VBA.htm

これによると、VBAは言語仕様上はVB6.0に相当します だそうです。

msdn - Code Limitations
http://msdn.microsoft.com/ja-jp/library/aa240819%28v=VS.60%29.aspx

日本語ページが用意されていないみたいですが、翻訳してみてください(汗)。

『プロシージャが大きすぎます』については、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.