アプリ版:「スタンプのみでお礼する」機能のリリースについて

Windows XP Home Edition
Excel 2002

変更前は、全く問題なく動作しましたが、
下記のように1行だけ変更しただけで動作後に固まってしまいます。
このようなことは初めてなのですが、
何卒、ご教授お願い致します。

Sub 動作後に固まる()
'注意
Dim c As Range
Do
Set c = Range("A:A").Find(what:="No 01", LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then Exit Do
'c.Offset(-1, 0).Resize(3, 1).EntireRow.Delete '変更前
c.Offset(1, 0).FormulaR1C1 = "固まる" 'この1行だけこのように変更しただけです
Loop

End Sub

A 回答 (4件)

提示されたコードでは、同じセルを無限に「Find」し続けます。


「Do~Loop」を使っているということは、複数の「No 01」をFindしたいのでしょうか?
それなら「FindNext」を使う必要があります。

その場合も気をつけないといけないのは、Find、FindNextは検索値を何度も巡回することです。最初見つけたアドレスと同じアドレスならLoopからExitするという条件が必要になります。
こちらを参考にしてください。
http://www.moug.net/tech/exvba/0050116.htm

ちなみに変更前のコードが動いたのは、「Delete」によってFindしたセルがなくなり新しいセルを見つけ続けたからです。
    • good
    • 0
この回答へのお礼

早速のご回答、誠に有難うございました。
勉強をおこたってました。
ほんのちょっとだけですが、解かってきたようです。
For Each ・・・
For r = 1 To x - 1
などと同じように、単純に解釈しておりました。
甘く見てました。
皆様が良回答でした。

お礼日時:2009/09/20 12:19

>c.Offset(1, 0).FormulaR1C1 = "固まる"


は動くようだが普通は使わないとおもう。
ちなみに
Sub test01()
Cells(1, 1).Formula = "固まる"
End Sub
は可能にようだ。
普通は
Sub test01()
Cells(1, 2).Value = "固まる"
End Sub
とするとおもうが。
ーーーー
Sub 動作後に固まる()
Dim c As Range
Do
Set c = Range("A:A").Find(what:="No 01", LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then Exit Do
MsgBox c.Address
'c.Offset(-1, 0).Resize(3, 1).EntireRow.Delete '変更前
c.Offset(1, 0).FormulaR1C1 = "固まる" 'この1行だけこのように変更しただけです
Loop
End Sub
とMsgBox c.Addressを入れて実行すればわかるが、無限に繰り返す。
2番目のNo 01のセル位置を見つけるには、FindNextを使い
After指定を適当に指定しないとダメのはず。
該当が2つ以上ありえる場合は、Findをループの中に入れることは普通無い。
Sub test02()
Dim c As Range
Set c = Range("A:A").Find(what:="No 01", LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then Exit Sub
MsgBox c.Address
Set d = c
Do
'c.Offset(-1, 0).Resize(3, 1).EntireRow.Delete '変更前
'c.Offset(1, 0).FormulaR1C1 = "固まる" 'この1行だけこのように変更しただけです
Set d = Range("A:A").FindNext(after:=d)
If d.Address = c.Address Then Exit Sub
MsgBox d.Address
Loop
End Sub
のようになるのではないかな。
全般的に、何がしたいのか、データの情況が質問に書いてなくて、質問が判りにくいので、見当はずれかも知れないが。
    • good
    • 0
この回答へのお礼

早速の詳細なご回答、誠に有難うございました。
無限と有限なんですね。
皆様、良回答でした。

お礼日時:2009/09/20 12:23

「固まる」という意味はどういう意味ですか?


無限ループが起きているということでしょうか?

ご質問の最初のコードと、以下のように文字を入れることとは、コードの持つ役割として若干違います。

以下は、ヘルプを調べれば分かるコードですが、こんな風にしてみたらどうでしょう。

Sub FixedInfiniteLoop()
  Dim c As Range
  Dim FirstAdd As String
  Set c = Range("A:A").Find(What:="No 01", LookIn:=xlValues, LookAt:=xlWhole)
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(1, 0).Value = "修正後"
      Set c = Range("A:A").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub '文字に置く
    Loop Until c Is Nothing
  End If
End Sub
    • good
    • 0
この回答へのお礼

早速のご回答、誠に有難うございました。
>「固まる」という意味はどういう意味ですか?
>無限ループが起きているということでしょうか?
申し訳ありませんでした。
ずっと動作中なんですね!
固まったにしてはどうもいつもと違うとは思っておりました。

お礼日時:2009/09/20 12:01

元のコードですと、Deleteにより必ずFind対象が無くなる事でループから抜けますが、変更後はFind対象が常に見つかるのでループから抜けることがないという、ロジックミスかと。



ループ脱出条件を見直してみては。
    • good
    • 0
この回答へのお礼

早速のご回答、誠に有難うございました。
そもそも、当方にとっては、
元のコード自体が非常に難しく、理解できてませんでした。
皆様が良良回答でした。

お礼日時:2009/09/20 11:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています