• ベストアンサー

エクセルVBAが対応できるプログラムの大きさ

 エクセルVBAでプログラムの行数が2000行近くになるとプロシージャが大きすぎますとなり、実行できません。これには対処する方法はあるでしょうか。また、エクセル2013ではもっと大きなプロシージャにも対応しているのでしょうか。  よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8010/17118)
回答No.1

プロシージャが大きすぎるのだったら,分割すればよいでしょう。 Sub Main Call Sub1 Call Sub2 End Sub Sub Sub1 ' End Sub Sub Sub2 ' End Sub

goicchan
質問者

お礼

ありがとうございました。 助かりました。

その他の回答 (2)

回答No.3

こんばんは。 前に書いていた方たちと内容は重複しますが、2013になったところで、エラーが出て変わらないと思います。個々のメモリの割り振りは、そんなに変わらないと思います。 私のExcelで作ったシステムは、数万行あるはずですが、なんの支障もありません。 ただ、1プロシージャは、百行以内で留めるべきで、それを機能別に、モジュールに別けていくようにします。例えば、画面制御するとか、テキスト処理するとか、シート処理とか。構造化します。しかし、あまりモジュールをどんどん増やすのは良くありません。管理ができなくなるからです。 プログラム自体が、2000行では、そもそも修正も利かないはずです。 2000行というのは、記録マクロで作り上げたもののような気がしますが、それは、無駄が多いはずですから、本格的なプログラミングを学ばないとコンパクトにならないかもしれません。 #2さんの話、64K って、昔の初期のコンパイル後の制限だったような気がしますが、VBAは当時のままを残しているようですね。オプションの順次コンパイルにするか、しないかで多少は変わるかもしれませんが、2000行の、一つのプロシージャでは、あまり期待できませんね。

goicchan
質問者

お礼

ありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

http://msdn.microsoft.com/ja-jp/library/aa240819%28v=VS.60%29.aspx に、 The amount of code that can be loaded into a form, class, or standard module is limited to 65,534 lines. A single line of code can consist of up to 1023 bytes. Up to 256 blank spaces can precede the actual text on a single line, and no more than twenty-four line-continuation characters ( _) can be included in a single logical line. フォーム、クラス、標準モジュールにロードすることができるコードの量は65534行に制限される。単一のコード行は1023バイトまで構成できる。 とある。 また、 There is no limit on the number of procedures per module. Each procedure can contain up to 64K of code. If a procedure or module exceeds this limit, Visual Basic generates a compile-time error. If you encounter this error, you can avoid it by breaking extremely large procedures into several smaller procedures, or by moving module-level declarations into another module. モジュールあたりのプロシージャの数に制限はない。各プロシージャは、64Kまでコード含めることができる。プロシージャまたはモジュールがこの制限を超えた場合、Visual Basicは、コンパイル時エラーを生成する。このエラーが発生した場合は、極端に大きなプロシージャをいくつかの小さなプロシージャにを分けるか、またはモジュールレベルの宣言を別のモジュールに移すことによってそれを避けることができる。 とある。 プロシージャに行数の制限があるわけではない。全体のサイズに制限がある。サイズはコンパイル後のサイズか。64Kはセグメントといったっけ?

goicchan
質問者

お礼

ありがとうございました。 大変参考になりました。

