[[20050205133736]] 『配列変数に入れて行の非表示』(川野鮎太郎) ページの最後に飛ぶ

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

 

『配列変数に入れて行の非表示』(川野鮎太郎)

 みなさん、お疲れ様です。
 またまた質問があってやってきました。

 質問:マクロで配列変数に入れた値を元にして、その行を一気に非表示にすることは出来ますでしょうか。

 例:MyAry() と言う配列変数に格納された
 MyAry(0) が 2
 MyAry(1) が 5
 MyAry(2) が 10 があったとしたとき、
 行番号2,5,10 を非表示にするにはどのようにしたら良いでしょうか。
 以下のようにループでやるのは出来るのですが、行が多くなったら時間がかかるもので、
 一気に出来ないものかと悩んでおります。

 For i = 0 To UBound(MyAry)
     Rows(MyAry(i)).EntireRow.Hidden = True
 Next i

 よろしくお願いします。m(._.)m ペコッ

 「わたしなら」こんな感じかなぁ。
早いかどうかはようわからん。
 Sub 複数行非表示()
     Dim MyAry
     Dim MyStr As String

     MyAry = Split("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31", ",")
     For i = 0 To UBound(MyAry)
         MyStr = MyStr & MyAry(i) & ":" & MyAry(i) & ","
     Next i
     MyStr = Left(MyStr, Len(MyStr) - 1)
     Range(MyStr).EntireRow.Hidden = True

 End Sub
(みやほりん)


 みやほりんさん、ありがとうございます。m(._.)m ペコッ
 上記のコードを見て、はっ!っと気が付きました。以前に同じような内容(行の幅を変更)で、
 自分で回答していました_/ ̄|○ il||li
 でも、同じようにしてやってみたところ・・・・1000行もあったらエラー_/ ̄|○ il||li
 やっぱりループさせないと出来ないみたいです(^_^A;
 お手数をお掛けしました。m(._.)m ペコッ

 (川野鮎太郎)

 既に解決された様ですが、例によって「私なら」ですが、、、
私のオンボロ PC 20000行で約9秒ほどでした。
こんなことでしょうか?
Option Explicit
Sub てすと()
Dim MyAry() As Variant
Dim i As Long, MyTimer As Single
ReDim MyAry(1 To 20000, 1 To 1)
MyTimer = Timer
With Worksheets("Sheet1")
    .Cells.EntireRow.Hidden = False
    .Columns("A:A").Clear
    For i = 1 To UBound(MyAry)
        If i Mod 2 = 0 Or i Mod 5 = 0 Or i Mod 10 = 0 Then
            MyAry(i, 1) = 1
        End If
    Next i
    With .Range("A1").Resize(UBound(MyAry))
        .Value = MyAry
        .SpecialCells(2, 1).EntireRow.Hidden = True
    End With
End With
MyTimer = Timer - MyTimer
MsgBox Format(MyTimer, "#,##0.00") & "秒"
End Sub
(SoulMan)

 うーん、衝突。

 未検証ですが
仮にみやほりんさん提示の方法が速度的に有利だったなら
その方法で制御可能な上限行をテストしつつ見極めて、
その行に至ったら一度設定、で、再度最初から処理みたいなコードにしても良いかも知れません。

 すなわち、コードを借りますが仮にその手法での上限が100行だとした場合、
     MyStr = "" '初期化
     For i = 0 To UBound(MyAry)
         MyStr = MyStr & MyAry(i) & ":" & MyAry(i) & ","
         if (i + 1) mod 100 = 0 then '100行単位で処理
              MyStr = Left(MyStr, Len(MyStr) - 1)
              Range(MyStr).EntireRow.Hidden = True
              MyStr = "" '初期化
         end if
     Next i
     if MyStr <> "" then '処理すべき行が残っているなら処理
         MyStr = Left(MyStr, Len(MyStr) - 1)
         Range(MyStr).EntireRow.Hidden = True
     end if
とか。
(ご近所PG)←EntireRowって何?状態かつすべて未検証失礼…


 Manちゃんのを自分のに当てはめて確かめている間に、ご近所さんまで^^
 To Manちゃん
 なるほどなるほど、セルに一度値を入れてそれを対象にするんだ。
 確かにこれなら、値だけの保持だから一杯いけるんだ。^^v
 おまけに抜群の速さ!!8000行の実行で 0.5秒 ループさせたら・・・・13秒_/ ̄|○ il||li

 ご近所さんの方法を今から試してきます^^
 また報告しますm(._.)m ペコッ

 (川野鮎太郎)


 キタタタタ━(゚(゚ω(゚ω゚(☆ω☆)゚ω゚)ω゚)゚)タタタタタタ━!!!!!

 ご近所さんの案で、100も大きかったので50でやったらまたダメで30で区切ってみました。
 さすがに30個ずつ分割じゃ、時間掛かるだろうと思ったら・・・・
 ナント!!! 0.2秒 !!!

 こんなことも出来るんですね。勉強になりましたm(._.)m ペコッ

 ※これを見て、スムーズにご近所さん案に書き換えできたみたいに見えますけど・・・、
 実は配列を ReDim Preserve MyAry(0 To RowCnt) って感じで入れていたので
 理解するのに時間が掛かった_/ ̄|○ il||li
 (T▽T)アハハ!

 でもやっぱり上手く動いたときは嬉しいし、楽しいですね^^v

 (川野鮎太郎)

 すみません。いまいちわかってないみたいなんだけど、、
 ご近所PGさんの方法で例えば10000行まで処理するのは、どうするんですか?
 >EntireRowって何?
 ちなみに、これは行全体という意味です。 
(SoulMan)


 ごめんなさい。何か比較したみたいな形になって、気分を悪くさせちゃったみたいで。ペコリ(o_ _)o))

 そういう意味ではなく、Manちゃんがいつも言ってるこれを見たみんなのために、
 こんな方法もある、速度もこんなでしたって結果報告だったまでで。( ̄ー ̄;Aアセアセ・・・

 実は何をしようとしてたかってのが、2,3日前の質問で
[[20050203115938]]『オートフィルタの色によるフィルタ』(ホリ) 

 があったんだけど、それを試してたのです。

 一応抽出だけやってみたのが、教えてもらったのを参考にした以下のファイルです。
 見てもらえば判るけど、今はアップサイズの都合上4000行にしてるけど、
 どれも20000行でもできました。
http://skyblue123.hp.infoseek.co.jp/Excel/ColorFilter.xls

 (川野鮎太郎)

 なるほど、理解できました。しかし、熱心ですなぁ、、改めて見直しました。m(._.)m ペコッ
直書きの方が早いってことやね。実は、これ、私もやりかけた(頭の中で)んだけど、、
イメージが出来なかったので( -.-)ノ⌒-~ポイしてました。
また、イメージが出来上がったら挑戦してみたいですね。
あっ、全然気分悪くしてないですからね。(;^_^A あせあせ・・・
ではでは、頑張ってください。ありがとうございました。m(__)m
(SoulMan)

 うまくいったようで何よりです。
私は単にみやほりんさん提示の方法をたくさんの行に対応させただけですんで…
どうにもまだこういうエクセル特有のオブジェクトを使った処理はスムーズに思いつかないす。

 >>EntireRowって何?
 >ちなみに、これは行全体という意味です。 
なるほど、行選択時の処理を行うときにつくのね。説明感謝です。
(ご近所PG)

コメント返信:

[ 一覧(最新更新順) ]


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