• 締切済み

ACCESS VBAでSeekメソッドの処理記述

ACCESSでテーブルにIndexを定義しています。 (重複ありで) そのIndexに入っているデータAというのが3件ほどあり、それを全て検索して、処理したいのです。 そのためにseekを使って、最初のデータを検索し、次々のデータに行きたいのですが、その場合、対象データの1件目を検索して、次のレコードに移動するには、どのように記述すればよいのでしょうか。 本などには、 If rs.EOF thenのような書き方ばかりで1件の処理の場合のみのサンプルしかないのです。 よろしくお願いします。

みんなの回答

noname#60992
noname#60992
回答No.3

質問の回答ではありませんが、検索時間に問題があるなら、SQLを書いたほうがよい場合があります。 strSQL = "SELECT * FROM TABLENAME WHERE INDEX = 'A';" RST.OPEN strSQL,............ DO WHILE NOT RST.EOF ...................... LOOP クエリでも大丈夫です。

noname#22222
noname#22222
回答No.2

基本形は、次のようです。 rstXXXX.Index = "xxxxx" rstXXXX.Seek "=", A Do Until rstXXXX.NoMatch   ・・・・・   ・・・・・   rstXXXX.Seel "=", A Loop

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

FindFirst、FindNextではダメですか?

関連するQ&A

  • DAOのSeekメソッドの不等号について

    DAOのSeekメソッドの不等号について いつもお世話になっております。 あるテーブルの項目A,B,Cにインデックス"検索用"と名前をつけたとします。 DAOのSeekメソッドで、 RS.index = "検索用" RS.seek ">=", 10, 20, 30 とした場合、返される結果は、クエリで Where A >= 10 and B >= 20 and C>=30 と条件指定したものと同じでしょうか? よろしくお願い致します。

  • ACCESS VBAのMoveメソッドがおかしいのでは?

    ACCESS2000のVBA、Moveがおかしいです。 "通番"(数値型)フィールドを持つ"テーブル1"に、レコード通番を埋め込む(更新)というプログラムです。 事情があって10レコード毎に処理を繰り返すのですが、レコード数が501の場合に実行時エラー'3021'になります。502や500レコードの場合は問題無し。 どうやら、moveで501レコード目に飛んで最終行だった場合、EOFがTrueになってしまっているようです(EOFは次の行なのに)。 Public Function koshin() Const bunkatsu = 10 '1処理の区切りとなるレコード数 Dim rcd As New ADODB.Recordset Dim no As Long '処理用内部変数 Dim recno As Long 'テーブルのレコード数 Dim rep As Long '処理の繰り返し数 rcd.Open "テーブル1", CurrentProject.Connection, adOpenKeyset, adLockPessimistic recno = rcd.RecordCount 'レコード数を取得する rcd.Close MsgBox "レコード数は" & recno & "です" no = 0 rep = -Int(-(recno / bunkatsu)) '分割回数を算出する MsgBox "内部処理を" & rep & "回分割して行います" For i = 0 To rep - 1 rcd.Open "テーブル1", CurrentProject.Connection, adOpenKeyset, adLockPessimistic rcd.Move i * bunkatsu For j = 1 To bunkatsu no = no + 1 rcd![通番].Value = no rcd.Update rcd.MoveNext If rcd.EOF Then Exit For Next j rcd.Close SysCmd acSysCmdSetStatus, no & "件処理しました" Next i MsgBox "終了しました" End Function

  • ACCESSで複数主キーにおけるseek検索

    ACCESSで複数主キーにおけるseek検索 ACCESS2000で複数の主キーを持つテーブルからseekで一致検索を行いたいが、 ADOを利用した場合のコードの書き方がわかりません。 テーブルは以下の3つのフィールドから構成されます。 フィールド1:フィールド2:フィールド3 年月日:担当職員:応対結果 ここで主キーは「年月日」と「担当職員」の2つで、「年月日」と「担当職員」が 一致するレコードをseekによって検索したいのです。 インデックスを表示させると「年月日」と「担当職員」が表示されます。 「年月日」の欄にのみ、インデックス名の欄にPrimaryKeyと書かれています。 DAOを用いて検索部分をVBAで書いたら動きました。 以下に検索部分だけ書きます。 (1) ds.Index = "PrimaryKey" (2) ds.Seek "=", 年月日, 担当職員 (3) If ds.NoMatch Then (4) MsgBox"そんなデータないですよ" (5) Else (6) MsgBox"一致するのがありました" しかしながら、ADOを用いた記述方法がわかりません。 上の(1)行は ds.Index = "PrimaryKey" でよいと思うのですが、(2)行以下がどう書いて良いかわかりません。 何卒宜しくお願いします。

  • アクセス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を検索して更新をかける、という動作に失敗しているように見えます。 しかし素人なのでこれ以上どうすればよいかがわかりません。どなたか少しでも解決策があれば教えていただけないでしょうか。

  • レコード一件ずつ処理判定をしたいのです。

    データベースの値を取得してきて 下記内容の処理を実施したいと考えています。 Do While rs.EOF = False    処理する内容:     レコード1件目とレコード2件目の値をチェックする。     レコード2件目とレコード3件目の値をチェックする。 rs.MoveNext Loop レコード一件ずつ処理の判定をしたいのです。 要は レコード内で重複する値があれば排除する分岐をしたいんですよね。

  • アクセスでリレーションテーブルがあるかを調べるVBA

    例えば、作家名のテーブルと本のテーブルがあって、リレーションで結合されています。作家名.ID→本.ID VBAで、全ての作家名のIDで、本.IDを検索したいです。 もし、該当するIDがなければ、デフォルトで本.IDと本.名前を追加更新したいです。作家名のテーブルのデータはあるとして、本は一部のデータしかないというケースです。 If rs.RecordCount = 0 Then rs.AddNew rs!ID = 作家名.ID rs!名前 = "あくせすの本" rs.Update End If rsをどう定義するか? 一括更新するために、Do Until rs.EOF をどういう風に使うか? それとも、別のいい方法があればよろしくお願いします。

  • VBAとSQLITEでAddNewメソッド

    こんにちは! Access VBAとSQLITEを接続して、SQLITEにデータをインサートしたいと思っています。 ADOを利用して、ADDNEWメソッドでデータを入れたいのですが、うまく動きません。 書いているコードは下記になります。 'ローカル定数 'Xはネットワークドライブ Const DRIVER_NAME As String = "Driver=SQLite3 ODBC Driver;Database=X:\test.sqlite3;" 'コネクト Set CON = New ADODB.Connection Set RS = New ADODB.Recordset CON.ConnectionString = DRIVER_NAME CON.Open 'レコードセット sql = "select * from TABLE1" table = "TABLE1" '↓問題無く通りますが、TABLE1にはデータが1件も存在しません。 RS.Open sql, CON, adOpenDynamic, adLockOptimistic '↓ここで実行エラー 3021 BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。と表示されます。 RS!F1 = "abc" '↑TABLEにはデータが一件も無い為に、このようなメッセージが表示されると思います。 '↓ODBCドライバは要求されたプロパティをサポートしていません。と表示されます。 RS.Open table, CON, adOpenDynamic, adLockOptimistic 何故、上記のようなメッセージが表示されるのでしょうか?これを解決してAddNewメソッドでデータの挿入を行いたいと思っています。 宜しくお願いします!

  • access vbでループ処理

    レコードセットでテーブルの内容をフォームのテキストボックスに表示 させたいのですが、vbの知識が無く困ってます。以下の処理をループ処理で 簡単に出来ないでしょうか。 ' PASU1 = rs!PASU ' rs.MoveNext ' PASU2 = rs!PASU ' rs.MoveNext ' PASU3 = rs!PASU ' rs.MoveNext ' PASU4 = rs!PASU ' rs.MoveNext ' PASU5 = rs!PASU ' rs.MoveNext ' PASU6 = rs!PASU レコードセットは, Do Until rs.EOF   loop を用いれば繰り返し出来ると解っているのですがフォームの, PASU[1,2,3,,,]の数字の部分を指定することが出来ずにいます。 変数など駆使すれば出来ると思うのですが良くわかりません。 どなたか教えてください。

  • Access2000で重複データに・・・

    Access2000の重複データの処理について質問です。 あるフィールドの重複レコードを検索し、該当するレコードの別フィールドに「●」をつけようとしています。ただ、重複する最初のレコードには「●」をつけたくないのです。 例えば  aaa ・・・ (1)  bbb  aaa ・・・ (2)  ccc  aaa ・・・ (3)  eee というフィールドだった場合、(1)には「●」をつけずに(2)以降にのみつけたいのです。 重複クエリで重複レコードを抽出して重複テーブル作成→重複テーブルと元テーブルを組み合わせて更新クエリ作成という方法でやったのですが、そうすると(1)にも「●」がついてきます。(当然ですが・・・) 何か名案があれば教えてください。 やはり、VBAを使わないと無理でしょうか・・・?

  • アクセスVBAです。

    DCountでテーブルのデータを取得するのと ADOのrs("index")で取得するのでは 全然早さが違うのですが それは仕様ですか?

専門家に質問してみよう