エクセル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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Excel(エクセル) R列の1111/11/11以外、且つQ列の×の条件で該当行のAからAE列までオレンジに塗りつぶす 2 2022/07/02 10:18
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VBAマクロ非表示が遅いので早くしたい
Excel(エクセル)
-
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
エクセルで特定の列が0表示の場合、その行を非表示にしたい
Excel(エクセル)
-
6
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
7
指定した条件で行セルを非表示にするVBAについて
Visual Basic(VBA)
-
8
エクセル関数で日付かどうかの確認?
Excel(エクセル)
-
9
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
10
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
11
Excel2000/VBA:値と書式のみ貼り付けたい。
Excel(エクセル)
-
12
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
13
エクセルの保護で、列の表示や非表示が加納にするには
Excel(エクセル)
-
14
エクセルで特定の値を含む列のみVBAで非表示にしたい
Excel(エクセル)
-
15
DoEventsがやはり分からない
Visual Basic(VBA)
-
16
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
17
Rangeメソッドは失敗しました。globalオブジェクトについて
Excel(エクセル)
-
18
エクセルで特定の文字列が入った行を非表示にしたい
Excel(エクセル)
-
19
エクセルでエラーが出て困っています。
Excel(エクセル)
-
20
プロシージャからイベントをコールする
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル マクロ オートフィ...
-
[EXCEL]ボタン押す→時刻が表に...
-
エクセルで特定の文字列が入っ...
-
エクセル 上下で列幅を変えるには
-
excelのデータで色つき行の抽出...
-
特定の文字がある行以外を削除...
-
Excel グラフのプロットからデ...
-
【Excel関数】UNIQUE関数で"0"...
-
結合されたセルをプルダウンの...
-
サイズの違うセル 並べ変え
-
VBAで色の付いているセルの行削除
-
エクセル 時間の表示形式AM/PM...
-
エクセルマクロで偶数行(又は...
-
Excel2007で、指定範囲の行高さ...
-
エクセルVBA 最終行を選んで並...
-
エクセルVBAのEntireRow.Hidden...
-
セルの色によって条件文をつけ...
-
AのセルとB行を比較して、一致...
-
エクセル マクロで数値が変っ...
-
色付き行の非表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル マクロ オートフィ...
-
エクセルで特定の文字列が入っ...
-
[EXCEL]ボタン押す→時刻が表に...
-
【Excel関数】UNIQUE関数で"0"...
-
特定の文字がある行以外を削除...
-
Excel グラフのプロットからデ...
-
excelのデータで色つき行の抽出...
-
AのセルとB行を比較して、一致...
-
結合されたセルをプルダウンの...
-
エクセル マクロで数値が変っ...
-
エクセル 上下で列幅を変えるには
-
VBAで色の付いているセルの行削除
-
excel 小さすぎて見えないセル...
-
A1に入力された文字列と同じ文...
-
罫線の斜線を自動で引くマクロ
-
アクティブになっている行をマ...
-
エクセル2016で時間を入力して...
-
EXCELマクロを使い、空白行では...
-
エクセルマクロで偶数行(又は...
-
セルの色によって条件文をつけ...
おすすめ情報