プロが教えるわが家の防犯対策術!

教えてください。

VBAに関しての質問です。
全くの知識がないので教えていただきたいです。
エクセルワークシートに以下の機能を追加している状態です。

For Each ws In Worksheets
If ws.Name = "データ" Then
wsChkflg = True
End If
Next
If wsChkflg = True Then
ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
Else
ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
End If

Set wsNew = ThisWorkbook.Worksheets("データ")

「データ」というシートが作成、追加されるのですが、同じシート名で新規作成した時に
エラーが出てしまいます。そのエラーを出さないようにすため、ダイアログ等も出さずに既存のシートを強制的に削除する機能を追加したいのです。

VBAの知識がなくて困っています。
何か良い方法がわかる方いらっしゃいましたらお力を貸してください。

よろしくお願いいたします。

A 回答 (3件)

なんだ、宿題を代わりにやって欲しいご相談ですか。

それならお友達に、目の前でやってもらいながら教わった方がいいですよ。あなたも何を情報提供したらいいのかも判らずに、ぐだぐだになるのも大変でしょう。


>「実行時エラー 91
>オブジェクト変数またはwith ブロック変数が設定されていません。」
>となってしまいました。

回答した通りに出来ていない、間違ったことをやっている、または他の関係ない所でエラーが出ているのが原因です。回答したマクロには、そういうエラーが出る要因はありません。
そもそも、「いまはどんなマクロを動かしていて」、具体的にどこの行でエラーが出ているのですか?



それとも、何をしなさいと言われているのかも理解できていないのでしょうか。

1.ここからここまでのマクロを消す
2.消したところに回答のマクロをコピー貼り付ける
3.実行する

それから、
4.エラーが出たら「デバッグ」をクリックする
5.マクロの画面が開くので黄色くなった行を確認する
6.確認した黄色くなったマクロを含むマクロの範囲をコピーして、改めて新しいご相談として投稿してみる
  その際は、この行でこういうエラーが出ています、と目に見える様子をキチンと情報提供する。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

宿題というわけではないのですが、おっしゃる通りですね。
ここで質問するような内容ではありませんでした。。
申し訳ありません。
質問する側としての、情報や質問事項の理解度も曖昧なまま
だったので、頂いたアドバイスを基にもう少し勉強しようと思います。

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

お礼日時:2012/09/30 20:06

既に指摘されているように無意味なマクロになっているので、


----------ここから
For Each ws In Worksheets
If ws.Name = "データ" Then
wsChkflg = True
End If
Next
If wsChkflg = True Then
ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
Else
ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
End If
----------ここまで

丸ごと消します。
代わりにその部分に、

application.displayalerts = false
on error resume next
worksheets("データ").delete
on error goto 0
application.displayalerts = true
thisworkbook.worksheets.add(after:=worksheets(worksheets.count)).name = "データ"

と書いておきます。

この回答への補足

ありがとうございます。
試してみたのですが、

「実行時エラー 91
オブジェクト変数またはwith ブロック変数が設定されていません。」

となってしまいました。

----------ここから
For Each ws In Worksheets
If ws.Name = "データ" Then
wsChkflg = True
End If
Next
If wsChkflg = True Then
ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
Else
ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
End If
----------ここまで

上記部分以外にも前後にマクロが入力してあるのですが、
それが影響しているのでしょうか。。

課題で出題されているので、どこまで記載してよいかわからず抜粋してしまったのが
原因でしょうか。

上手く質問内容の情報を提供できずに申し訳ありません。。

補足日時:2012/09/30 18:51
    • good
    • 1

If wsChkflg = True Then


 ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
Else
 ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
End If
の部分でwsChkflgの値によらず同じ処理をしているようですが、意図は?

また
For Each ws In Worksheets
の前に
wsChkflg = False
にしてますか?

この回答への補足

本当に無知ですみません。

>If wsChkflg = True Then
>ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
>Else
>ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ"
>End If
>の部分でwsChkflgの値によらず同じ処理をしているようですが、意図は?

上記のマクロは元々今回のワークシート追加されてあった機能で、
意図がわかりませんでした。

>For Each ws In Worksheets
>の前に
>wsChkflg = False

してないです。。

補足日時:2012/09/30 18:15
    • good
    • 0
この回答へのお礼

迅速に対応いただきありがとうございました。

お礼日時:2012/09/30 20:07

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

このQ&Aを見た人はこんなQ&Aも見ています