• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Do While中のVBAアプリケーション定義エラー)

Do While中のVBAアプリケーション定義エラー

このQ&Aのポイント
  • Win2000、Excel2000で作業をしています。無限ループで、Sheet1を監視し、特定のセルに「1」が入ったら別のセルの内容を変更すると言うものです。
  • 何度目かに「1004)アプリケーション定義またはオブジェクト定義のエラーです」とでます。
  • ハイライトもしなくて、どこで落ちているのかわからず困っています。ちなみに、1をvalで見ても同じで、1秒ごとに見ても同じでした。

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

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

こんにちは。Wendy02です。 >エラーの原因ってのは結局どこなのか・・・。 失礼かもしれませんが、基本的なコードの部分で疑問の付くところが多いのです。その段階で、エラーの原因をお知りになっても、あまり役に立たないように思います。 >「1004)アプリケーション定義またはオブジェクト定義のエラーです」 今回は、ワークシートのオブジェクトとCellsの不整合のエラーだと思います。直接の原因は、Sheet1 とされたことが原因で、現在使用中のオブジェクトが、Sheet1 とは限りませんので、定義エラーを起こしています。結果的にはモジュール違いのことが多いです。こういう場合、標準モジュールを使って、シートを指定しないでください。 次に、リテラルで、"1"と文字列を使っていますが、あまり、文字列で指定する方法はしません。VB/VBAは、こういうところが、曖昧なのですが、曖昧な部分に甘えていると失敗することがあります。 数字が文字列であるという確証がない場合は、数値にして比較するのが標準的です。 そして、また、Sheet1.Cells(1, 5) と、プロパティを指定していません。 Cells(1,5).Value か、Cells(1,5).Text [←あまり使いません]を使うかして、それを比較してください。 If Cells(1, 3).Value = 1 Then 最初は、標準的な文法に従って、マクロを作ってください。 Do While True また、これでは、条件が成り立ちません。ですから、基本的にありえません。 エラーの原因を知りたいという気持ちは分らないわけではありませんが、1つずつ言及して直していったら、とても使える段階には至らないと思います。 基本的な構文や文法を覚えてから、エラーの原因を把握するようにしたほうが良いと思います。自己流や掲示板をみて、自分で加工している状態では、うまくなりません。特に、掲示板では、玉石混交で、ひどい内容の解答もあります。動けば文句ないだろう、と開き直られてしまいますので、どうしようもない方もいます。 エラーを把握するのは、それぞれのオブジェクトとプロパティを良く理解して、かなり高度な知識が必要になることが多いです。Visual Basic 側を使うようになってからでも遅くはありません。 九天社という出版社から、『Excel VBA 実践のツボ デバッグ編』という本があります。エラーについて書かれていますが、これらに出てくる内容は、あきらかに上級の内容です。この著者は、たぶん、コードの書き方からすると、VBAの専門ではないようですが、なかなか、VBAだけ勉強していっても届かないレベルの内容なのです。 あまり、入門レベルでは、考え込まないほうがよいと思います。

skink
質問者

お礼

Wendy02さん、詳しくどうもありがとうございます。 実は・・・VBは触ってるんですが、VBAが初めてでして。 Excel特有のものや、VBでできてVBAではできないものなどまだ理解がぜんぜん足りないようです。 オブジェクトとプロパティですね。 使い方しっかり覚えていきたいと思います。

その他の回答 (2)

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

こんばんは。 もし、ループする場合は、API SleepやTimer()関数などで、Applicationを保護したほうがよいですね。おっしゃるように、1秒ぐらいで十分だと思います。これは、旧式のイベントです。Timer関数は、止めるほうのプロシージャーが必要です。 × Do While True 何が、True なのか分りません。 例えば、 Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Sub TestLoop() Do  Sleep 1000 If Sheet1.Cells(1, 3).Value = 1 Then   Exit Do End If   DoEvents Loop   Sheet1.Cells(1, 5).Value = ""   Sheet1.Cells(1, 6).Value = 0 End Sub

skink
質問者

お礼

ありがとうございます。遅くなりましてすみません。 試してみます。 んー。しかし、エラーの原因ってのは結局どこなのか・・・。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

申し訳ありませんが、質問に対する直接の回答ではないです。 >Sheet1を監視し、特定のセルに「1」が入ったら別のセルの内容を変更する このような場合、Worksheet_Changeを使ったほうが、 良いのではと思いますが・・・。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Cells(1, 3)) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value = "1" Then Cells(1, 5) = "" Cells(1, 6) = "0" End If Application.EnableEvents = True End Sub

skink
質問者

補足

ありがとうございます。 Worksheet_Changeを使ったつもりで、Worksheet_SelectionChangeを試していたかもしれません。 値は通信ではいってくるのですが、認識されるのでしょうか? とりあえず、通信のテスト環境がないので、ずっと監視していれば間違いないかと思い、上記の策をとりました。 結果として、Worksheet_ChangeでOKだとしても、なにが原因のエラーなのかを知りたいので、引き続き回答を募集させていただきます。

関連するQ&A