• ベストアンサー

マクロで指定した処理がうまくいかない

いつもお世話になります。 エクセル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だったことです。 どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

下から処理している意味はご理解されていますよね?それでしたら n=N-1 が不要になります。 n=N-1 が必要なのは上から処理した時です。 例えば5行目を隠した場合、その時点で6行目が5行目になりますよね。ですので5行目から処理を再開する必要があるのです。 下から摺る場合、6行目を隠して次に5行目の処理に移っても問題ありません。

7-samurai
質問者

お礼

いつもお世話になります。 先ほど、お願いしました補足の件ですが、別の方にお答えいただきましたので、理解できました。 ありがとうございました。

7-samurai
質問者

補足

いつもお世話になります。 ありがとうございました。おかげさまで問題解決しました。 補足で一つ教えていただきたいのですが、恥ずかしながら、私は下から処理するのが定石だということは知っているのですが、その意味までは理解していません・・・。 お手数をおかけして申し訳ございませんが、その点のみ教えていただけますでしょうか。

その他の回答 (3)

noname#29107
noname#29107
回答No.4

#3です。#3での記述の後半部分が正しくないので訂正します。 >また、#2の回答者の方は、 以降を以下のように訂正します。 ==== ここから ======== また、#2の回答者の方の、 >n=N-1が必要なのは上から処理した時です。 は、行削除の場合に上から処理した時、削除によって変化した行番号を調整するため必要ですが、今回は全く不必要です。 今回の場合、この記述があるために10行目の0で、nの値が9になってしまったので、next文で制御を抜けてしまったため、9行目の判定が行われずに終了してしまったということになります。

7-samurai
質問者

お礼

良く分かりました。 ありがとうございました。

noname#29107
noname#29107
回答No.3

#1,#2の回答者の方は、下から処理するのが定石であると書かれているのですが、それは削除の場合ではないかと思います。 今回の場合、単に行を非表示にするだけなので、上から処理してもいいと思います。 行削除の場合、これを上から行うと、たとえば9行を削除すると元の10行が9行に繰り上がってしまいます。そのため、削除が発生した次の行の処理が飛ばされてしまい、期待した結果が得られません。そのため、下の行から処理するのです。しかし、今回は行の非表示ですので、処理の制御がおかしくなる心配はないと思います。 また、#2の回答者の方は、 >n=N-1が必要なのは上から処理した時です。 と書かれていますが、この場合不必要な理由は、For~Next文でnの値を順次変更しているからであって、上から処理しているとか下から処理しているとかは、関係ないと思います。

7-samurai
質問者

お礼

ありがとうございました。 丁寧に教えていただきましたおかげで、やっと意味もわからず使っていた文が理解できました。 今回は、先にお答えいただきましたお2人の回答のおかげで、問題が解決しましたので、残念ながらrebellionさんにはポイントを差し上げられませんが、心よりお礼を申し上げます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

下行から処理しておられるのは、定石です。 その場合 n = n - 1 は不要では。取り急ぎテストしていないので、間違ってたら済みません。

7-samurai
質問者

お礼

いつもお世話になります。 その通りでした。ありがとうございました。

関連するQ&A

専門家に質問してみよう