- ベストアンサー
マクロで指定した処理がうまくいかない
いつもお世話になります。 エクセル2000で、タイトルを除くと、9行目から17行目までの表があり、その表の列Hの値が 0 の時、その行を非表示にするという下記のマクロを作成したのですが、処理がうまくいかないことがあります。 エラー内容は、たまに9行目のHの値が0なのに、行が表示されたままであるということです。 ’全ての行を表示させてから Rows("9:17").EntireRow.Hidden = False ’列Hの値が0の場合、その行を非表示にする Dim n As Integer For n = 17 To 9 Step -1 If Cells(n, 8).Value = 0 Then Rows(n).EntireRow.Hidden = True n = n - 1 End If Next 原因かどうかは分かりませんが、気づいた点は、その時10行目のHの値も0だったことです。 どうぞ宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
下から処理している意味はご理解されていますよね?それでしたら n=N-1 が不要になります。 n=N-1 が必要なのは上から処理した時です。 例えば5行目を隠した場合、その時点で6行目が5行目になりますよね。ですので5行目から処理を再開する必要があるのです。 下から摺る場合、6行目を隠して次に5行目の処理に移っても問題ありません。
その他の回答 (3)
#3です。#3での記述の後半部分が正しくないので訂正します。 >また、#2の回答者の方は、 以降を以下のように訂正します。 ==== ここから ======== また、#2の回答者の方の、 >n=N-1が必要なのは上から処理した時です。 は、行削除の場合に上から処理した時、削除によって変化した行番号を調整するため必要ですが、今回は全く不必要です。 今回の場合、この記述があるために10行目の0で、nの値が9になってしまったので、next文で制御を抜けてしまったため、9行目の判定が行われずに終了してしまったということになります。
お礼
良く分かりました。 ありがとうございました。
#1,#2の回答者の方は、下から処理するのが定石であると書かれているのですが、それは削除の場合ではないかと思います。 今回の場合、単に行を非表示にするだけなので、上から処理してもいいと思います。 行削除の場合、これを上から行うと、たとえば9行を削除すると元の10行が9行に繰り上がってしまいます。そのため、削除が発生した次の行の処理が飛ばされてしまい、期待した結果が得られません。そのため、下の行から処理するのです。しかし、今回は行の非表示ですので、処理の制御がおかしくなる心配はないと思います。 また、#2の回答者の方は、 >n=N-1が必要なのは上から処理した時です。 と書かれていますが、この場合不必要な理由は、For~Next文でnの値を順次変更しているからであって、上から処理しているとか下から処理しているとかは、関係ないと思います。
お礼
ありがとうございました。 丁寧に教えていただきましたおかげで、やっと意味もわからず使っていた文が理解できました。 今回は、先にお答えいただきましたお2人の回答のおかげで、問題が解決しましたので、残念ながらrebellionさんにはポイントを差し上げられませんが、心よりお礼を申し上げます。
- imogasi
- ベストアンサー率27% (4737/17069)
下行から処理しておられるのは、定石です。 その場合 n = n - 1 は不要では。取り急ぎテストしていないので、間違ってたら済みません。
お礼
いつもお世話になります。 その通りでした。ありがとうございました。
お礼
いつもお世話になります。 先ほど、お願いしました補足の件ですが、別の方にお答えいただきましたので、理解できました。 ありがとうございました。
補足
いつもお世話になります。 ありがとうございました。おかげさまで問題解決しました。 補足で一つ教えていただきたいのですが、恥ずかしながら、私は下から処理するのが定石だということは知っているのですが、その意味までは理解していません・・・。 お手数をおかけして申し訳ございませんが、その点のみ教えていただけますでしょうか。