[[20110921152619]] 『空白セルの非表示・再表示』(イッコウ) ページの最後に飛ぶ

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

 

『空白セルの非表示・再表示』(イッコウ)

 Excel2003 WindowsXP

 セルに計算式が入っているけれどもIF関数を使用してるので0の場合は空白になり
 ます。 そのような行を非表示にしたいのですが編集のジャンプでは認識しなくて
 マクロで実行したいのですが。。。。。。

 選択の列はE11:E300

 最終の使用行は311です。

 Private Sub worksheet_activate()
 Dim 範囲 As Range
 Dim i As Integer
 Dim データ数 As Integer

 Application.ScreenUpdating = False
 Set 範囲 = Range("E11:E300")
 データ数 = 範囲.Rows.Count
 i = 0
 For Each c In 範囲
 If c.Value = Empty Then
 c.EntireRow.Hidden = True
 Else
 c.EntireRow.Hidden = False
 i = i + 1
 End If
 Next
 データ数 = データ数 - i
 For i = 1 To データ数
 Range("E311").Offset(i, 0).EntireRow.Hidden = True
 Next i
 Application.ScreenUpdating = True
 End Sub

 こんな感じのは見つけたのですがこれは非表示のみなので
 再表示も作成したいのですが。
 それとこれはシートモジュールなのでどのようにすればマクロが実行するので
 しょうか?
 よろしくお願いします。


 >それとこれはシートモジュールなのでどのようにすればマクロが実行するので
 しょうか?
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html

 シートモジュール
Private Sub Worksheet_Calculate()'

 Dim 範囲 As Range, c As Range
 Dim i As long 'Dim データ数 As Integer

 Application.ScreenUpdating = False
 Set 範囲 = Range(""E11:E311"")
' データ数 = 範囲.Rows.Count

 Rows(範囲.Row & ":" & 範囲.Rows(範囲.Rows.Count).Row).Hidden =False
 For Each c In 範囲
     If c.Value = Empty Then
        c.EntireRow.Hidden = True

     End If
 Next
 Application.ScreenUpdating = True
End Sub

  勝手に解釈で E11:E311のセル値がEmptyの場合非表示 
なお このシートで再計算された時にイベントが発生するのでうっとうしいかも


 このマクロはThisWorkBookにするとどのようにすればよろしいでしょうか?
 よろしくお願いします。
 (イッコウ)

 >このマクロはThisWorkBookにするとどのようにすればよろしいでしょうか?

 この意味は?
・個別シートのイベントではなく「全シート」でおなじようなイベント処理をしたいので
 「ThisWorkbook」モジュールでイベントを受けたい?
・イベント処理ではなく、「通常のマクロ」として、表示プロシジャ、非表示プロシジャを用意して
 必要な都度、実行させたい?

 どちらかな?

 追記)上の質問に対する回答次第だけど、もし後者なら、すでにアップされているようなコードを
   標準モジュールにおいておけばいい。たとえば、

 Sub 非表示()
    Dim 範囲 As Range
    Dim c As Range
    Application.ScreenUpdating = False
    Set 範囲 = Sheets("Sheet1").Range("E11:E311")
    範囲.EntireRow.Hidden = False 'いったん全表示
    For Each c In 範囲
        If Len(c.Text) = 0 Then c.EntireRow.Hidden = True
    Next
    Set 範囲 = Nothing
    Application.ScreenUpdating = True
 End Sub

 Sub 再表示()
    Sheets("Sheet1").Range("E11:E311").EntireRow.Hidden = False
 End Sub

 ★さらに追伸) Empty での比較(IsEmptyも同様)は、数値の0でもEmptyとみなされる。
 なので、空白かどうかは、"" で比較するか 長さが0かで判定するのが無難。

 (ぶらっと)

 >個別シートのイベントではなく「全シート」でおなじようなイベント処理をしたいので
 >「ThisWorkbook」モジュールでイベントを受けたい?
 すみません。複数のシートがあるのでこちらの方が理想でしたが、、、
 (イッコウ)

 >複数のシートがあるのでこちらの方が理想でしたが、、、

 なら、ThisWorkbookモジュールで、Sheet○○○ というイベントを使う。
Private Sub Workbook_SheetActivate(ByVal Sh As Object) とか
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) とか
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) とかとか。

 (ぶらっと)

 Private Sub Workbook_SheetActivate(ByVal Sh As Object) で出来ました。
 マクロ素人なのでご質問なのですが、

 >Private Sub Workbook_SheetActivate(ByVal Sh As Object) とか
 >Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) とか
 >Private Sub Workbook_SheetCalculate(ByVal Sh As Object) とかとか。

 この使い分けはどこで見極めればよろしいのでしょうか?
 すごく初歩的な質問で申し訳ないのですが。
(イッコウ)


 いずれも Workbook_Sheet○○○。
で、シートモジュールでいえば Worksheet_○○○ にあたる。
Worksheet_○○○ については、いいよね?
もし、そこも・・・ということなら「VBA シートイベント」で検索すると、どっさり解説ページが。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html とか
http://www.k1simplify.com/vba/tipsleaf/leaf311.html とか
http://excelvba.pc-users.net/fol3/3_6.html とかとか

 (ぶらっと)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.