VBAでシートのコピー時に同名のシートが存在する場合の注意喚起メッセージの設定方法

このQ&Aのポイント
  • VBAを使用してEXCELのシートをコピーする際、同名のシートが既に存在する場合に重複の注意喚起メッセージを表示する方法について教えてください。
  • マクロに「既に、同名のシートがあり再度入力して下さい。」というメッセージを表示させるには、MsgBox関数を使用します。
  • また、シートのコピー後に新しいシートに名前を設定し、ボタンを削除する処理や元のシートに戻る処理も含まれます。
回答を見る
  • ベストアンサー

VBA シートをコピーした時、同名の場合は注意喚起

いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロで例えば、 「1018」というシートが既に存在していて新たに「1018」を作成しようとした時に重複の注意喚起メッセ―ジを出すには下記のマクロにどうすればいいか御指導いただけませんでしょうか。 注意喚起メッセージは  「既に、同名のシートがあり再度入力して下さい。」 ※If MsgBox("既に、同名の シートがあり再度入力して下さい。") 参考に Private Sub CommandButton1_Click() Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください。例 0101") 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
  • ベストアンサー率65% (1615/2454)
回答No.3

> ご回答いただいたのをそのまま反映したものが下記の 「1」 ですがテストしたところシートのコピーなど何も反応しませんでした。 回答は、同一シート名に対し注意喚起し再入力を求めるという部分のコードですから、回答1の最後に「以下に新規作成のコード 」と記載しているように、質問のSheets("元本").Copy After:=Sheets("元本")以下のコードをそのまま記載してください。 > 私なりにご回答を編集追加したところ、 > シートはコピーされ 同名のシート名は「既に、同名の シートがあり再度入力して下さい。」 > までは上手くできました。 > ただしその後は下記のようなコーションが出ました。 > 解決策を再度ご指導いただけませんでしょうか。 一番大事なdo~Loopを取り除いてますから、同じシート名を見つけてもその旨表示するだけで再度入力をさせるようになっていません。その為に、重複するシート名のまま先に進み名前変更しようとしてますから当然「同じシート名で変更しようとしている」というエラーになります。

dorasuke
質問者

お礼

早速の再ご指導誠にありがとございました。 上手くできて楽しんでいます。 未熟でご迷惑かけました。

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.2

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

dorasuke
質問者

補足

ご回答いただいたのをそのまま反映したものが下記の 「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
  • ベストアンサー率65% (1615/2454)
回答No.1

以下のような感じでいかがでよう。未入力とキャンセルでは処理を中断します。 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 以下に新規作成のコード

