Home > 即効テクニック > Excel VBA > シート操作関連のテクニック > シートの制限(Excel95から97へのマクロ移行での注意)

即効テクニック

シート操作関連のテクニック

シートの制限(Excel95から97へのマクロ移行での注意)

(Excel 97)
あるシートをコピーしつつデータを加工して、最終的には100シートになるというマクロをExcel97で実行した所、95では問題なく動作していたのに全シート数が64シートの所で一般保護エラーでExcelが落ちてしまう現象が起きます。

考えられる原因と対策を挙げてみましょう。

○シートのオブジェクト名(CodeName)がExcel97VBAの制限にひっかかっている。

Visual Basic Editorのプロジェクトエクスプローラの左側にシートのコード名が表示されます。このコード名の字数制限は31文字です。

Sheet1をCopyメソッドでコピーすると、Excel上のワークシート名はSheet1(2)となりますが、コード名は Sheet11 となります。

さらにSheet1をCopyメソッドでコピーすると、Excel上のワークシート名はSheet1(3)となりますが、コード名は Sheet12 となります。

この場合には問題ありませんが、コピーされたシートSheet1(2)をコピーするとExcel上のワークシート名は Sheet1(3) となりますが、コード名は Sheet111になってしまいます。

そして、さらにSheet1(3)をコピーするとコード名は Sheet1111 になってしまいます。

つまり、コピー元ではなくコピー先のシートに対してCopyメソッドを繰り返すと、いずれはコード名が制限の31文字を越えてしまいます。

もし、今回の不具合がこの予測に相当しているのであれば、

・コピー先のシートに対してCopyメソッドは使わない
・シートのコピーはやめて、新規作成したシートにセル内容をコピー&ペーストする

などの方法が考えられます。

シートのコピー数が増えると、以下の@が間に合わずAが先に実行されていることも原因の1つに挙げられます。
コピー元が分からずエラーとなってしまいます。解決策としては、@とAの間に、Doeventsを入れるなどが考えられます。
    Do While cnt < 100
        Sheets("帳票テンプレート").Select			・・・	@
        Sheets("帳票テンプレート").Copy Before:=Sheets(1)	・・・	A
        ActiveSheet.Name = cnt
        cnt = cnt + 1
    Loop