• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAのデバックをどなたかお手伝いください。)

VBAのデバックについて教えてください

このQ&Aのポイント
  • VBAのデバック方法について教えていただきたいです。急いでいるため、どなたかお手伝いいただけると助かります。
  • Do Until rs.EOFまでの部分の意味がわかりません。この部分について教えていただけると助かります。
  • VBAのデバックで使用する変数と関数について教えていただけますか?情報が不足しているため、具体的な内容を教えてください。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.10

もう一つ追加。 >strcriteria = "CAT = '" & rs!CAT & "'" において、 等号「=」の右側について、 >"CAT = '" & rs!CAT & "'" は一つの文字列になっていますが、 rs!CATは一旦、「"」の囲みから外に 出ています。ここがわかりにくいところですが、 規則として変数は囲みの外に出して連結しなければ いけないことになっています。そこで「&」を使って 連結しています。 したがって、 >strcriteria = "CAT = '" & rs!CAT & "'" を、 >strcriteria = "CAT = 'rs!CAT'" のようにするとAccessは「rs!CAT」という文字列を 探すことになってしまい、レコードセットrsのCATという フィールドを検索することにはならなくなってしまいます。

ami0607
質問者

お礼

そうなんです。>strcriteria = "CAT = 'rs!CAT'" だと見やすくてわかるのですが、>strcriteria = "CAT = '" & rs!CAT & "'" だとやたら記号が多いように見えて、真相がわからなくなってしまったのです。 具体例を出して説明していただきありがとうございました。またもうひとつの質問についてもありがとうございました。会社のシステムのため、触って試してみるのにもう少し時間がかかりそうですが、教えていただいたように(MCDの変更)またやってみて、報告させていただきます。

ami0607
質問者

補足

なるほど、です。素人でもわかりました。確かにそれだと文字列を探すことになってしまいますね。だからといって & というのは、素人には難しい規則ですが、なぜ&がついていて、コーテーションがやたら多く見えるのかが、よくわかりました。

その他の回答 (18)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

#7を少し訂正。 >strcriteria = "CAT = '" & rs!CAT & "'" strcriteria = "CAT = '"  と rs!CAT と "'" を結合させている、ということです。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

strcriteria = "CAT = '" & rs!CAT & "'" を例にしますと、 "CAT = '" と rs!CAT と "'"  を つなぎ合わせて一つの文章にしています。 つまり、「と」がちょうど「&」に なっています。 たとえば、 文字列 = "わたしは" & "豊臣" & "秀吉" という式を作ってAccessでたとえば、 Private Sub コマンド0_Click() Dim 文字列 As String 文字列 = "わたしは" & "豊臣" & "秀吉" MsgBox 文字列 End Sub としてコマンドボタンのクリック時イベントに 設定するとメッセージがでて、 わたしは豊臣秀吉 と表示されます。 このように文字、あるいは文字列の 結合のときに「&」を使用します。 rs!CATがたとえば、もち米とすると、 Accessには、 strcriteria="CAT = 'もち米'" というように渡って、Accessがこれをもとに CATがもち米のデータを検索するというように なります。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.6

説明を単純に解釈すると、 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 Do Until rs.EOF '該当レコードあり If rs!MCD = "3162" Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then ' Else rs!仕入単価世代1 = rs!仕入単価 rs!仕入単価 = rs2!discount End If '--------------------------------------------- rs!更新日 = Now() rs.Update End If ざっと見ると、 商品2_TテーブルのMCDが"3162"のとき、 →商品2_Tテーブルのカタログ(=商品分類)を条件キーにして、商品2_T25discountてすとテーブルからあいまい検索(=FIND)、 →検索して見つかったとき、仕入単価を取得して商品2_Tテーブルの仕入単価を更新、1つ前の仕入単価は退避。更新日を更新する。 →検索して見つからない(=EOF)とき、何もしない 商品2_TテーブルのMCDが"3162"でないとき、何もしない 余談で、 「"CAT = '" ・・・」等の「'」は、「chr(39)」と記載しても同じ意味です。 chr(39)に置き換える方が構文がはっきりして間違えること少ないです。 「"CAT = " & chr(39) & ・・・」

ami0607
質問者

お礼

知りたかった内容を教えていただきありがとうございます。これは、フォーム内にあり、 コマンド25_Click()で発動するようになっているのですが、 ほかのMCDの場合もそれぞれにコマンドを用意したいのです。 その場合は、このフォーム内に別のコマンド(たとえばコマンド26)をおいて、コードはこれを全くそのままコピーして、If rs!MCD = "3162" Then の中身だけを変えたらよろしいでしょうか? (なぜかそうすると更新がうまくいかなかったのでお尋ねしました)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

#4に余分な'がついていました。 >strcriteria = "CAT = '" & rs!CAT & "'" ' >strcriteria = "CAT = " & rs!CAT & "" ' の最後の'はコメントアウトに使ったもので はすしておいてください。

ami0607
質問者

お礼

まことにありがとうございました!コーテーションマークについてはリンク先を読んでも少し難しかったですが、少なくとも今回のところのことはよくわかりました。 これからも少しずつがんばります。ありがとうございます。

ami0607
質問者

補足

&についてですが、リンク先の説明はわかったのですが今回の件がよくわからないです。これは何と何を & しているのか、教えていただけないでしょうか

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

strcriteria = "CAT = '" & rs!CAT & "'" ' の場合は、rs!CATが文字列なので、'で囲みます。 数値型の場合は、 strcriteria = "CAT = " & rs!CAT & "" ' のように'をはずします。規則の一つです。 &は文字列連結するために使用していますが、 http://office.microsoft.com/ja-jp/access-help/HA010235851.aspx 以下にまとめて説明があります。 http://www.accessclub.jp/bibouroku/010.html

ami0607
質問者

お礼

大変丁寧にありがとうございます。理解できるまでもう少し何度か読んでみて明日ご連絡します。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

#2です。cnとcn2の変数宣言がされていました。 見落としでした。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

ざっと見た感じでは、 If rs.RecordCount > 0 Then rs.MoveFirst Do Until rs.EOF '該当レコードあり If rs!MCD = "3162" Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A If rs2.RecordCount > 0 Then rs2.MoveFirst Do Until rs2.EOF rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then Exit Do Else rs!仕入単価世代1 = rs!仕入単価 rs!仕入単価 = rs2!discount '--------------------------------------------- rs!更新日 = Now() rs.Update End If rs2.MoveNext Loop End If End If rs.MoveNext Loop End If このようなものでは? なお、cnとcn2の変数宣言がされていないようですが。 rs2.Findの引数が先頭から検索なので rs2.MoveFirstはいらないかもしれないけど。

ami0607
質問者

補足

丁寧にありがとうございます。 strcriteria = "CAT = '" & rs!CAT & "'" ' の部分の意味を教えていただけないでしょうか? &が入っているのと、 '  が囲まれている意味がわからないのです。

noname#259269
noname#259269
回答No.1

rs2が EOF になった時に何らかのビジネスロジックを処理すると思うのですが、肝心の仕様がわかりません。設計者に聞いてください。

ami0607
質問者

補足

ありがとうございます。仕様というと、何のことでしょうか?これはアクセスの2000です。(そういったことではないでしょうか??すみません)