- 締切済み
アクセスVBAの検索メソッドについてデバック
前回もこちらで質問させていただいたことがある内容なのですが、引き続き、トラブルに悩まされています。仕組みがおかしくなっていたので、自分で触ってしまったことがまた悪影響だったのですが、、。 元々他の人が作ったものであり、いま、うまくいかない原因を探っているところです。まず、添付のシートにあるように、上の行のテーブルデータは"商品2_T"という名前のテーブル、下のデータは"商品2_T25discount"という名前のテーブルです。それぞれデータを引っ張ってきて、こちらのサイトに投稿するために貼り付けしました。 問題のコードをこちらに記載します。 Dim cn As ADODB.Connection Dim cn2 As ADODB.Connection Dim rs As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim strmsg As String Dim lngRet As Long Dim strcriteria As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset Set cn2 = CurrentProject.Connection Set rs2 = New ADODB.Recordset rs.Open "商品2_T", cn, adOpenKeyset, adLockOptimistic rs2.Open "商品2_T25discount", cn2, adOpenKeyset, adLockOptimistic MsgBox "更新を開始します ", 64, 更新 Do Until rs.EOF '該当レコード摘出 If rs!MCD = Me!tx検索 Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then ' Else rs!仕入単価 = rs2!discount End If '--------------------------------------------- rs!更新日 = Now() rs.Update End If rs.MoveNext Loop MsgBox "更新が完了しました ", 64, 更新 (以上) やりたいことの説明ですが、まず、 If rs!MCD = Me!tx検索 Then とあるように、これはフォーム内にテキストボックスを用意していますので、ここに記入したMCDに一致するものに、検索をかける、ということです。そしてつぎに、strcriteria = "CAT = '" & rs!CAT & "'" 、(省略)rs!仕入単価 = rs2!discount とありますように、"CAT"を検索対象にし、前者のテーブルの"仕入単価"を、後者のテーブルの"discount"のデータで塗り替えます。 という私の解釈なのですが、(何せ他の人が作りましたので)正しいですよね? それで今試しているところなのですが、なぜかうまくいきません。何が間違っているのでしょうか? どういうエラーになるのかというと、これを実行すると、"更新日"というフィールドのみ、更新されて、仕入単価はそのままになります。ちなみに更新日が更新されているのは、このテキストボックスに入れたMCDが一致する全てのデータに対してですので、MCDが一致、には反応しているが、CATを検索して更新をかける、という動作に失敗しているように見えます。 しかし素人なのでこれ以上どうすればよいかがわかりません。どなたか少しでも解決策があれば教えていただけないでしょうか。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- layy
- ベストアンサー率23% (292/1222)
おかしいと思いあれこれデータやコードを触ると最初のおかしかった事象を再現しようにもわからなくなることあります。 CATを検索して更新をかける、が失敗しているように見えます、 ならその失敗している証明をする。どのデータでどこの文を通過して単価更新しないで更新日更新に至るのかそのときのFIND命令の内容はどうか、EOFの判定はどうか。1つずつ確かなことを明らかにしていくのです。直すべきところが見えてくるし、直し方をどうこうはそれからでも遅くない。 1行ずつ行うとか、メッセージで内容表示させるとか、はできますか。他人のものでも動かすのは質問者様なので、対策は無理にしてもエラー状況は把握できるのが良い。 同じ検索値で1回目と2回目で違うのか同じなのか、同じデータのときに限っておかしい動きなのか。 コードだけでわからない場合はデータからの観点も必要。データが悪いのかコードが悪いのか、明らかにしてますか。 おかしいときのFINDはどの値で検索しどのデータ群を参照しヒットしなかったのか、あるはずなのにとの先入観は捨てて調べる。
- piroin654
- ベストアンサー率75% (692/917)
No2,4 です。 No4のEnd Ifをコメントアウトだけでは エラーがでるので、 http://oshiete1.watch.impress.co.jp/qa6368405.html のNo16で回答しているように、 If rs!MCD = Me!tx検索 Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then ' Else rs!仕入単価世代1 = rs!仕入単価 rs!仕入単価 = rs2!discount '--------------------------------------------- rs!更新日 = Now() rs.Update End If End If rs.MoveNext Loop としてください。
- MARU4812
- ベストアンサー率43% (196/452)
>>どういうエラーになるのかというと、これを実行すると、 >>"更新日"というフィールドのみ、更新されて、 >>仕入単価はそのままになります。 > >質問のコードはこのようになっていません。 質問のコードだと、条件が揃えば起こるでしょう? (だから指摘したのではないのですか?) ところが、更新日だけ更新する処理が間違いとも 限らないのです。例えば期末の計上処理など、 全てのデータを更新チェックしていることが 重要で、その際、変換テーブルに登録されて いないデータは以前のまま引継ぎ、更新日だけ 計上日に更新するような仕様も珍しくありません。 質問者が明確に説明できていないのが原因では ありますが、あまり回答を急がない方がいい と思います。 まぁ、前スレから継続して回答を付けてくれる 方がいるようなので、私はこれで引っ込みますが。
お礼
お礼が大変遅くなり申し訳ありません。 結局どこで引っかかっているのかわからないままなのですが、 更新日だけ更新する、という処理自体には間違いないことがわかりました。 もう少し見てみることにします。ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
No2です。 >どういうエラーになるのかというと、これを実行すると、 >"更新日"というフィールドのみ、更新されて、 >仕入単価はそのままになります。 質問のコードはこのようになっていません。 途中で邪魔な直線が挿入されているので 分かりづらいかもしれませんが、 rs!仕入単価 = rs2!discount End If のところのEnd Ifを取り外すか、コメントアウト してください。 >http://oshiete1.watch.impress.co.jp/qa6368405.html のNo16ではそのようにコードを設定しています。 もう一度上記について確認していください。 なお、No16での補足での >更新できるものとできないものがあるかのように見えます については、その後どのようなことが分かったのか、 あるいは対応が完了したのか再度補足してもらえば 回答ができます。
お礼
すみません。どうもありがとうございます。もう一度確認してみます。以前は、更新できるものとできないものがあったのですが、テーブル自体を一度消してしまったりなど、トラブルがあって、1からやり直しているような形になってしまいました。 それで、今は全く更新を受付けないのです。 もう一度試してみます。
- MARU4812
- ベストアンサー率43% (196/452)
>http://oshiete1.watch.impress.co.jp/qa6368405.html やっぱり文字列型か。 おそらく、見た目に同じでも、CAT が一致してないんですよ。 全角文字と半角文字が使われていたり、データの前後にスペースが 入っていたりだと思います。
- piroin654
- ベストアンサー率75% (692/917)
http://oshiete1.watch.impress.co.jp/qa6368405.html 上記で示したNo16のコードのようにしないと、 「仕入単価 」と「更新日」が更新されません。 質問のコードは上記の質問で示されたままで、 訂正がなされていないようですが。
- MARU4812
- ベストアンサー率43% (196/452)
VBA は1行1行ステップ実行できますし、ブレークした状態で変数の 中身も確認できます。デバッグ作業に素人ではできない技術は ありませんので、地道にデータを確認して下さい。 処理自体に問題は無さそうです。 > どういうエラーになるのかというと、これを実行すると、 > "更新日"というフィールドのみ、更新されて、仕入単価は > そのままになります。 それはエラーではなく、そのように命令されています。 商品2_T25discount テーブルに該当する CAT が登録 されていなかった場合、更新日のみ更新します。 CAT が複数検索された場合など、業務上の問題が発生する 可能性が無いわけでは無いですが、とりあえず、動くプログラム にはなっているように見えます。 問題ないと思います。
お礼
お礼が遅くなり申し訳ありません。エラーではなかったのですね。もう一度チャレンジしてみます。
お礼
ありがとうございます。そうやってみたのですが、できません(初期と変わらず)でした。価格の更新はされませんでした。 一度、この商品2_T25discountという名前のテーブルを消してしまったので、この、以前に誰かが作ったコードに固執して、また使えるようにしよう、としていることがややこしくなっている原因かもしれません。 (ただ、なぜかうまく起動しないのは気持ちが悪いので、、) 単純なミスかもしれませんし、もう少し見てみることにします。 いつもありがとうございます。