none
ExcelVBAマクロのコード量の上限 RRS feed

  • 質問

  • ExcelのVBAマクロに関して質問させてください。

    当方、Office365 Excelを使用して

    大規模なExcelVBAアプリケーションを開発しております。

    あるQAサイトにて、下記サイトの記事を見かけました。

    https://msdn.microsoft.com/ja-jp/library/aa240819(v=VS.60).aspx

    こちらによると、「フォーム、クラス、標準モジュールにロードすることができるコードの量は65534行に制限される」

    とあるようですが、

    ExcelVBAに関してのドキュメントではない為、疑っている次第です。

    ■質問事項

     1.1つのExcelブックに保管できるマクロのコード量に上限はありますでしょうか?

     2.上限がある場合、以降、どのような方法で回避して開発を続けるのが良いでしょうか。

       例)マクロを別ブックに分け、実行時には別のマクロブックのマクロをコールする

       例)変数名を短くし、改行やコメントもなくして節約する

    有識者の方、ご教示の程よろしくお願いいたします。

    2016年4月20日 7:10

回答

  • Office 2013 と 2016 の Excel で確認しましたが、「フォーム、クラス、標準モジュールにロードすることができるコードの量は65534行に制限される」①と「1つのプロシージャで64kは超えられない」②はともに有効でした。逆にこの条件をクリアすれば実行ができるのではないかと思います。

    ①となったときは以下のメッセージが表示され

    ②となったときは以下のメッセージが表示されました。

    ①の回避方法は、コメントを含めなるべく行数を少なくし、制限をオーバーしてしまうときはコードを複数のモジュールに分ける。
    ②の回避方法は、行数や変数名の長さやコメントの有無は影響しないのですが、実際コンパイルしてみないと64Kオーバーになっているかどうか確認することが難しいのではないかと思います。(何か確認方法がある?)64Kオーバーになってしまった場合は、以下のようにプロシージャを複数に分けて書く必要があります。


    Sub BigProcedure()
          Procedure1()
          Procedure2()
          Procedure3()
     End Sub

     Sub Procedure1()
          '処理1
     End Sub

     Sub Procedure2()
          '処理2
     End Sub

     Sub Procedure3()
          '処理3
     End Sub
    2016年4月20日 10:27

すべての返信

  • 回答ではありませんが、リンク先のページは20年近く前の製品であるVisual Studio 6.0に関するものです。65534は16bitの制限によるものだと思いますので、さすがにOffice365ではそのような制限はないと思われます。
    Excelでも扱える最大行は、Excel 2003で65,536行だったようですが、今は大幅に緩和されています。保障はできませんが、おそらく気にしなくても良いレベルじゃないかと思います。あくまで感想でしかありませんが・・・

    (参考)
    Excelの最大列数/最大行数は?
    http://propg.ee-mall.info/excel/excel%E3%81%AE%E6%9C%80%E5%A4%A7%E5%88%97%E6%95%B0%E6%9C%80%E5%A4%A7%E8%A1%8C%E6%95%B0%E3%81%AF%EF%BC%9F/

    (追記)
    以下のページを見つけました。1つのプロシージャで64kは超えられないようですね。Excel 2013でもそのようです。
    Office 365ではわかりませんが、古い製品だからそのような制限がかかっているというわけでも無さそうですね。
    私の感想は外れていたようです。ごめんなさい。ただ、正確には最大行数ではないので、また違うかもしれませんが・・・

    Maximum Length Limit for a Macro
    http://excelribbon.tips.net/T010449_Maximum_Length_Limit_for_a_Macro.html

    (追記)
    公式な情報としては以下かなぁ?

    Procedure too large
    https://msdn.microsoft.com/en-us/library/office/gg251481.aspx


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/


    2016年4月20日 8:12
    モデレータ
  • Office 2013 と 2016 の Excel で確認しましたが、「フォーム、クラス、標準モジュールにロードすることができるコードの量は65534行に制限される」①と「1つのプロシージャで64kは超えられない」②はともに有効でした。逆にこの条件をクリアすれば実行ができるのではないかと思います。

    ①となったときは以下のメッセージが表示され

    ②となったときは以下のメッセージが表示されました。

    ①の回避方法は、コメントを含めなるべく行数を少なくし、制限をオーバーしてしまうときはコードを複数のモジュールに分ける。
    ②の回避方法は、行数や変数名の長さやコメントの有無は影響しないのですが、実際コンパイルしてみないと64Kオーバーになっているかどうか確認することが難しいのではないかと思います。(何か確認方法がある?)64Kオーバーになってしまった場合は、以下のようにプロシージャを複数に分けて書く必要があります。


    Sub BigProcedure()
          Procedure1()
          Procedure2()
          Procedure3()
     End Sub

     Sub Procedure1()
          '処理1
     End Sub

     Sub Procedure2()
          '処理2
     End Sub

     Sub Procedure3()
          '処理3
     End Sub
    2016年4月20日 10:27
  • trapemiyaさん、kenjinoteさん

    大変判りやすいご説明・ご検証、ありがとうございました。

    上記①の回避方法より、フォームやモジュールそれぞれに含められる(ロードできる)量が65534行であり、

    ブック内マクロコード量の合計ではない、という意味で理解いたしました。

    モジュールも大分多くなってきていたのですが、モジュール分けしておけばこのまま続けても大丈夫だと判り

    安堵いたしております。

    「フォーム、クラス、標準モジュールにロードすることができるコードの量は65534行に制限される」を

    それぞれの合計値(=ブック全体)の意味として解釈してしまっておりました。

    ご意見・ご回答いただき、誠にありがとうございました。

    2016年4月21日 3:07