• ベストアンサー

特定のシートを削除する

いつもお世話になっています。 INパラメータがA~Zあり、各パラメータごとにシートを作成し、 その中に各パラメータごとのデータ表を作成しています。 このとき、表示するデータが全くないパラメータのシートを 削除したいのですが、出来るのでしょうか? 最初にシートをパラメータの数だけ作り、(シート名はパラメータの名前と同じ) そこでシート分ループさせています。 表示データの有無はプログラムにより、判断できます(Flg=1が返ってきます)。 Flg=1ならそのシート(パラメータA)を削除して次のシート(パラメータB)へ・・・ といった感じなのですが・・・。 シートの削除の仕方は載っているのですが、特定のシートを削除するには どうしたらいいのでしょう。 どなたか知ってる方、教えてください!!

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.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)で取得したパラメータを元に、必要シート割り出し・作成 」の時点で不要なシート を作らないのが理想ではないかと思います。 いずれにしても、全体が解からないので外しているかも知れませんが。

lovelypooh
質問者

お礼

・・・すみません、途中で[補足する]ボタンを押してしまいました。 つけ足しです。↓ パラメータA~Zの"A~Z"は変数の意味で書いてました。 "ParamA~ParamZ"にすればよかった、と反省してます。 ホント、ややこしくわかりにくい書き方ですみません・・・。 特定のシートを消す方法はわかりました。 シートの作成なのですが、データを書き込むフォーマットが用意されており、 データの有無がわからないCount数分コピーしていました。 ので、不要シートも出来てしまうんです。 ちょっとやり方を変えてみることにします。 本当に色々教えていただき、助かりました。ありがとうございました。 また機会がありましたらよろしくお願いします(ペコリ)。

lovelypooh
質問者

補足

わかりやすい回答をありがとうございます。 すみません、質問の書き方以前に聞き方がなってないですね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 またもソースの抜粋ですみませんが、こんな感じで処理しています。

その他の回答 (3)

回答No.3

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 全然ちがっていたら、ごめんなさい。では。

lovelypooh
質問者

補足

わかりにくい質問の書き方ですみません・・・。 にもかかわらず回答下さってありがとうございます。 最初に全てのデータ表示に必要なシートを作成してから 各シート内でデータ取得処理に入り、取得データを書き込んでいます。 その中でデータ有無を判断。 判断関数の返り値(Flg)=1ならばそのシートを削除して次のシートでデータ取得・・・。 という処理をしたかったのです。 特定のシートを消す時は、そのシートを選択して『ActiveSheet.Delete』ですね。 VBAは初心者なので「わかりました!」と言えないのですが、がんばってみます。 ありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

こんにちは。 作成部分のソースがないので良く解かりませんが、 表示データの有無がわかるなら、始めからシートを 作らない方が良いような気がしますが。。。 こんな感じで作って、 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 ハズしてるかな?

lovelypooh
質問者

補足

わかりにくい質問の仕方ですみません・・・。 標準モジュールを使用し、以下の流れで動かしています。 (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)
回答No.1

これって、Microsoftのどのアプリケーションの質問ですか? Excel?

lovelypooh
質問者

補足

すみません、ExcelのVBAです。 OSはWindows2000で、Excel2000を使っています。

関連するQ&A