• ベストアンサー

特定のシートを削除する

いつもお世話になっています。 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

  • マクロ 特定のシート以外を削除する

    いつも回答して頂きありがとうございます。 特定のシート以外を削除するマクロを作成して動作させたのですが、削除する時に『選択したシートにデータが存在する可能性が・・・』と聞いてきます。これを無視して削除を行わせたいのですがどうすればよろしいでしょうか?御指導の程宜しくお願い致します。 Sub シートの削除() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "データ元" And ws.Name <> "集計用" Then ws.Delete End If Next End Sub

  • シート内の特定の列に入力されている文字を判別し、条件に合わない行を削除する

    シートの特定列(ここではG列)に入っている文字を判別して、不要な列を削除するマクロを考えています。 G列にはさまざまな文字が入っていますが、その中で"甲"、"乙"、"○"、"優"、"良"とある行だけを抽出して(G列に左記以外の文字が入っている行は削除して)クリップボードに取り込めれば成功です。 抜き出したくない文字はいろんなパターンがあり、「特定の文字を検索して該当行を削除」ということができません。 データはA1-K1までがヘッダ、A2以下が検索したい元のデータです。 少なくともA列はA2以下、表の終わりまでデータがぎっしり詰まっているので、表全体のサイズは取得できます。 そこで、取得したforでループを作ってみたのですがうまく動いてくれません。 マクロの技術としては基本中の基本のことのように思えますが、どこをどう組めばよいのでしょうか? 漠然とした質問で申し訳ありませんが、よろしくお願いします。

  • 不特定のシートをマクロで削除を

    いつもお世話になります WINDOWS7 EXCELL2010 です。 シート「記入」にデーターを入力してそのデーターをいくつかの振分のシートに転記しています。 条件 削除したい 1 0000    の4桁のシート名のいずれかのシートを削除   ※例えば 11月4日のシート名は 1104 の4桁になります。         1月1日は 0101 となります。        今月で言えば 1101 ~ 1130 の30枚のシートがあります。 削除しない 1 文字名   のシートは削除しない 2 1 ~ 12 のシートは削除しない 上記の削除したいの方法は私なりの考えで2通り考えました。 他にいい方法があればおすすめ願えればありがたいです。 その1~ 00 の4桁のシート名が削除の対象ですので、 例えば今月で言いますと ~1031(10月31日分) 先月までのシートをマクロで削除する方法 その2~      添付図のようにB列に○のあるシートのみをマクロにて削除する方法 抽出するマクロは下記です。 Sub アクティブセルからシート名一覧を作成する() Dim sh As Object Dim row_num As Long Dim col_num As Long If MsgBox("アクティブセルから下にシート名一覧を作成してもいいですか?", vbYesNo + vbDefaultButton2) = vbNo Then Exit Sub row_num = ActiveCell.Row col_num = ActiveCell.Column For Each sh In ActiveWorkbook.Sheets Cells(row_num, col_num).Value = sh.Name row_num = row_num + 1 Next sh End Sub 小生の考えの その1~ その2~ または他の方法でいいアイディアがありましたら御指導いただけませんでしょうか。 宜しくお願いします。

  • シート作成毎の削除方法

    30枚シートを作成し5シート毎に新規ブックで保存をし、アクティブシートに新規で保存した分は 削除し、新たに5シート毎に新規ブックで保存し。。を繰り替えし30枚シートを6ブックに分けたいのですが うまくいきません。 初めにインデックスを作成しているのでワークシートa以降から5シート毎に削除したいのですが・・ 下記のプログラムをループの中に入れて実行させたいのですが、'★からの命令でaシート以降5シート毎に削除 したいのですが削除すらできません。。 何かアドバイスがありましたらお願い致します。               list_cnt = list_cnt + 1 If list_cnt = 5 Then ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "【●●】分析資料.xls" ’★ ActiveWorkbook.Worksheets.Delete After:=Worksheets("a") End If

  • シート削除

    ワードのBOOKに2シート表示されていて、1枚目は文字が入力されているのですが、2枚目は文字は入ってなく、削除したいのですができません。 賞状を作成しているので、賞状の模様のみ2枚目シートに最初から表示されているのですが、それを消すことも出来ません。 どのようにしたら、2枚目のシートを削除することが出来るのでしょうか? 早急に教えていただきたいのですが、宜しくお願いします。

  • 特定のシートが削除されたときにラベルを非表示にしたい

    現在Excel VBAでの開発を行っている者です。 そこで、特定のシートを削除したときにラベルを非表示したいのですが、どうしたらいいかわかりません。 どなたかご教授していただけないでしょうか??

  • 特定のシートの削除を禁止したい(ブックの保護でなく)

    Excelについて教えて頂きたいことがあります。 シート名でマクロを組んでいるので、誤ってシートを消されてしまうとエラーになってしまいます。 但し、外部データ取り込む為に、一時的にシートを挿入し、既存のシートにデータを転記し終わったら挿入したシートを削除するという機能が必要であるため、ブックの保護が出来ません。 ブックの保護をして、上記部データ取り込みのマクロを実行したらやはりエラーになってしまいました。 ブックの保護ではなく、特定のシートのみ削除を禁止する方法をご存知の方がいらっしゃれば教えて頂けませんか? または、上記外部データ取り込み用のシートのみ挿入、削除を認めるという方法でも結構です。 “外部データ取り込み用のシートの挿入→削除”操作以外は、既存のシート構成を保護したいのですが、どうすれ良いか分からず困っています。 ご教授下さい。

  • 不特定のシートをマクロで削除を ~2

    いつもお世話になります WINDOWS7 EXCELL2010 です。 御指導を仰ぎたいのは、 参照図で言いますとシート名「シート名一覧」のA列に下記のマクロで抽出されたシート名の一覧があります。 このシートのB列に削除したいシートに○(例えばB16 B17)を入れるとマクロでそのシートが削除されるマクロが可能であれば是非ご教授いただけませんでしょうか。 抽出するマクロは下記です。 Sub アクティブセルからシート名一覧を作成する() Dim sh As Object Dim row_num As Long Dim col_num As Long If MsgBox("アクティブセルから下にシート名一覧を作成してもいいですか?", vbYesNo + vbDefaultButton2) = vbNo Then Exit Sub row_num = ActiveCell.Row col_num = ActiveCell.Column For Each sh In ActiveWorkbook.Sheets Cells(row_num, col_num).Value = sh.Name row_num = row_num + 1 Next sh End Sub 宜しくお願いいたします。

  • エクセルのSheet削除について

    お尋ねします。 VBAでマクロを作成中に画像のように「Sheet15」というのが作成されました。 アイコンは「ThisWorkBook」と同じです。 右クリックして「オブジェクトの表示」を選んでも他のシートが表示されます。 エクセルの画面上にはシートとして表示されていません。 削除したいのですが、 右クリックで表示されるメニューの「Sheet15の解放」はグレーアウトして押せません。 削除する方法があれば教えてください。 マクロでの削除でも結構です。 よろしくお願いします。

  • ExcelのVBAでシート内にある、特定の罫線だけを削除したい。

    ExcelのVBAでシート内にある、特定の罫線だけを削除したい。 2003を使用しています。ここのサイトで罫線に関する質問をし解決に至りましたが、もうひとつお願いしたいことがあるので、よろしくお願いします。 ある範囲(例としてA1セルからM50セルの範囲)内に色々な罫線や図形が表示されているのですが、 その中から特定(例として太さ5ポイントの普通の赤罫線)だけを削除するコードの記述が、色々試してみたのですが出来ませんでした。 どんな記述や展開をして書くのかもイメージがわきません。 よろしくお願いいたします。

専門家に質問してみよう