質問: シート名 end sub 作ったマクロをごくシンプルにして 記載させていただきました。 これにより、シート名を付けて 次々とシートを追加しているのです。 問題は、すでに同じ名前のシートがあった場合です。 うっかり同じ名前を入力しても 「同じ名前のシートがあります」と表示され 「ok」を押すと改めて 「シート名を入力してください」 と表示されるようにしました。 しかし、なぜかこの場合 新たに入力したシート名でシートが作られるだけでなく そのシート名に「(2)」が付いたシートまで作られ 実行時エラー '1004': シートの名前をほかのシート、visual basic で参照されるオブジェクト ライブラリまたは ワークシートと同じ名前に変更することはできません。 というエラーが表示されてしまうのです。 excel2010でもexcel2003でも同じでした。 ステップインでたどってみたのですが 「同じ名前のシートがあります」 が表示された場合 まだ使っていない名前のシートを作っても 黄色いままで「end sub」から「end if」へ移ってしまいます。 ちなみに 「同じ名前のシートがあります」にならなければ 「end if」で終了したことになり 黄色は消えます。 詳しい方にはごく簡単なことなのでしょうが いろいろ検索しても答えは得られませんでした。 ご回答をよろしくお願いいたします。
回答: なかなか大胆な「再帰」の使い方で、小改造ではどうにも出来ませんでした。 動作を下記の様なコードで試してみました。 dim level as long sub シート追加() dim シート名 as string, シート確認 as worksheet debug.print "level:", level シート名 = inputbox("シート名を入力してください") for each シート確認 in worksheets if シート確認.name = シート名 then msgbox "同じ名前のシートがあります", vbcritical level = level + 1 call シート追加 level = level - 1 end if next ' activesheet.copy before:=activesheet ' activesheet.name = シート名 'エラーになってしまうのでコメントアウト debug.print "activesheet.name = ", シート名 doevents: doevents: doevents end sub ☆動作結果 既存のsheet1を3回input後、新しいsheet4をinputしました。 level: 0 level: 1 level: 2 level: 3 activesheet.name = sheet4 activesheet.name = sheet1 activesheet.name = sheet1 activesheet.name = sheet1 既存の名前を入力する毎に、深いレベルに潜って行き、新しい名前を入力すると、順次戻ってきますが、コードの後半の部分が都度実行されます。 コメントアウトの部分を生かすと、最初にactivesheetがコピーされてsheet4と改名され、その次にsheet4が一旦コピーされてsheet4(2)が生成した後、sheet1に改名しようとして名前重複のエラーが発生して止まる事になります。 時間が無いので、突っ込みどころ満載とは思いますが、改善策の一例です。 キャンセル対策等、office tanakaのサイトがご参考になります。 sub シート追加2() dim シート名 as string, シート確認 as worksheet do シート名 = inputbox("シート名を入力してください") loop until sheetexistcheck(シート名) activesheet.copy before:=activesheet activesheet.name = シート名 end sub function sheetexistcheck(newsheetname as string) as boolean dim シート確認 as worksheet for each シート確認 in worksheets if シート確認.name = newsheetname then msgbox "同じ名前のシートがあります", vbcritical sheetexistcheck = false exit function end if next sheetexistcheck = true end function なお、既存のsheet1に対して、小文字のsheet1をinputすると、同名チェックはくぐり抜けた後で、改名の時にエラーとなる事を発見しました。ご参考まで。