• ベストアンサー

ACCESSVBAのseekで複数INDEX検索方法について

こんにちは。 seekで、複数のINDEXに対して、それぞれ設定した条件を検索かける具体的なコードの書き方がわからず困っています。教えてください。(単一INDEXではできました) 例えば、社員名、日付、応対結果といった複数のフィールドに対して、フォームに入力されたそれぞれの値で検索をかけたいのです。またその際に、入力されてないところは無視して、入力された条件のみで検索をかけたいのですが、可能でしょうか? 現在、DAOを使ってコーディングしているので、DAOで具体的なコード例を教えていただけるとありがたいです。 文章がわかりにくくて申し訳ありませんが、よろしくお願いします。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

> 当初Findを使っていたのですが、検索に時間がかかリ過ぎてしますのです。 > seekに変更したところ検索時間がかなり短縮されたため、できればseekを > 使いたいのですが。。 そうですか。 どれ位のレコード数なのでしょうか。まぁSeekの方が、早いかも知れませんが、 Key引数が、1つだったから、なおさら早くなったのでは? 一応、Seekを使ってコンボボックス3個で条件を指定して、テストしてみました。 テーブルのインデックスをコンボボックスの入力(Null)状態で設定していますので 同フォームのレコードソースが、このテーブルになっていて、開いている状態では、 インデックスを操作出来ませんので、予め7種類のインデックス名を作っておいて、 検索項目の入力状態によりCaseでSeekのKey引数を切り替えるよう変更する必要が あります。 この例は、検索結果を同フォームの非連結テキストボックスに表示しています。 Private Sub 検索実行_Click() Dim db As DAO.Database Dim tb As DAO.TableDef Dim rst As DAO.Recordset Dim idxName As Index Dim idxLoop As Index Dim shain As Variant Dim hizuke As Variant Dim outai As Variant Dim jyoken As Integer Set db = CurrentDb Set tb = db!テーブル1 syain = Me.検索社員名 hizuke = Me.検索日付 outai = Me.検索応対結果 If Not IsNull(syain) Then jyoken = jyoken + 1 If Not IsNull(hizuke) Then jyoken = jyoken + 2 If Not IsNull(outai) Then jyoken = jyoken + 4 If jyoken > 0 Then   For Each idxLoop In tb.Indexes     If idxLoop.Name = "検索インデックス" Then       tb.Indexes.Delete idxLoop.Name     End If   Next idxLoop   Set idxName = tb.CreateIndex("検索インデックス")   With idxName     Select Case jyoken       Case 1         .Fields.Append .CreateField("社員名")       Case 2         .Fields.Append .CreateField("日付")       Case 3         .Fields.Append .CreateField("社員名")         .Fields.Append .CreateField("日付")       Case 4         .Fields.Append .CreateField("応対結果")       Case 5         .Fields.Append .CreateField("社員名")         .Fields.Append .CreateField("応対結果")       Case 6         .Fields.Append .CreateField("日付")         .Fields.Append .CreateField("応対結果")       Case 7         .Fields.Append .CreateField("社員名")         .Fields.Append .CreateField("日付")         .Fields.Append .CreateField("応対結果")     End Select   End With   tb.Indexes.Append idxName   Set rst = db.OpenRecordset("テーブル1", dbOpenTable)   rst.Index = "検索インデックス"   Select Case jyoken     Case 1       rst.Seek "=", syain     Case 2       rst.Seek "=", hizuke     Case 3       rst.Seek "=", syain, hizuke     Case 4       rst.Seek "=", outai     Case 5       rst.Seek "=", syain, outai     Case 6       rst.Seek "=", hizuke, outai     Case 7       rst.Seek "=", syain, hizuke, outai   End Select   If rst.NoMatch Then     Me.no = Null     Me.社員名 = Null     Me.日付 = Null     Me.応対結果 = Null     MsgBox "見つかりません !!"   Else     Me.no = rst![no]     Me.社員名 = rst![社員名]     Me.日付 = rst![日付]     Me.応対結果 = rst![応対結果]   End If   rst.Close   Set idxName = Nothing   Set rst = Nothing Else   Me.no = Null   Me.社員名 = Null   Me.日付 = Null   Me.応対結果 = Null   MsgBox "検索条件が指定されていません。" End If Set tb = Nothing Set db = Nothing End Sub

north1004
質問者

お礼

中途半端な状況説明ですみません。詳しいご回答ありがとうございます。早速試してみます。 一応状況を補足しますと、レコード数は10万件ぐらいです。ただもう一つのテーブル(こちらのほうは検索条件は一つでレコード数は200万位)の検索方法をfindからseekに変更したところ、かなりのパフォーマンス向上がはかれたので何とかseekに変更したかったのです。 試してみてまたわからない事があったら質問させていただきたいのですが、よろしくお願いします。

その他の回答 (1)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

直接の回答ではありません。 複雑な(文字列型や日付型などが、混じっている複数フィールドに対して)条件を 付けて検索するのには、Seekメソッドは適していないのではないかと思います。 また、[社員名]や[応対結果]は、曖昧検索も必要なのでないでしょうか? そうだとすれば、Find系メソッドを使用した方が、自由な検索が出来るのでは ないかと思いますが、如何でしょうか?

north1004
質問者

お礼

回答ありがとうございます。 当初Findを使っていたのですが、検索に時間がかかリ過ぎてしますのです。seekに変更したところ検索時間がかなり短縮されたため、できればseekを使いたいのですが。。 また[社員名]や[応対結果]はコンボで選択するため曖昧検索の点は大丈夫です。ただすべての条件を指定しなくても検索できるようにしたいため、条件がnullなら無視するようにしたいのですが。

関連するQ&A