「みんな教えて! 選手権!!」開催のお知らせ

いつもお世話になっております。
やりたいこと
ユーザフォームにテキストボックスとコマンドボタンが
設置してあります。

コマンドボタンを押すと

テキストボックスに入力されている日付の
名前で新規ワークシート作成して
その新規ワークシートのB3に日付を入力して
終了したいのですが、

以下のコードを実行すると20以上のワークシート
が作成されてしまいます。

わかる方おしえてくれませんでしょうか

On Error Resume Next

For Each wS In Worksheets
If wS.Name <> Format(TextBox1.Value, "yy年mm月dd日") Then
Worksheets.Add
ActiveSheet.Name = Format(TextBox1.Value, "yy年mm月dd日")

Range("B3").Value = Format(TextBox1.Value, "yy年mm月dd日")
End If
Next

「テキストボックスに入力されている日付の 」の質問画像

質問者からの補足コメント

  • うーん・・・

    頂きましたコードを実行すると
    確かに一つだけ作成されます。
    ありがとうございます。
    しかし もう一度コマンドボタンをクリックすると
    また、あらたに 新規作成されてしまいます。

    そこで以下のようにやりましたが、
    If TextBox1.Value <> "" Then
    If IsDate(TextBox1.Value) = True Then
    Worksheets.Add
    ActiveSheet.Name = Format(TextBox1.Value, "yy年mm月dd日")

    Range("B3").Value = Format(TextBox1.Value, "yy年mm月dd日")
    End If
    End If
    TextBox1.Value = ""

    これでもまた新規作成させます。
    新規作成されないようにするにはどうしたらよいのかおしえてくれませんでしょうか

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/06/23 15:12

A 回答 (3件)

既に同じ名前のシート名があれば、メッセージボックスにその旨表示し、


同じ名前のシート名がない場合のみ、新規作成するようにしました。

Private Sub CommandButton1_Click()
Dim name As String
name = Format(TextBox1.Value, "yy年mm月dd日")
If NameExists(name) = False Then
Worksheets.Add
ActiveSheet.name = Format(TextBox1.Value, "yy年mm月dd日")
Range("B3").Value = Format(TextBox1.Value, "yy年mm月dd日")
Else
MsgBox (name & "は既に存在します")
End If
End Sub


Public Function NameExists(ByVal name As String) As Boolean
Dim ws As Worksheet
NameExists = True
For Each ws In Worksheets
If ws.name = name Then Exit Function
Next
NameExists = False
End Function
    • good
    • 0
この回答へのお礼

返信遅れて申し訳ありません
希望通りのコードありがとうございました。

お礼日時:2021/06/23 19:14

こんにちは



う~~ん・・・

シート名が存在するかをチェックしようとしているのだと思いますけれど、シート数分のループの中で
>Worksheets.Add
とやっているので、チェックに該当するシートが存在しないと、ループの数だけシートが作成されることになります。
その結果が、
>20以上のワークシートが作成されてしまいます。
ということでしょう。

また、ご提示の処理のままだと、仮に、同じシート名がすでに存在していても、「全シート数 - 1」の新規シートが作成されることになっています。

処理手順を以下のように考えてみてください。
1)ループで全部のシート名に該当する名がないことをチェック
2-1)存在しなければ、新規シートを作成
2-2)存在する場合は???(ご提示の処理には記述されていません)
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2021/06/23 19:14

以下のコードだけで良いかと。


Worksheets.Add
ActiveSheet.Name = Format(TextBox1.Value, "yy年mm月dd日")

Range("B3").Value = Format(TextBox1.Value, "yy年mm月dd日")
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2021/06/23 19:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報