[[20060807185622]] 『行、列の非表示』(しんちゃん) ページの最後に飛ぶ

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

 

『行、列の非表示』(しんちゃん)

 エクセル2000、OS:Win98orXPという環境です。

 条件にあったデータの列or行を非表示にするというマクロを作りたいと
 思っています。

 データは
 A列には5行目から200行目まで1〜10のデータが入っています。
 1行目にはD列〜AZ列まで1〜10のデータが入っています。
 そのほかのセルにはいろいろなデータ(ここでは関係なし)が入っています。

 ここで、1,3,7が入っている列、行を非表示にしたいと思います。

 単純にforループで条件に見合った列、行を非表示にするマクロを組むと
 点滅するように1列ずつ、1行ずつ消していくので非常に遅いのです。

 これを一気にぱっと消す方法ってなにかいい方法ありませんか?

 わたしのソース・・・初心者丸出し^^;
 For i=5 to 200
    If cells(i,1)=1 or cells(i,1)=3 or  cells(i,1)=7 Then
        Rows(i).Hidden=True
    End If
 Next i

 For i=4 to 52
    If cells(1,i)=1 or cells(1,i)=3 or  cells(1,i)=7 Then
        Columns(i).Hidden=True
    End If
 Next i

 諸先輩方宜しくお願いします。


 >点滅するように1列ずつ、1行ずつ消していくので非常に遅いのです。
 コードの始めの方に、
 Application.ScreenUpdating = False
 終わりの方に、
 Application.ScreenUpdating = True
 
 これで、画面を更新しないようにできます。
 
 (キリキ)(〃⌒o⌒)b

 キリキ 様ありがとうございます。
 早速使ってみました。点滅するような消え方はなくなりました。

 ただ、処理自体(非表示)が遅いため一瞬固まった感があります。
 消すときに、複数(該当)列、行を選択して消すって処理はできないでしょうか?

 宜しくお願いします。 しんちゃん


 これで合ってるかな・・・。
Sub MyHid()
Dim MyAry() As Variant
Dim C As Range, MyFilRowRng As Range, MyFilColRng As Range
Dim RowCnt As Long, ColCnt As Long
Dim MyAry1 As String
  
Application.ScreenUpdating = False
Set MyFilRowRng = Range(Cells(5, 1), Cells(200, 1))
Set MyFilColRng = Range(Cells(1, 4), Cells(1, 52))
'**************** 行の処理 ****************
    RowCnt = -1
    MyAry1 = ""               '初期化
    For Each C In MyFilRowRng
        If C.Value Like "[137]" Then
            RowCnt = RowCnt + 1
            ReDim Preserve MyAry(0 To RowCnt)
            MyAry(RowCnt) = C.Address(0, 0)
            MyAry1 = MyAry1 & "," & MyAry(RowCnt)
            If Len(MyAry1) > 240 Then    '配列の中の文字が240越えたら処理
                MyAry1 = Mid(MyAry1, 2)
                Range(MyAry1).EntireRow.Hidden = True
                MyAry1 = "" '初期化
            End If
        End If
    Next C
    If MyAry1 <> "" Then '処理すべき行が残っているなら処理
        MyAry1 = Mid(MyAry1, 2)
        Range(MyAry1).EntireRow.Hidden = True
    End If
     
'**************** 列の処理 ****************
    ColCnt = -1
    MyAry1 = ""               '初期化
    For Each C In MyFilColRng
        If C.Value Like "[137]" Then
            ColCnt = ColCnt + 1
            ReDim Preserve MyAry(0 To ColCnt)
            MyAry(ColCnt) = C.Address(0, 0)
            MyAry1 = MyAry1 & "," & MyAry(ColCnt)
            If Len(MyAry1) > 240 Then    '配列の中の文字が240越えたら処理
                MyAry1 = Mid(MyAry1, 2)
                Range(MyAry1).EntireColumn.Hidden = True
                MyAry1 = "" '初期化
            End If
        End If
    Next C
    If MyAry1 <> "" Then '処理すべき行が残っているなら処理
        MyAry1 = Mid(MyAry1, 2)
        Range(MyAry1).EntireColumn.Hidden = True
    End If
Application.ScreenUpdating = True
Set MyFilRowRng = Nothing
Set MyFilColRng = Nothing
End Sub

 (川野鮎太郎)

 純丸も挑戦してみました。うまくいけばいいのですが。
(純丸)(o^-')b

 Sub test()
 Dim myc As Range
 Dim myr As Range
 Dim i As Integer

 On Error Resume Next

 For i = 5 To 200
   Select Case Cells(i, 1).Value
      Case 1, 3, 7
         If myr Is Nothing Then
         Set myr = Cells(i, 1)
         Else
         Set myr = Union(myr, Cells(i, 1))
         End If
   End Select
 Next i

 For i = 4 To 52
   Select Case Cells(1, i).Value
      Case 1, 3, 7
         If myc Is Nothing Then
         Set myc = Cells(1, i)
         Else
         Set myc = Union(myc, Cells(1, i))
         End If
   End Select
 Next i 

 myr.EntireRow.Hidden = True
 myc.EntireColumn.Hidden = True

 End Sub


 純丸さんの良いですね。
 全部UNIONで括って最後に非表示するから速い!!

 (川野鮎太郎)

 わ〜い、鮎さんに誉められた〜\(^o^)/ うれちぃ!
(純丸)(o^-')b


 あ。。。。。、書いた後でUNIONがどれだけ格納できるか試すのに、
 数千行〜30000行ぐらいで試してみたら、、、、、
 う〜ん(/-_-\) Setが増えると時間が掛かるのか、それともFor Nextが遅いのか、
 今から再度検証。(^_^A;

 (川野鮎太郎)※純丸さん、上げたり下げたりですいません・・・m(_ _)m

 ありゃ(>_<)。とりあえず質問者さんの範囲ならOKということで。
(純丸)(o^-')b ※これで就寝ですzzz

 純丸 様、川野鮎太郎 様 ありがとうございます。
 とても参考になりました。純丸様のソースを拝借して、作ったところ
 望みどおりのものができたと思います。

 今回の私のデータはそれほど多くないので川野様が取り上げている点に関しては
 問題ないかと思います。

 ありがとうございました。 しんちゃん

コメント返信:

[ 一覧(最新更新順) ]


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