[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロを使って条件に合わないシートを一括削除したい』(キム)
質問内容
同じ形式にしているシートが複数あって、それらのシートの決まった1つのセルの値がゼロだったらそのシートを削除し、値が入っているシートのみを残すように指示する
マクロを設定することは可能でしょうか?
>それらのシートの決まった1つのセルの値がゼロだったら そのセルが、A1だったらこんな感じでしょうか? Sub test() Dim mysh As Worksheet For Each mysh In Sheets If Sheets(mysh.Name).Range("A1").Text = 0 Then Application.DisplayAlerts = False Sheets(mysh.Name).Delete Application.DisplayAlerts = True End If Next mysh End Sub ※元に戻せませんので、別ファイルで試してください。 (キリキ)(〃⌒o⌒)b
ちょっと気になったので・・・。 Dim mysh As Worksheet For Each mysh In Sheets
これ、もしチャートシートやダイアログシートがあると、エラーになりますよ!!
Sub test() Dim mysh As Worksheet On Error Resume Next Application.DisplayAlerts = False For Each mysh In Worksheets If mysh.Range("A1").Text = 0 Then mysh.Delete Next mysh Application.DisplayAlerts = True set mysh=nothing On Error GoTo 0 End Sub
セルの値ですから、Worksheetsコレクションをサーチでよいですよね?
ichinose
そうなんですか。。。 ありがとうございます、勉強になります^^ >set mysh=nothing これは、特別な意味があるのでしょうか? 本来 Worksheet の変数宣言した場合は必要なのでしょうか? いつも、書いていないもので気になりました。 (キリキ)(〃⌒o⌒)b
>いつも、書いていないもので気になりました。 正直、プロシジャー内で宣言されたオブジェクト変数でもSet xxx=Nothingは、 記述するべきと思っている私もアルゴリズムに夢中になっていたりすると忘れます。 実際の仕事でも、コードレビュー時に修正されることがよくあります。
以前にも同じ内容で意見交換させていただいたことがありました。
この時、同一見解にはなりませんでした。 が、 私の意見は、この時と何ら変わっていません。
一年ちょっと前ですね!!
続く ichinose
VBAでは、外部コンポーネントを利用することで難しい処理を簡単にすることができていますよね? (FilesystemObject Dictionary、正規表現、etc) でも、それらにもバグがないとは言い切れません。 VBAのクラスモジュールを外部コンポーネントに見立てて わざとエラーになるコードを作成し、検証してみます。
新規ブックにて、クラスモジュールを作成してください(Class1) このClass1のモジュールに
Option Explicit Private a As Long Private Sub Class_Terminate() a = a / 0 End Sub
Thisworkbookのモジュールに
Option Explicit Function getobject() Set getobject = New Class1 End Function
「ツール」----「VBAProjectのプロパティ」とクリックしてください。 VBAProjectプロパティ ダイアログが表示されます。
「保護」タブにて、「プロジェクトを表示用にロックする」にチェックを入れ、 パスワードを設定してください、パスワードは、a にしておきましょう。 設定後、OKをクリックしてください。
Excelに戻って、名前をつけて保存してください。 「ファイルの種類」として、「Microsoft Excel アドイン (*.xla)」を選択してください。 保存フォルダが変わりますが、そのまま表示フォルダに保存します。
ファイル名は、clstest1.xla と命名してください。
同じブックを今度は、Clstest2.xla として保存してください。
一度、Excel本体を閉じてから、再度Excelを立ち上げてください。
「ツール」----「アドイン」と起動して、アドインダイアログを表示させてください。 アドイン一覧に先に作成した Clstest1 と Clstest2 があるはずです。 二つにチェックを入れてOKをクリックしてください。
また、Excel本体を閉じてから、再度Excelを立ち上げてください。
新規ブックの標準モジュールに
Sub test1() Dim g0 As Long Dim aa As Object Dim bb As Object Set aa = Workbooks("clstest1.xla").GetObject Set bb = Workbooks("clstest2.xla").GetObject For g0 = 1 To 10000 DoEvents '実際には、ここで aaやbbのプロパティやメソッドを使ったコードが展開されているとします。 Next End Sub
上記のTEST1は、わざとエラーが発生するコードになっています。 Test1を実行してみてください。 オーバーフローしました というエラーメッセージが表示されます。 これだけのコードだと、オブジェクトに問題があるかも? 想像できるかも知れませんが、もっとコード量が多ければどうですか? 直ちに 利用しているオブジェクトに問題があると想像は付かないと 思います。 しかも、開発時には動作したのに、OSの更新後にエラーになった (↑これに気づかない) なんてことを想像してください。 オブジェクトは単体で機能追加やバージョンアップできますからね!!
同じ標準モジュールに
Sub test2() Dim g0 As Long Dim aa As Object Dim bb As Object Set aa = Workbooks("clstest1.xla").GetObject Set bb = Workbooks("clstest2.xla").GetObject For g0 = 1 To 10000 DoEvents '実際には、ここで aaやbbのプロパティやメソッドを使ったコードが展開されているとします。
Next Set aa = Nothing Set bb = Nothing End Sub
Test2を実行してみてください。 Set aa = Nothing でオーバーフローしました というエラーが見つかり、aaに問題があるのかと 想像できます。 よね?
実際には、オブジェクトに、オブジェクトの終了処理のバグは少ないですが 可能性は、0ではありません。
これは、Set xxx=Nothing
を入れておいたほうがメンテが楽だという場合の一例です。
ichinose@日本決勝進出すごい
マクロを使い始めたばかりなので色々と勉強中です。
また機会がありましたらご指導よろしくお願い致します。(キム)
ichinoseさん、自分には難しすぎてよくわからないのが本音です。。。 でも凄く勉強になりました。 ありがとうございます。 キムさん、スレをお借りしました。 (キリキ)(〃⌒o⌒)b 決勝進出おめでとう♪(寝不足www)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.