Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4454 / 13644 ツリー ←次へ | 前へ→

【56530】行を非表示にするときのスピードが遅い あやたろう 08/6/20(金) 1:04 質問[未読]
【56531】Re:行を非表示にするときのスピードが遅い りん 08/6/20(金) 7:10 回答[未読]
【56569】Re:行を非表示にするときのスピードが遅い あやたろう 08/6/22(日) 9:17 お礼[未読]
【56538】Re:行を非表示にするときのスピードが遅い Yuki 08/6/20(金) 10:06 発言[未読]
【56570】教えてください m(__)m あやたろう 08/6/22(日) 9:54 質問[未読]
【56571】Re:行を非表示にするときのスピードが遅い かみちゃん 08/6/22(日) 10:04 発言[未読]
【56572】Re:行を非表示にするときのスピードが遅い あやたろう 08/6/22(日) 11:10 お礼[未読]

【56530】行を非表示にするときのスピードが遅い
質問  あやたろう  - 08/6/20(金) 1:04 -

引用なし
パスワード
   こんにちは。
VBA初心者で、かなり久しぶりにVBAを触っています。

以前はver.2000 を使っていたのですが、新ver(ver.2007?)を使うことになり、
10000行程度の行のうち、
該当しない行を非表示にしようとしていますが、
かなりスピードが遅いのです。(>_<)


for i = 3 to 10000

  if trim(cells(i,"a").value)<> strSTRING then
     rows(i).select
     selectionentirerow.hidden = true
  endif

next


一行ずつ該当するか調べて、該当しなければ非表示・・・なのですが、
スピードアップする方法があるでしょうか?

今思いついたのですが、
作業画面をhidden? にした方が処理スピードが速くなるでしょうか?

よろしくお願いいたします。

【56531】Re:行を非表示にするときのスピードが遅い
回答  りん E-MAIL  - 08/6/20(金) 7:10 -

引用なし
パスワード
   あやたろう さん、おはようございます。

>以前はver.2000 を使っていたのですが、新ver(ver.2007?)を使うことになり、
>10000行程度の行のうち、
>該当しない行を非表示にしようとしていますが、
>かなりスピードが遅いのです。(>_<)

たとえばこんな感じです。

ひとつずつ消す
Sub test()
  Application.ScreenUpdating = False
  ActiveSheet.DisplayPageBreaks = False '表示が改ページプレビューなら失敗します。
  '
  For i = 3 To 10000
   If Trim(Cells(i, "a").Value) <> strSTRING Then
     Rows(i).Hidden = True
   End If
  Next
  Application.ScreenUpdating = True
  ActiveSheet.DisplayPageBreaks = True
End Sub

スクリーンの再描画と、不要なSelectをはずすと処理は速くなります。
あとは、
 まとめて消す
 計算をとめる(手動で再計算モード)
などでしょうかね。

まとめてから消す。
Sub test()
  Dim r1 As Range
  Application.ScreenUpdating = False
  ActiveSheet.DisplayPageBreaks = False '表示が改ページプレビューなら失敗します。
  '
  For i = 3 To 10000
   If Trim(Cells(i, "a").Value) <> strSTRING Then
     If r1 Is Nothing Then
      Set r1 = Cells(i, "a")
     Else
      Set r1 = Application.Union(r1, Cells(i, "a"))
     End If
    End If
  Next
  If Not r1 Is Nothing Then r1.EntireRow.Hidden = True
  Application.ScreenUpdating = True
  ActiveSheet.DisplayPageBreaks = True
End Sub

何も入っていない行3〜10000を消した感じだと、上の半分くらいの時間でした。

【56538】Re:行を非表示にするときのスピードが遅い
発言  Yuki  - 08/6/20(金) 10:06 -

引用なし
パスワード
   ▼あやたろう さん:
こんにちは。

>10000行程度の行のうち、
>該当しない行を非表示にしようとしていますが、
>かなりスピードが遅いのです。(>_<)

XL2007ではどうか分かりませんが
かなり早いですよ。

Sub Macro1()
  Dim rng     As Range
  Dim strSTRING  As String
  strSTRING = 0
  With Sheets("Sheet1")
    Set rng = .Range("A3:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
    .AutoFilterMode = False
    rng.AutoFilter Field:=1, Criteria1:=strSTRING
    rng.SpecialCells(xlCellTypeVisible).Rows.Select
    .AutoFilterMode = False
    Selection.EntireRow.Hidden = True
  End With
End Sub

【56569】Re:行を非表示にするときのスピードが遅い
お礼  あやたろう  - 08/6/22(日) 9:17 -

引用なし
パスワード
   りんさん、早速の回答ありがとうございました。

なるほど、まとめて消す方法があるのですね。
早速、月曜日に会社で試して見ます。 ありがとうございました。(*・∀・)

【56570】教えてください m(__)m
質問  あやたろう  - 08/6/22(日) 9:54 -

引用なし
パスワード
   Yukiさん、早速の回答ありがとうございました。

試してみると非常にスピードが速いので感激しました。

しかし、判らないことがたくさんありまして・・・。
(VBAヘルプで探ってみたのですが判らなかったので・・・)(>_<)


1)何故 IF文など条件分岐をさせなくても
 条件に沿った処理ができるのか?

 >>With Sheets("Sheet1")で
   シート内の処理をさせている?
   

2).AutoFilterMode = False は非表示と同じ処理なんでしょうか?


>  With Sheets("Sheet1")
>    Set rng = .Range("A3:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
>    .AutoFilterMode = False
>    rng.AutoFilter Field:=1, Criteria1:=strSTRING
>    rng.SpecialCells(xlCellTypeVisible).Rows.Select
>    .AutoFilterMode = False
>    Selection.EntireRow.Hidden = True
>  End With
>End Sub

【56571】Re:行を非表示にするときのスピードが遅い
発言  かみちゃん  - 08/6/22(日) 10:04 -

引用なし
パスワード
   こんにちは。かみちゃん です。

横から失礼します。

>1)何故 IF文など条件分岐をさせなくても
> 条件に沿った処理ができるのか?

 rng.AutoFilter Field:=1, Criteria1:=strSTRING
 rng.SpecialCells(xlCellTypeVisible).Rows.Select
がポイントです。
空白行をオートフィルタで抽出し、その行を一括して非表示にしています。

試しに、
    Selection.EntireRow.Hidden = True
のコードを削除して、どの行が選択されているか確認してみてください。

非表示にしたい行だけが選択されていると思います。

【56572】Re:行を非表示にするときのスピードが遅い
お礼  あやたろう  - 08/6/22(日) 11:10 -

引用なし
パスワード
   かみちゃんさん
ご指導ありがとうございました。

なるほど、エクセルで使用するように
オートフィルタで必要行を選択→非表示にする流れなんですね!

やっと理解できました!

Yukiさん、かみちゃんさん、りんさん
ありがとうございました!!! (*^∀^*)

4454 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free