[[20100624190216]] 『マクロを使って条件に合わないシートを一括削除し』(キム) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロを使って条件に合わないシートを一括削除したい』(キム)
Excel2000、WindowsXP

質問内容

同じ形式にしているシートが複数あって、それらのシートの決まった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は、
 記述するべきと思っている私もアルゴリズムに夢中になっていたりすると忘れます。
 実際の仕事でも、コードレビュー時に修正されることがよくあります。

 以前にも同じ内容で意見交換させていただいたことがありました。

[[20090303232447]]

 この時、同一見解にはなりませんでした。
 が、
 私の意見は、この時と何ら変わっていません。

 一年ちょっと前ですね!!

 続く
 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.