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

VB6 と ACCESS97 でソフト開発をしています。

フォームに DBGrid を配置し、クエリの結果を表示させていますが、
多くの場合に「実行時エラー '3167' レコードは削除されています。」の
エラーが出ます。(出ないときもあります。)

どなたか、このエラーを回避する方法を教えて下さい。

以下は、コーディングの一部です。
Data1.DatabaseName = MDB_Path & "株.mdb"

'------ クエリのセット ------------------------------------------------
Set MyQuery = dbs.QueryDefs("連結決算Q")
SQL = "SELECT 決算チェックT.銘柄CD, [当日株価T].銘柄名, [当日株価T].市場"
++++++ 途中略 ++++++++++++++++++++++
SQL = SQL & " 決算チェックT.銘柄CD;"
MyQuery.SQL = SQL
Set tbl = dbs.OpenRecordset(SQL)
銘柄CD(1) = tbl!銘柄CD: 市場(1) = tbl!市場

'------ チャート(小、1年)の取得と表示 ---------------------------------
++++++ 途中略 ++++++++++++++++++++++
Image1.Picture = LoadPicture(F_Name)
DoEvents

'--- 株価の取得 -------------------------------------------------
GetURL = " http://quote.yahoo.co.jp/q?s=" & 銘柄CD(1) & "&d=v6"
Inet1.RequestTimeout = 15
Inet1.Execute GetURL, "GET": DoEvents

tbl.MoveLast: データ数(1) = tbl.RecordCount
tbl.MoveFirst
Data1.Caption = Space$(25) & "決算チェック銘柄数 " & データ数(1) & "銘柄"
Check_1:
Data1.RecordSource = "00#連結決算表示Q"
For K = 1 To 300: For J = 1 To 3000: DoEvents: Next J: Next K
'〓〓〓〓 ここでエラーが出る 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Data1.Refresh:
Call DBGrid(1)表示整形
DBGrid1.Refresh
If データ数(1) <> Data1.Recordset.RecordCount Then
For K = 1 To 1000: DoEvents: Next K
GoTo Check_1
End If

A 回答 (1件)

「時間待ち」の為に「空ループを回し、その中にDoEventsを入れる」のが間違いです。



もし、ボタン押下など、イベントに拠って呼ばれるプロシジャ内で、こういう時間待ちをしていると、マニュアルにも書いてあるように
「もう一度同じプロシージャが呼び出され、実行結果が不定になる」
と言う事が起きます。
http://homepage2.nifty.com/kasayan/vba/doevents. …

プログラム中の「DoEventsを完全にすべて排除」し、代わりに
Application.Wait(Now + TimeValue("0:00:10"))
など、WaitメソッドかSleep関数を使用しましょう(上記の例は「10秒待つ」です)

「DoEventsを完全にすべて排除」しない限り、そのエラーは抑止出来ません。

因みに「OnError Gotoでエラーハンドリングを行なう」事で「エラーが起きている事を隠す」ことは出来ますが「実行結果が不定で、システムが不安定になり、いつ、何が起きるか判らない」のは変わりません。

残念ですが「DoEventsを使っている限り、客先に提供可能なプログラム品質は確保出来ない」と思って下さい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

「DoEventsを完全にすべて排除」して試して見ます。

お礼日時:2007/07/09 15:42

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

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


このQ&Aを見た人がよく見るQ&A