
エクセル97です。
9行目から732行までの大きな表があります。一定の条件のとき、U列がaaaでなくV列もbbbではない行を非表示とするために下記のマクロを作ってみました。
一応思ったとおりには動くのですが行数が多いため、開始してから終了するまで5分以上かかってしまいます。このマクロのように9行目から732行まで順にやっていくのではなく、一度に非表示にするような方法はないでしょうか?
Sub TEST()
Sheets("TEST").Activate
For i = 9 To 732
If Cells(i, "U") <> "aaa" And Cells(i, "V") <> "bbb" Then
Cells(i, "V").EntireRow.Hidden = True
Else
Cells(i, "V").EntireRow.Hidden = False
End If
Next i
End Sub
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
#2です。
> tmp = "=IF(OR(U9=""eee"",V9=""fff""),1,"""")"
> としてもダメでした。これはOR条件は使えないのでしょうか?
動くハズですよ、セルに入れる時は =IF(OR(U9="eee",V9="fff"),1,"") というただの条件式ですから。
VBAで文字列に " を使うときは "" としてやらねばならないためちょっと変に見えるだけです。セルにこの関数を入れて 1 が立てば、例のマクロで非表示対象になります。
思い通りにならないとしたら条件を勘違いされているのではないでしょうか?
仕組みの説明
1.テンポラリィ範囲を取あえず表示(条件を変えて実行した場合に必要?)
2.テンポラリィ範囲に関数を一気に代入
3.テンポラリィ範囲の数値セル(行)を非表示
4.テンポラリィ範囲の関数をクリア
3 はExcelの操作でやると、テンポラリィ範囲を選択し、編集-ジャンプ-セル選択の選択オプションで「数式」の「数値」のみにチェックを入れた場合に選択される範囲です。
条件式を入れる列を追加出来るならマクロでやらなくてもオートフィルタで出来る内容ですね。
No.3
- 回答日時:
Sub test02()
For i = 1 To 732
If i Mod 10 = 1 Or i Mod 10 = 6 Then
Cells(i, "U") = ""
Cells(i, "V") = ""
End If
Next i
End Sub
を実行し、A1:T732に(同じ)データを入れ
Cells(i, "V").EntireRow.Hidden = False を省き
●(注!)不要のようです。
Sub TEST()
Sheets("sheet1").Activate
For i = 9 To 732
If Cells(i, "U") <> "aaa" And Cells(i, "V") <> "bbb" Then
Cells(i, "V").EntireRow.Hidden = True
End If
Next i
End Sub
を実行してみたところ、2秒ぐらいで終了しました。
Application.ScreenUpdating = TRUE,False も入れていません.
入れると一瞬にして終わります。当方98seでエクセル2000で数年前のCPUです。
ですからなにか別の要因で遅くなるのだと思います。
Cells(i, "V").EntireRow.Hidden = Trueを
Rows(i).EntireRow.Hidden = Trueにしてみたりしましたが変りありませんでした。
ありがとうございました。
Cells(i, "V").EntireRow.Hidden = False を省きましたらかなり早くなりましたが、数秒というわけにはいきませんでした。
No.2
- 回答日時:
5分は掛かりすぎですね。
こちらの環境ではそのままのコードで実行しても、3~4秒でした。
#1さんの回答にある Application.ScreenUpdating = False でだいぶ改善されると思いますが、、、
例は空いていそうなセルに判定用関数を入れて一気に非表示にしてます。
複雑な計算式を多用している場合はかえって遅くなるかもしれません。
Sub TEST1()
Dim tmp As Range
Sheets("TEST").Activate
Set tmp = Range("IV9:IV732")
tmp.EntireRow.Hidden = False
tmp = "=IF(AND(U9<>""aaa"",V9<>""bbb""),1,"""")"
On Error Resume Next
tmp.SpecialCells(xlCellTypeFormulas, 1).EntireRow.Hidden = True
tmp.Clear
End Sub
この回答への補足
本来は別の質問としなければいけないのかも知れませんが・・・・。
上記でU列が"eee"、またはV列が"fff"のときのみ、その行を非表示とする場合、
tmp = "=IF(OR(U9=""eee"",V9=""fff""),1,"""")"
としてもダメでした。これはOR条件は使えないのでしょうか?
ありがとうございました!
一瞬でできました!!
ただ、理屈がよくわからないのです。
U9<>"aaa"かつV9<>"bbb"のとき、そのIV列に1をいれてるのはわかりましたが・・・・。
理屈がよくわからないので別な表のOR条件に応用できませんでした。
ANDをORにかえてもだめなんですね?
No.1
- 回答日時:
行単位で表示非表示の判別をせざるを得ない以上、一度にする方法はないでしょうが、まぁアルゴリズムを見直すなら。
最初にソートさせて、U列がaaa、V列もbbbの行をまとめてしまい、それ以外を非表示させるというのが早そうかなと思います。
まず行番号を振っていつでも元に戻せるようにしておく必要がありますが。
でそれ以外の最適化のコツとしては
・メモリリソースを節約
各変数は必ず最適な型で宣言しましょう。
dim i as Long
・描画の省略
その手の作業をする場合は真っ先に
Application.ScreenUpdating = False
と画面表示を更新させないようにします。最後に
Application.ScreenUpdating = true
としておくのを忘れないように。
・分岐の最適化
IF文よりはSELECT文の方が多少効率が良いので、判定はSELECT文でネストさせたらどうかなと。
・With...End With 構文による高速化
同じオブジェクトの処理が続く場合
With Cells(i, "V")
End With
と包みましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAマクロ非表示が遅いので早くしたい
Excel(エクセル)
-
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
For Nextマクロの高速化についてご教示ください。
Excel(エクセル)
-
-
4
【VBA】複数のシートの指定した列を非表示・表示をさせたい
Excel(エクセル)
-
5
指定した条件で行セルを非表示にするVBAについて
Visual Basic(VBA)
-
6
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
7
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
8
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
9
EXCEL VBA 指定範囲内で特定の列に空白セルを含む行を非表示
Excel(エクセル)
-
10
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
11
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
12
同じマクロのプログラムなのに処理速度が違う
Visual Basic(VBA)
-
13
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
14
エクセルVBAでEdate関数は使えますか?
Excel(エクセル)
-
15
エクセルで特定の列が0表示の場合、その行を非表示にしたい
Excel(エクセル)
-
16
オートシェイプがずれる
Excel(エクセル)
-
17
excelの特定のセルの隣のセル指定について
その他(Microsoft Office)
-
18
変数を動的に作るには?
Visual Basic(VBA)
-
19
Excelのセルの色指定をVBAから配列を用いて効率的に行う方法はあり
Visual Basic(VBA)
-
20
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel関数】UNIQUE関数で"0"...
-
エクセル マクロで数値が変っ...
-
A1に入力された文字列と同じ文...
-
エクセルで昨日までの日付デー...
-
特定の文字がある行以外を削除...
-
エクセルで特定の文字列が入っ...
-
excelのデータで色つき行の抽出...
-
Excel グラフのプロットからデ...
-
エクセル 上下で列幅を変えるには
-
Excelで非表示のセルをとばして...
-
excel 小さすぎて見えないセル...
-
罫線の斜線を自動で引くマクロ
-
Excel2007で、指定範囲の行高さ...
-
エクセルVBA 最終行を選んで並...
-
Excelのフィルター後の一番上の...
-
VBAで色の付いているセルの行削除
-
エクセルのマクロで意図しない...
-
Excel ウインドウ枠の固定をす...
-
EXCEL 「最後のセル」のリセット
-
[EXCEL]ボタン押す→時刻が表に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字がある行以外を削除...
-
【Excel関数】UNIQUE関数で"0"...
-
エクセルで特定の文字列が入っ...
-
Excelのフィルター後の一番上の...
-
エクセル 上下で列幅を変えるには
-
エクセル マクロ オートフィ...
-
エクセル マクロで数値が変っ...
-
[EXCEL]ボタン押す→時刻が表に...
-
結合されたセルをプルダウンの...
-
Excel グラフのプロットからデ...
-
excelのデータで色つき行の抽出...
-
excel 小さすぎて見えないセル...
-
A1に入力された文字列と同じ文...
-
EXCELで最後の行を固定
-
Excel ウインドウ枠の固定をす...
-
エクセルVBA 最終行を選んで並...
-
VBAで色の付いているセルの行削除
-
連続データが入った行の一番右...
-
エクセル2016で時間を入力して...
-
チェックボックスをクリックし...
おすすめ情報