こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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にしたいのですがどの様に書き込めば宜しいでしょうか?
重ね重ねですが宜しくお願いいたします。

投稿日時 - 2009-02-11 18:11:53

QNo.4708763

困ってます

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

全ワークシートをループしてシート名をチェックし、
該当のシートがなかったらシートをコピーします。

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

投稿日時 - 2009-02-11 18:29:21

お礼

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

投稿日時 - 2009-02-19 08:14:37

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2009-02-11 20:20:36

お礼

返答が遅れてすみません。
エラー処理はどうしてもエラーが出てしまう場合に
使用しておりますが、上記にありますように

マクロに十分慣れていないうちに使用することは
お勧めできないのですが
のように自分が意図していないエラーを見逃したときが
大変だったためあまり使用しないようにしております。
アドバイスありがとうございます。

投稿日時 - 2009-02-19 08:19:51

ANo.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) 」
を削除したら思い通りの動作になりますか?

投稿日時 - 2009-02-11 19:00:02

あなたにオススメの質問