• ベストアンサー

Do loopのマクロ

以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 古いスタイルというか、スクリプト式の書き方ですね。 サンプルを出しておきます。 Sub B() Dim i As Long i = 1   Cells(i, 1).Select 'あってもなくてもよい。   Do Until Cells(i, 1).Value = ""     If Cells(i, 1).Value = 10 Then      '処理       Cells(i, 1).Font.ColorIndex = 3 'フォントの色を変える     End If     i = i + 1   Loop End Sub

blackleon
質問者

お礼

ありがとうございます。 こういったマクロの書き方を見ていると自分の書いたマクロがとても野暮ったく感じます。

その他の回答 (2)

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

自分の書いたコードの添削を求めているのだろうが 私がいつも使うFor Next(一本やり)の方法が、良い点もあり書いておく。 Sub testA() d = Range("65536").End(xlUp).Row A: For i = 2 To d If Cells(i, "A") = "" Then Exit Sub If Cells(i, "A") = 10 Then Cells(i, "A").Offset(1, 0) = "aaa" Next End Sub 私はForNEXt->While->Do(2,3種類あり)の 順で使う。 Selectの多用は初心者くさい。むだの場合が多い。<ーーマクロの記録からのくせ? ーー 添削的にやってみると Sub testb() Cells(1, 1).Select Do Until ActiveCell.Value = "" '空白ならループを抜けて終了 If ActiveCell.Value = 10 Then '10なら ActiveCell.Offset(0, 1) = ActiveCell + 1 '小生の勝手な部分 Else '10でないなら何もしない。 End If 'どちらの場合(10でも無いとき、10の場合)とも下行を指す ActiveCell.Offset(1, 0).Select Loop MsgBox "終了" End Sub ーーーー 自分の我流のコードを質問に書くだけでなく、したいことを文章で書くべきだ。それでコードの正否・適否は判断しやすくなる。 例えば上記で私が入れたコメントを整理して質問に文章で書くよう なこと。 正直なところ質問のコードは我流と思う。他人のやVBAの解説書のコードを多数読んで経験をつむこと。

blackleon
質問者

お礼

ご回答ありがとうございます。 >Selectの多用は初心者くさい。 ご指摘の通り、初心者です。 For Nextを使用したマクロはとても参考になります。 経験不足でなかなか発想が飛躍しないので、あのようなコードになってしまいます。 少しづつでも勉強していきたいと思います。

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.1

無限ループになっているのでは? 空白が見つかりLoopを抜ける→B:以下が実行されて、セルが下にOffsetされ、また、A:に戻って処理が続行されてしまう。 下記のようにすれば良いのでは Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then call b End If ActiveCell.Offset(1, 0).Select Loop End Sub Sub B() ActiveCell.Offset(1, 0).Select End Sub

blackleon
質問者

お礼

早速のご回答ありがとうございました。 ご指摘の方法でうまくできそうです。

関連するQ&A