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