関連するQ&A

  • VBAでコピーした時コピー元のシートをアクティブ等

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記で御指導いただいたばかりです。 http://okwave.jp/qa/q8787962.html 二つ質問があります。 1 「元本」のシートをコピーした時、コピー先がアクティブになります。 これを「元本」シートがいつもアクティブになるようにしたいのですが。 2 添付図のように最初にコピーの作業をした時は上手くゆくのですが二回目以降でこのボタンをクリックすると図のようになります。 もう一度クリックすると作動します。 同作業を繰り返すと同現象が発生します。 誠に恐れ入りますが 「1 と 2」の解決方法を御指導いただけないでしょうか。 参考に Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName Range("A2").Select Dim myBut As Object For Each myBut In ActiveSheet.Buttons If myBut.Caption = "SheetCopy" Then myBut.Delete Next End Sub

  • シートをコピーの時二つのコマンドボタン一つのみに

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 コピーしようとするシートには2ヶのコマンドボタンがあります。 2つのコマンドボタンとは下記の 「1 と 2」です。 コピーされたシートのコマンドボタン(SheetCopy)は不必要になり、 下記の 1 に↓の記述を追加したのですが二つのコマンドボタンが削除されました。 ActiveSheet.DrawingObjects.Delete 「2 クリアー」ボタンだけを残すには ↑ どういう具合に記述すればいいかを御指導いただけませんでしょうか。 宜しくお願いいたします。 参考に 1 コマンドボタン名「SheetCopy」 Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする ' 2014/10/12 dorasuke ' Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName ActiveSheet.DrawingObjects.Delete Range("A2").Select End Sub 2 コマンドボタン名「クリアー」 Sub ClearCell() Range("K3:S32").ClearContents End Sub

  • コマンドボタンをクリックしても作動せず

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロで  1 シート「元本」のコピーをコマンドボタンをクリックしても作動しません。    ボタンの所にポメイントを当てても十字に変化して固まった状態なります。  2  K3:S32の範囲で○や△がWクリックしても値を返しません。 このブックの他にはいくつかマクロがありそれらは作動しこの「元本」の下記のマクロ のみ作動しません。 今までは作動していたのですがなぜなんでしょうか。 この不具合をどうすればいいか御指導いただけませんでしょまうか。 参考に Private Sub CommandButton1_Click() Dim NewSheetName As String Dim c As Object Dim MatchFLG As Boolean Do MatchFLG = False NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で4桁の新しいシート名を入力してください。例:1月1日を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 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 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myRange As Range Set myRange = Intersect(Target, Range("K3:S32")) If Not myRange Is Nothing Then Select Case Target.Value Case "" Target.Value = "○" Case "○" Target.Value = "△" Case Else Target.ClearContents End Select Cancel = True End If End Sub

  • エクセルVBA全シートに差し込みマクロ構文

    Sheets("震圧データ").Select MsgBox "新規ブックに年月分けて" & vbCrLf & "震圧データを転記します、" & vbCrLf & "お待ちください。" Dim c As Range Dim i As Integer Dim LastRow As Long Dim NewSheetName As String, MatchFlag As Boolean Application.ScreenUpdating = False Workbooks.Add With ThisWorkbook.Sheets("震圧データ") For Each c In .Range(.Cells(4, "A"), .Cells(Rows.Count, "A").End(xlUp)) If NewSheetName <> Year(c.Value2) & "年" & Month(c.Value2) & "月" Then NewSheetName = Year(c.Value2) & "年" & Month(c.Value2) & "月" If c.Row - 2 > Sheets.Count Then Worksheets.Add after:=Worksheets(Worksheets.Count) Else Sheets(c.Row - 2).Select End If ActiveSheet.Name = NewSheetName Sheets(NewSheetName).Range("A1").Value = "年月日" Sheets(NewSheetName).Range("B1").Value = "曜日" Sheets(NewSheetName).Range("C1").Value = "A" Sheets(NewSheetName).Range("D1").Value = "B" Sheets(NewSheetName).Range("E1").Value = "C" Sheets(NewSheetName).Range("F1").Value = "時間" Sheets(NewSheetName).Range("G1").Value = "状態" Sheets(NewSheetName).Range("I1").Value = "No.1" Sheets(NewSheetName).Range("I2").Value = "記録者" Sheets(NewSheetName).Range("I3").Value = "氏名:" Sheets(NewSheetName).Range("I4").Value = "=IF(ISBLANK(A4),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I5").Value = "=""転載日""" Sheets(NewSheetName).Range("I6").Value = "=TODAY()" Sheets(NewSheetName).Range("I56").Value = "=IF(ISBLANK(A56),"""",""No.2"")" Sheets(NewSheetName).Range("I57").Value = "=IF(ISBLANK(A56),"""",""記録者"")" Sheets(NewSheetName).Range("I58").Value = "=IF(ISBLANK(A56),"""", ""氏名:"")" Sheets(NewSheetName).Range("I59").Value = "=IF(ISBLANK(A56),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I60").Value = "=IF(ISBLANK(A56),"""",""転載日"")" Sheets(NewSheetName).Range("I61").Value = "=IF(ISBLANK(A56),"""",TODAY())" Sheets(NewSheetName).Range("I111").Value = "=IF(ISBLANK(A111),"""",""No.3"")" Sheets(NewSheetName).Range("I112").Value = "=IF(ISBLANK(A111),"""",""記録者"")" Sheets(NewSheetName).Range("I113").Value = "=IF(ISBLANK(A111),"""", ""氏名:"")" Sheets(NewSheetName).Range("I114").Value = "=IF(ISBLANK(A111),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I115").Value = "=IF(ISBLANK(A111),"""",""転載日"")" Sheets(NewSheetName).Range("I116").Value = "=IF(ISBLANK(A111),"""",TODAY())" Sheets(NewSheetName).Range("I166").Value = "=IF(ISBLANK(A166),"""",""No.4"")" Sheets(NewSheetName).Range("I167").Value = "=IF(ISBLANK(A166),"""",""記録者"")" Sheets(NewSheetName).Range("I168").Value = "=IF(ISBLANK(A166),"""", ""氏名"")" Sheets(NewSheetName).Range("I169").Value = "=IF(ISBLANK(A166),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I170").Value = "=IF(ISBLANK(A166),"""",""転載日"")" Sheets(NewSheetName).Range("I171").Value = "=IF(ISBLANK(A166),"""",TODAY())" Sheets(NewSheetName).Range("H1").Value = "提出済○" Sheets(NewSheetName).Range("A57").Select Range("I6,I61,I116").Select Range("I6,I61,I116,I171").Select Selection.NumberFormatLocal = "yyyy/m/d" Columns("F:F").Select Selection.NumberFormatLocal = "[$-409]h:mm AM/PM;@" Range("G1").Select With Selection .HorizontalAlignment = xlCenter End With LastRow = Sheets(NewSheetName).Cells(Rows.Count, "A").End(xlUp).Row Sheets(NewSheetName).Cells(LastRow + 1, "A").Resize(1, 8).Value = .Cells(c.Row, "A").Resize(1, 8).Value Sheets(NewSheetName).Columns("A:I").EntireColumn.AutoFit Next 新規ブック最終シートのみ適用できますが他の月別シートに適用できておりません '↓どのような構文にしたら適用されるのでしょうか?ここからが質問です↓ If Sheets(NewSheetName).Range("A56") = "" Then Range("I56:I171").Delete Else Sheets(NewSheetName).Range("A56").Value = "年月日" Sheets(NewSheetName).Range("B56").Value = "曜日" Sheets(NewSheetName).Range("C56").Value = "A" Sheets(NewSheetName).Range("D56").Value = "B" Sheets(NewSheetName).Range("E56").Value = "C" Sheets(NewSheetName).Range("F56").Value = "時間" Sheets(NewSheetName).Range("G56").Value = "状態" End If 'ここまで! どなたかご教示お願いします .Activate End With

  • VBAのシートコピーで時間が・・・

    VBAにてシートコピーのことについて悩んでいます。 行き詰ってしまったためお助け願えないでしょうか? シートをコピーしていくコードを書いてあるものなのですがやたらとコピーに時間を要してしまいます。 私の施した処置としては当たり前かもしれませんが自動再計算の処理をしないと画面の更新を止めました。実績として全てのコピーが終わるのに1時間近くかかったものが10分くらいまで短縮できました・・・のですがやはり自分の欲としては5分以下に短縮をしたいのです。 他に良い方法はあるのでしょうか? シートの内容としてはかなり多くの数式が入った物を8枚程度コピーするものです。あまり時間が無いので大幅な改良は出来ません。 申し訳ありませんがよろしくお願いします。 時に下記のコードを追加したらすごい遅くなりました・・・ 代替案はどうしたらよいでしょうか? Private Sub CommandButton1_Click() With ActiveSheet .Protect Sheets("Piquet" & Right(.Name, 4)).Range("A1").Value = 1 Sheets("Piquet" & Right(.Name, 4)).Calculate Sheets("Piquet" & Right(.Name, 4)).Range("A1").Value = 9 Sheets("Piquet" & Right(.Name, 4)).Calculate Sheets("Piquet" & Right(.Name, 4)).Select End With End Sub

  • エクセルVBA:コピーの貼り付け先

    VBA初心者です。よろしくお願いします。 あるデータベースをセルB2に入力されている値で絞込み、 シート2に貼り付けるとき、下記の(1)がおそらく正解だと思いますが、 ★(質問1) (2)でも同じ結果が得られました。コピー先の目的地を示す「Destination:=」の部分は省略して全く問題なしと考えてよろしいのでしょうか? ★(質問2) (3)で試してみても同じ結果が得られました。range("sheet2!A1") なんて書き方は、たまたま、試してみたらできちゃった(同じ結果が得られた)のですが、使い方として問題ありませんか? ------------------------------------------------------------- (1) Sub test01() With Range("A1") .AutoFilter field:=2, Criteria1:=Range("B2") .CurrentRegion.Copy Destination:=Sheets("Sheet2").Range("A1") .AutoFilter End With End Sub -------------------------------------------------------------- (2) Sub test01() With Range("A1") .AutoFilter field:=2, Criteria1:=Range("B2") .CurrentRegion.Copy Sheets("Sheet2").Range("A1") .AutoFilter End With End Sub -------------------------------------------------------------- (3) Sub test01() With Range("A1") .AutoFilter field:=2, Criteria1:=Range("B2") .CurrentRegion.Copy Range("Sheet2!A1") .AutoFilter End With End Sub

  • VBAでシートのコピー

    お世話になっております。 VBAの未熟者ですが、個人の資料作成のためのシステムをコツコツと作っております。 今までマクロでシートのコピーをやっていたのですが、コマンドボタンでできるように変更しようとしてうまくいきません。 ファイルAの中にある幾つかのシートの内、シート「個人事業」を「請求書」ファイルの「Sheet2」にコピーしたいのです。その後名前を変更しています。 マクロのプログラムをそのままコピーしてみたのですが、[sheets("個人事業").paste]のところでエラーが出ます。 マクロとコマンドボタンではやはり設定を変更しないといけないのでしょうか?ご教授お願いします。 Private Sub CommandButton1_Click() Sheets("Sheet2").Select Windows("未請求リスト.XLS").Activate Sheets("個人事業").Select Selection.Copy Windows("請求書.xls").Activate Sheets("Sheet2").Select Sheets("個人事業").Paste Sheets("Sheet2").Name = "個人事業請求一覧" Sheets("請求書").Select End Sub 宜しくお願いします。

  • シートを選択した時に実行するマクロについて

    今下記のようにボタンを押したらマクロが実行されるようにしていますが、"退出"というシートを選択した時に実行するようにするにはどの様に書けばいいでしょうか? Private Sub CommandButton1_Click() With Range("A4").CurrentRegion .Cells(.Rows.Count + 1, 1).Select End With End Sub よろしくお願い致します。

  • VBA 別シートからコピー貼付け(複数列)

    別シートからコピー貼付け(複数列)をしたいのですが,同一シートからのコピー貼付けはネットから以下のマクロでできました。 しかし,別シートsheet1からsheet2ヘコピーで修正しましたが,「アプリケーション定義またはオブジェクト定義のエラーです。」となります。どなたかご教授よろしくお願いします。 修正したマクロ Sub sampel() Dim i As Long For i = 2 To Range("E65536").End(xlUp).Row Step 2 Sheets("sheet2").Range(Cells(i + 1, 2), Cells(i + 1, 85)).Value = _ Sheets("sheet1").Range(Cells(i, 5), Cells(i, 88)).Value Next i End Sub 参考としたマクロ http://www.excel.studio-kazu.jp/kw/20041208152106.html Sub sampel() Dim i As Long For i = 2 To Range("E65536").End(xlUp).Row Step 2 Range(Cells(i + 1, 2), Cells(i + 1, 85)).Value = _ Range(Cells(i, 5), Cells(i, 88)).Value Next i End Sub

  • VBA中の”シート名”を”アクティブシート”に変更

    いつもお世話になっております。 非常に初歩的な質問なのですが、下記の2つのVBA中のシート名をアクティブシートに変更したいのですが、 sheetName = ActiveSheet.Name で試行錯誤するもうまくいきません。 実際のコードは下記の通りです。 これらのシート名”申請書”をアクティブシートに変更したいのです。 このコードは過去にここで教えて頂いたコードで出来ればこれを修正したいので宜しくお願いします。 1.Sub 申請書登録() Dim NewBookName As String With ThisWorkbook.Sheets("申請書") Windows("1.新規・変更登録申請書(原紙)・リスト②T用.xlsm").Activate For i = 5 To Sheets("規格登録・変更リスト").Range("A1048576").End(xlUp).Row + 1 If Sheets("規格登録・変更リスト").Range("B" & i).Value = "" Then With Sheets("規格登録・変更リスト") .Range("A" & i).Value = Sheets("申請書").Range("E3").Value .Range("B" & i).Value = Sheets("申請書").Range("O3").Value .Range("C" & i).Value = Sheets("申請書").Range("E4").Value ・・・・・・・・・・・・・・・・・・・ 2.Sub 申請書保存() Dim NewBookName As String With ThisWorkbook.Sheets("申請書") NewBookName = .Range("F22").Value & " " & .Range("E4").Value & " " & .Range("A2").Value & " " & .Range("A1").Value Worksheets("申請書").ExportAsFixedFormat Type:=xlTypePDF, Filename:="\***\XXXX\1.申請書\申請書" & "\" & NewBookName End With End Sub

専門家に質問してみよう