- ベストアンサー
特定のシートを削除する
いつもお世話になっています。 INパラメータがA~Zあり、各パラメータごとにシートを作成し、 その中に各パラメータごとのデータ表を作成しています。 このとき、表示するデータが全くないパラメータのシートを 削除したいのですが、出来るのでしょうか? 最初にシートをパラメータの数だけ作り、(シート名はパラメータの名前と同じ) そこでシート分ループさせています。 表示データの有無はプログラムにより、判断できます(Flg=1が返ってきます)。 Flg=1ならそのシート(パラメータA)を削除して次のシート(パラメータB)へ・・・ といった感じなのですが・・・。 シートの削除の仕方は載っているのですが、特定のシートを削除するには どうしたらいいのでしょう。 どなたか知ってる方、教えてください!!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 えっと、途中だけ切出しされても良く解かりませんよ。。。^^; 提示されたコードも変数や、関数が不明ですので、ハッキリ言えませんが、 上手く動かないと思います。 For Count = 1 To MaxCount 'ダメ1 SheetName = "No" & CStr(Count) Worksheets(SheetName).Select 'これは不要 Worksheets(SheetName).Activate Result = MyFunc(Count, Ret1, Ret2, Ret3) 'これの返り値Resultの使い道は? If Ret1 = 1 Then Worksheets(Count).Delete 'ダメ2 Next Count 'これは不要(あるとエラーが出て動かないと思う) Else Range("A3").Value = Ret2 Range("A4").Value = Ret3 End If Next Count ダメ1は、For Count = MaxCount to 1 Step -1 にすれば、ダメ2はそのままでもOKでしょう。 ダメ2は、Worksheets(SheetName).Delete にすれば、ダメ1はそのままでもOKでしょう。 シートが3枚以上あるブックで下の2つを比較すると、例1は失敗します。 どういう事かというと、Worksheetsにインデックスを使って削除する場合は、逆さからじゃないと インデックスがずれるからです。 '---------------------------------------------------------- Sub 例1() For i = 2 To Worksheets.Count '失敗する Worksheets(i).Delete Next i End Sub '---------------------------------------------------------- Sub 例2() For i = Worksheets.Count To 2 Step -1 '成功する Worksheets(i).Delete Next i End Sub '---------------------------------------------------------- パラメータA~Zというのは、パラメータシートから、A~Zの文字を取得しているのでしょうか? 単純にA~Zの文字を得たいのなら下記でも出来ます。 Sub 例3() cnt = 1 For i = 65 To 90 ActiveSheet.Range("A" & cnt) = Chr(i) cnt = cnt + 1 Next i End Sub あと、「(2)で取得したパラメータを元に、必要シート割り出し・作成 」の時点で不要なシート を作らないのが理想ではないかと思います。 いずれにしても、全体が解からないので外しているかも知れませんが。
その他の回答 (3)
- tamagawa49
- ベストアンサー率46% (123/265)
Flg=1の部分が良く分からなかったのですが、下のようなマクロでどうでしょう。 Sub シート削除() Dim sc As Integer sc = Sheets.Count Application.ScreenUpdating = False Application.DisplayAlerts = False For n = sc To 1 Step -1 Sheets(n).Select If Flg = 1 Then ActiveSheet.Delete Else End If Next Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub 全然ちがっていたら、ごめんなさい。では。
補足
わかりにくい質問の書き方ですみません・・・。 にもかかわらず回答下さってありがとうございます。 最初に全てのデータ表示に必要なシートを作成してから 各シート内でデータ取得処理に入り、取得データを書き込んでいます。 その中でデータ有無を判断。 判断関数の返り値(Flg)=1ならばそのシートを削除して次のシートでデータ取得・・・。 という処理をしたかったのです。 特定のシートを消す時は、そのシートを選択して『ActiveSheet.Delete』ですね。 VBAは初心者なので「わかりました!」と言えないのですが、がんばってみます。 ありがとうございました。
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 作成部分のソースがないので良く解かりませんが、 表示データの有無がわかるなら、始めからシートを 作らない方が良いような気がしますが。。。 こんな感じで作って、 Function ws_del(ws As String) As Boolean Dim i As Integer ws_del = False Application.DisplayAlerts = False On Error GoTo ER: For i = Worksheets.Count To 1 Step -1 If Worksheets(i).Name = ws Then Worksheets(i).Delete ws_del = True Exit For End If Next i ER: Application.DisplayAlerts = True End Function こんなふうに使うとか。。 Sub test() If ws_del("Sheet3") Then MsgBox "削除しました。" Else MsgBox "見つかりませんでした。" End If End Sub ハズしてるかな?
補足
わかりにくい質問の仕方ですみません・・・。 標準モジュールを使用し、以下の流れで動かしています。 (1)パラメータ取得シートのデータ書き込みシートを可視化 (2)パラメータ取得 (3)(2)で取得したパラメータを元に、必要シート割り出し・作成 (4)各シートにパラメータ書き込み (5)パラメータ取得シートを不可視化 表示データの有無は(3)の段階で判断するので、データの無いシートも 受け皿として最初に用意しています。 (3)の中の処理です。 1) パラメータA~Z、26個分をループさせる 2) パラメータを関数に渡す 3) 返り値のデータを書き込む 4) 1へ戻る この2と3の間に 2.5)関数の返り値(Flg)=1なら、現在のシートを削除して1)へ戻り、 次のパラメータを2)に渡す という処理を付け加えたいと考えています。 ********************************************** For Count=1 to MaxCount SheetName = "No" & CStr(Count) Worksheets(SheetName).Select Worksheets(SheetName).Activate Result=MyFunc(Count,Ret1,Ret2,Ret3) If Ret1=1 Then Worksheets(Count).Delete Next Count Else Range("A3").Value=Ret2 Range("A4").Value=Ret3 End If Next Count ********************************************** という感じでいいんでしょうか? 何度も質問してすみませんが、よろしくお願いします・・・。
- papayuka
- ベストアンサー率45% (1388/3066)
これって、Microsoftのどのアプリケーションの質問ですか? Excel?
補足
すみません、ExcelのVBAです。 OSはWindows2000で、Excel2000を使っています。
お礼
・・・すみません、途中で[補足する]ボタンを押してしまいました。 つけ足しです。↓ パラメータA~Zの"A~Z"は変数の意味で書いてました。 "ParamA~ParamZ"にすればよかった、と反省してます。 ホント、ややこしくわかりにくい書き方ですみません・・・。 特定のシートを消す方法はわかりました。 シートの作成なのですが、データを書き込むフォーマットが用意されており、 データの有無がわからないCount数分コピーしていました。 ので、不要シートも出来てしまうんです。 ちょっとやり方を変えてみることにします。 本当に色々教えていただき、助かりました。ありがとうございました。 また機会がありましたらよろしくお願いします(ペコリ)。
補足
わかりやすい回答をありがとうございます。 すみません、質問の書き方以前に聞き方がなってないですねm(__)m 実はExcelの他にSQLサーバを使って連携処理を取っています。 書くとややこしくなると思って省略したのですが、かえって解りにくい質問に なってしまいました・・・。 『Result=MyFunc(Count,Ret1,Ret2,Ret3)』の"MyFunc"はCountとRet1,Ret2を受け取り、 それに関するデータとデータの有無(Ret1)をレコードセットで返す ストアドプロシージャです。 なので『Set Result=MyFunc(Count,Ret1,Ret2,Ret3)』と記述しています。 (すみません、INとOUTを間違えてRet1,Ret2と書いてました。さらにややこしくさせてしまってます・・・) そして"Result"はResult.MoveFirstや、.RecordCountなどで使用します。 For Count=1 to MaxCount SheetName = "No" & CStr(Count) Worksheets(SheetName).Activate Set Result=MyFunc(Count,(略),Ret3) If Ret3=0 Then 'データが存在する場合 RowPos=5 '行指定 For i=0 to Result.RecordCount - 1 Cells(RowPos,3).Value=Result![レコードセットのフィールド名] 'Resultをセルに書き込み RowPos=RowPos+2 Next i End If Set Result=Nothing Next Count またもソースの抜粋ですみませんが、こんな感じで処理しています。