• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:うまく処理されません(ACCESSのVBA))

うまく処理されません(ACCESのVBA)

このQ&Aのポイント
  • イベント事業を管理するデータベースを作っています。メインのテーブルを表示するフォームから、チェック(Yes/No型)された項目だけを抽出したクエリ「記事抽出」があります。
  • チェックした数が少ないときはうまくいくのですが、20個くらいチェックすると、ループの途中で抜けてしまいます。このとき、エラーメッセージは表示されません。
  • Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim i As Integer Dim gyouji(50) As String '行事名' Dim kaijyou(50) As String '会場' Dim tuki1(50) As Integer '月1' Dim nichi1(50) As Integer '日1' Set cnn = CurrentProject.Connection i = 0 With rst .Open "記事抽出", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect Do Until .EOF gyouji(i) = !行事名 kaijyou(i) = !会場 If IsNull(!月1) Then tuki1(i) = 0 Else tuki1(i) = !月1 End If If IsNull(!日1) Then nichi1(i) = 0 Else nichi1(i) = !日1 End If .MoveNext i = i + 1 Loop .Close End With cnn.Close

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

アドバイスです。 このような場合、どのレコードを処理してループを抜けてしまったかを特定する必要があります。 Loopの行でブレークポイントを設け、gyouji、kaijyouなどの配列型変数をウォッチ式に追加して下さい。ウォッチ式は変数を選択し、右クリックから追加できます。 VBEではブレークポイントで一度処理が止まります。ウォッチ式で変数の変化をチェックし、問題がなければ、コードの実行を継続させ、「どこで処理が止まるか」、「止まったときの変数の内容」をチェックしてみて下さい。 それから、 Dim gyouji(50) As String '行事名 とありますが、抽出するレコードは必ず51件以下なのでしょうか。もし、超える可能性があるのならば、REDIMの処理が必要です。

tanatetsu
質問者

補足

ご回答ありがとうございます。 アドバイス頂いたとおり、ブレークポイントをつくってループの際に変数をチェックしましたが、変数の内容におかしなところは見つかりません。 ある不正な値が変数に格納される事が原因でループを抜けてしまうのではない、と思うのです。 いろいろ試しましたが、抽出レコードの数が問題な気がします。それもまちまちで、14個でダメなときもあれば15個で大丈夫なときもあります。 抽出レコードですが、とりあえず今は50で試しているところです。実際、50も抽出する処理はさせていません。 20くらいでこの問題が生じてしまいます。 なんだか分かり難くてすみません。自分でも何が問題なのかさっぱり分かりません。

その他の回答 (3)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.4

Loopの抜けの辺は他の方が書いているので VBの場合、出来るだけ変数タイプを厳密に指定する方が動作が向上するのでlongとstringを多用する方が良いという事を前提に。 Dim i As Integer を Dim i As long に変更する これで試してみてください。

tanatetsu
質問者

お礼

ご回答ありがとうございます。 変数の型の宣言は私もなるべく厳密にするようにしています。C言語も多少扱っているせいもありますが。 Variant型というのは極力使わないようにしています。 お教えいただいたとおり、iをlong型に変更しました。 さて、実は問題は解決しました。コードがおかしいと思い試行錯誤していたんですが、ここで皆さんの知恵をお借りしても解決できないと言う事から、やはりもともとのデータに問題があるのかも知れないと思ました。それでメインのテーブルを作り直したらうまくいったんです。本当に、みなさんには感謝しています。 ただ、一見テーブルのデータはきちんと入っているようでしたので納得がいきません。そもそも、作り直したデータも同じものです。この件に関して何かありましたらお教えいただきたいと思います。 問題は解決しましたが、もうしばらく続行させていただきます。

回答No.3

#1の方と同じようなことですが Openした直後にMoveLastしてますか? たしかヘルプにも書いてあったと思うけど MoveLastしないと本当のレコード数が判らないことが有ります。 私はOpenした場合には MoveLastとMoveLastを実行して レコード数を確定させています。

tanatetsu
質問者

補足

ご回答「ありがとうございます。 お教えくださったとおり、MoveLastを実行してみました。結果はやはり同じでしたがこのまま記述させておこうと思います。 ループ一回ごとにカウントさせ、メッセージボックスで表示させても異常はありません。 やはり、データに問題があるのかもしれません。 テーブルが壊れている、もしくはデータに変なものが入っているかもしれません。もう一度調べてみます。

  • vantage
  • ベストアンサー率60% (310/514)
回答No.1

ハズしているかも知れませんが、 Do Until .EOF する前に、 MoveFirst してみればいかがでしょう。 (そのもうひとつ前に rst が0件の場合をはじく必要がありますが…) あと、こういう場合は Loop処理中の各変数の値を Debug.Print してチェックすると、良いことがあるかも知れません。既にやっておられれば、大変失礼しました。

tanatetsu
質問者

補足

ご回答ありがとうございます。 おっしゃられたとおり、Do Until .EOFの前に.MoveFirstを入れてみましたがやはり結果は同じでした。 変数の値をチェックしてみたのですが、ループから抜けてしまう条件が特定できません。20個くらい抽出すると、一度も処理を実行することなく(正確には“kaijyou(i) = !会場”の直後で)抜けてしまいます。

関連するQ&A

専門家に質問してみよう