[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『行、列の非表示』(しんちゃん)
エクセル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.