- ベストアンサー
VBAでシートのコピー時に同名のシートが存在する場合の注意喚起メッセージの設定方法
- VBAを使用してEXCELのシートをコピーする際、同名のシートが既に存在する場合に重複の注意喚起メッセージを表示する方法について教えてください。
- マクロに「既に、同名のシートがあり再度入力して下さい。」というメッセージを表示させるには、MsgBox関数を使用します。
- また、シートのコピー後に新しいシートに名前を設定し、ボタンを削除する処理や元のシートに戻る処理も含まれます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ご回答いただいたのをそのまま反映したものが下記の 「1」 ですがテストしたところシートのコピーなど何も反応しませんでした。 回答は、同一シート名に対し注意喚起し再入力を求めるという部分のコードですから、回答1の最後に「以下に新規作成のコード 」と記載しているように、質問のSheets("元本").Copy After:=Sheets("元本")以下のコードをそのまま記載してください。 > 私なりにご回答を編集追加したところ、 > シートはコピーされ 同名のシート名は「既に、同名の シートがあり再度入力して下さい。」 > までは上手くできました。 > ただしその後は下記のようなコーションが出ました。 > 解決策を再度ご指導いただけませんでしょうか。 一番大事なdo~Loopを取り除いてますから、同じシート名を見つけてもその旨表示するだけで再度入力をさせるようになっていません。その為に、重複するシート名のまま先に進み名前変更しようとしてますから当然「同じシート名で変更しようとしている」というエラーになります。
その他の回答 (2)
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1の一部追加です 同じシート名が見つかってもさらに探していたので見つかった時点でループを抜けるようにExit For追加しました。 For Each c In Worksheets If c.Name = NewSheetName Then MatchFLG = True MsgBox ("既に、同名の シートがあり再度入力して下さい。"), vbExclamation Exit For '←ここに追加 End If Next あと、質問のコードではMMDD以外の入力を規制していませんが、参考なので割愛しているのでなければ以下のページを参考に規制してみてはいかがでしょう。 http://atamoco.boy.jp/vba/lang/date.time/IsDate.php
補足
ご回答いただいたのをそのまま反映したものが下記の 「1」 ですがテストしたところシートのコピーなど何も反応しませんでした。 それ故にご回答に対して失礼かと思いつつも 2 のように勝手に変更させて戴きました。 2 の不具合の解決も含めて再度ご指導いただけたら幸甚の至りです。 1 Private Sub CommandButton1_Click() Dim NewSheetName As String Dim c As Object Dim MatchFLG As Boolean Do MatchFLG = False NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください。例 0101") If StrPtr(NewSheetName) = 0 Then MsgBox "キャンセルします", vbInformation Exit Sub ElseIf NewSheetName = "" Then MsgBox "未入力です", vbExclamation Exit Sub End If For Each c In Worksheets If c.Name = NewSheetName Then MatchFLG = True MsgBox ("既に、同名の シートがあり再度入力して下さい。"), vbExclamation Exit For End If Next Loop Until MatchFLG = False End Sub 2 私なりにご回答を編集追加したところ、 シートはコピーされ 同名のシート名は「既に、同名の シートがあり再度入力して下さい。」 までは上手くできました。 ただしその後は下記のようなコーションが出ました。 解決策を再度ご指導いただけませんでしょうか。 「実行時エラー’1004’ シートの名前をほかのシート、Visual Basic で参照されるオブジェクト ライブラリまたはワークシートと同じ名前に変更することはできません。」 デバックで 「.Name = NewSheetName」 黄色で反転しています。 Private Sub CommandButton1_Click() '2014/10/15 YOKOHAMA CHABIN Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください。例 0101") If StrPtr(NewSheetName) = 0 Then MsgBox "キャンセルします", vbInformation Exit Sub ElseIf NewSheetName = "" Then MsgBox "未入力です", vbExclamation Exit Sub End If For Each c In Worksheets If c.Name = NewSheetName Then MatchFLG = True MsgBox ("既に、同名の シートがあり再度入力して下さい。"), vbExclamation Exit For End If Next Sheets("元本").Copy After:=Sheets("元本") With ActiveSheet .Name = NewSheetName With .Range("A1") .NumberFormatLocal = "0000" .Value = NewSheetName End With .OLEObjects("CommandButton1").Delete .Range("A2").Select End With Sheets("元本").Activate Application.ScreenUpdating = True End Sub
- kkkkkm
- ベストアンサー率66% (1719/2589)
以下のような感じでいかがでよう。未入力とキャンセルでは処理を中断します。 Dim NewSheetName As String Dim c As Object Dim MatchFLG As Boolean Do MatchFLG = False NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください。例 0101") If StrPtr(NewSheetName) = 0 Then MsgBox "キャンセルします", vbInformation Exit Sub ElseIf NewSheetName = "" Then MsgBox "未入力です", vbExclamation Exit Sub End If For Each c In Worksheets If c.Name = NewSheetName Then MatchFLG = True MsgBox ("既に、同名の シートがあり再度入力して下さい。"), vbExclamation End If Next Loop Until MatchFLG = False 以下に新規作成のコード
お礼
早速の再ご指導誠にありがとございました。 上手くできて楽しんでいます。 未熟でご迷惑かけました。