あるシートをコピーしつつデータを加工して、最終的には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