関連するQ&A

  • Excel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい

    ExcelでVBAを使いアプリをつくっています。 プログラムを実行させるボタンはもちろんつくれるのですが、 プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。 ボタンに登録できるのはひとつのプロシージャですよね。 とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?

  • エクセル 検索のVBAの参考プログラム

    エクセルでVBAを使って、検索キーワードの有る「行」のみ表示するVBAを作りたいです。 イメージとしては、1文字入力するたびに検索が実行され、その文字の有る「行」だけが表示されるイメージです。 実行の順番として考えるのは、 10 検索用のセルにキーワードが入力される 20 一文字入力されるたびに検索を実行する 30 検索ワードの有る行を表示し、無い行を非表示にする です。 補足 BASICの基礎知識はあります。 VBAの参考書を読み始めましたが、分かりません。。。 参考プログラム教えてもらえないでしょうか。 よろしくお願いします。

  • excel VBAの分岐の書き方について

    excel VBAの分岐の書き方について 列Aに、 ああ  いいい  うううう  ああ いいい ええ ・・・ のようなデータがあるとします。 このときにVBAのフォームで、 ああ いいい うううう ええ をチェックボックスで選ばせ、該当する行のみに処理を行いそれ以外には処理をしない、というプログラムを考えています。 どのように実装するのが正しい書き方でしょうか? 処理すべき行数は200行程度。ああ、いいい・・・等は10種類ほどで可変です。 in演算子で、配列をみれるような仕掛けがあるといいのですが。。。

  • エクセルを閉じる時のVBAのプログラム

    エクセルを閉じる時に実行するVBAのプログラムを記述する時は、 どのように記述すれば良いのでしょうか?

  • Excelに埋め込んだVBAのプログラムが消えた。

    Excelに埋め込んだVBAのプログラムが消えてしまいました。 何か復旧する方法はありませんでしょうか? 心当たりは何もないのですが、原因はありますでしょうか?

  • Excel VBA から外部プログラムを実行し結果を利用するには?

    Excel VBA から外部プログラム(例えば、Perl)を実行し、 その実行結果をVBAプログラム中で利用する方法を教えて ください。 より具体的にやりたいことを書きますと、 Perlでインターネット上の情報(数字)を取ってきて、 その情報をVBAで利用したいのですが。。。 よろしくお願いします。

  • Excel VBAについて質問です

    EXCEL VBAについての質問です。 以下の1,2を実行するにはどのようにプログラムを組めば 良いのでしょうか。本を買ってきて先週から勉強しているのですが上手くいきません。よろしくお願いします。 EXCEL2000を使用しています。 1)一分おきに特定の行ラベルにとんでコマンドを実行する 2)上記1で得た数値をその都度セルに貼り付けて一覧表(縦列、約7200行ぐらいになる予定)を作る。

  • VBAのプログラムについて

     VBAでプログラムを書いて以下のようなことを実行したいと考えていますが方法がよくわかりません。   ***1002とセルに入力されているセル列に対して、先頭の文字がaaaであったときに、その後ろの1002を計算して数値に変換するという作業です。  仮に、B列でaaa1002とあった場合に、セルの値がaaaであったときのみ、後ろの1002を100×10^2=10000と計算してB列に対応させてC列に出力したいと考えています。        B列     C列 1行目    aaa1002  10000  2行目 aac1001  空白 3行目 aaa4701  4700  :       :      : 具体的なプログラムのコード、もしくはこのような関数を使えばいいなどヒント等でも構いませんので 教えてください。よろしくお願いします。

  • EXCEL VBA 自動でプログラムの実行できますか

    EXCELのVBAでタイマー等を使用して一定の時間がきたら プログラムを実行させたいのですが、教えて下さい。 宜しくお願いします。

  • エクセルVBAでデータベースを作成しています。

    エクセルVBAでデータベースを作成しています。 A列には日付データが日付が古い順に上から入っています。 B列以降は出荷数や次回納品日などの付属データが入っています。 A列(日付) B列(出荷数) 7/1     10 7/15      20 7/31     5 8/2     10 8/4     25 8/23    10 8/30    20 9/2     15 9/20    21 9/30     3 出荷データを更新する度に、最終行の次の行に新しいデータが追加されます。 上記データベースは3か月分のデータだけでも行数が3万近くになるため、エクセルの 限界行数に達する前に、何か手を打ちたいのです。 例えば、予め6万行を限界行数に決めておき、データ更新する際に、データベースの限界行数までの残り行数と、追加するデータの行数を比較して、後者が大きいときには、データ、つまりデータベースの行を消去する。というマクロを組みたいと考えています。上記の例で説明すると、10月分のデータを追加しようとして限界行数に達することが分かった場合、7月に該当する行を一括して消去する。という流れです。 限界行数に達したときに、MsgBoxで「1か月分のデータを削除してよろしいですか?」→OKのときに処理を実行するという流れで行いたいのですが、何かよいアイデアがあれば教えてください。

専門家に質問してみよう