電子書籍の厳選無料作品が豊富!

Win2000、Excel2000で作業をしています。
無限ループで、Sheet1を監視し、特定のセルに「1」が入ったら別のセルの内容を変更すると言うものです。
ここで、何度目かに「1004)アプリケーション定義またはオブジェクト定義のエラーです」とでます。
(テストのため、(1,5)のセルに何か書き込み、(1,3)に1を入れるというのを繰り返していると、(1,5)に書き込んだ時に出る。)
Do While True
If Sheet1.Cells(1, 3) = "1" Then
Sheet1.Cells(1, 5) = ""
Sheet1.Cells(1, 6) = "0"
End If
DoEvents
Loop

ハイライトもしなくて、どこで落ちているのかわからず困っています。
ちなみに、1をvalで見ても同じで、1秒ごとに見ても同じでした。

どなたか原因の心当たりのあるから、ご助力お願いいたします。

A 回答 (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だけ勉強していっても届かないレベルの内容なのです。

あまり、入門レベルでは、考え込まないほうがよいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/14 14:07

こんばんは。



もし、ループする場合は、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
    • good
    • 0
この回答へのお礼

ありがとうございます。遅くなりましてすみません。
試してみます。

んー。しかし、エラーの原因ってのは結局どこなのか・・・。

お礼日時:2005/11/11 11:51

申し訳ありませんが、質問に対する直接の回答ではないです。


>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

この回答への補足

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

補足日時:2005/11/08 18:02
    • good
    • 0

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