• ベストアンサー

EXCEL VBAにてのワークシート作成

エクセルのVBAにてワークシートを作成することで困っています。 自分で書き込んだのは Private Sub CommandButton1_Click() Worksheets("原紙").Copy ActiveSheet.Name = TextBox1 Worksheets.Add After:=Worksheets(2) End Sub Private Sub UserForm_Initialize() TextBox1 = Format(Date, "yy.mm.dd") End Sub 実行したいことはCommandButton1クリック時に 左から2番目にあるワークシート 原紙を テキストボックス1に入力されている(日付) 名前を付けて左から3番目に新規で作成したいのですが 思うように動かずエラーが出てしまいます。 どの様に修正すれば宜しいでしょうか? またクリック時にすでにテキストボックス1と同じ 名前のワークシートが存在した場合はそのワークシートを Activeにしたいのですがどの様に書き込めば宜しいでしょうか? 重ね重ねですが宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

全ワークシートをループしてシート名をチェックし、 該当のシートがなかったらシートをコピーします。 Dim ws As Worksheet Dim wsmei As String Dim bl As Boolean wsmei = Me.TextBox1.Value bl = False For Each ws In ThisWorkbook.Worksheets '全ワークシートをループ If ws.Name = wsmei Then 'テキストボックスの値と同じだったら ws.Activate 'アクティブにする bl = True Exit For 'ループを抜ける End If Next ws If bl = False Then 'テキストボックスの値のシートが無かったら Worksheets("原紙").Copy After:=Worksheets(2) 'シートコピー ActiveSheet.Name = Me.TextBox1.Value 'シート名変更 End If

77TAKETAKA
質問者

お礼

返答が遅くなりましてすみません。 ありがとうございます。 質問内容がわかりにくかったと思いますが 意図を汲んでいただき、尚且つ説明もありましたため 内容も理解できました。 プログラムもやりたかったことを全て対応して頂きました。

その他の回答 (2)

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.3

>またクリック時にすでにテキストボックス1と同じ >名前のワークシートが存在した場合はそのワークシートを >Activeにしたいのですがどの様に書き込めば宜しいでしょうか? この部分は、marbinさんが#1で書かれているやり方が正攻法です。 マクロに十分慣れていないうちに使用することはお勧めできないのですが、「エラー処理」を使って以下のようにすることもできます。 Private Sub CommandButton1_Click() On Error GoTo NewSheet 'これ以降のプログラムでエラーが出たら「NewSheet:」から実行 Worksheets(TextBox1.Value).Select 'とりあえずシートを選択してみる ' TextBox1の名前のついたワークシートが ' あるとき⇒そのまま実行される ' ないとき⇒エラーになる Exit Sub 'このSUBの実行を終了 NewSheet: 'エラーが出たら、ここから実行される Worksheets("原紙").Copy After:=Worksheets(2) ActiveSheet.Name = TextBox1 End Sub

77TAKETAKA
質問者

お礼

返答が遅れてすみません。 エラー処理はどうしてもエラーが出てしまう場合に 使用しておりますが、上記にありますように マクロに十分慣れていないうちに使用することは お勧めできないのですが のように自分が意図していないエラーを見逃したときが 大変だったためあまり使用しないようにしております。 アドバイスありがとうございます。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.2

はじめまして >思うように動かずエラーが出てしまいます。 まず「どのようにしたいのか」と「実際にはどうなるのか」を教えてください。 また、「どのラインでエラーになるのか」と「エラーメッセージ」が分かると回答がしやしくなります。 >Worksheets("原紙").Copy ヘルプに「引数 Before と引数 After の両方を省略した場合は、新規ブックが自動的に作成され、シートはそのブック内にコピーされます。」とあります。 従って、このプログラムですと、新しいブックに「原紙」というシートが1枚だけあるブックが作られます。 この新しいブックに対して Worksheets.Add After:=Worksheets(2) を行おうとしますが、「2枚目のシート」は存在しません。 そのために「インデックスが有効範囲にありません」というエラーが出ます。 「Worksheets.Add After:=Worksheets(2) 」を Worksheets("原紙").Copy After:=Worksheets(2) に変更し、 「Worksheets.Add After:=Worksheets(2) 」 を削除したら思い通りの動作になりますか?

関連するQ&A