こんにちは。
seekで、複数のINDEXに対して、それぞれ設定した条件を検索かける具体的なコードの書き方がわからず困っています。教えてください。(単一INDEXではできました)
例えば、社員名、日付、応対結果といった複数のフィールドに対して、フォームに入力されたそれぞれの値で検索をかけたいのです。またその際に、入力されてないところは無視して、入力された条件のみで検索をかけたいのですが、可能でしょうか?
現在、DAOを使ってコーディングしているので、DAOで具体的なコード例を教えていただけるとありがたいです。
文章がわかりにくくて申し訳ありませんが、よろしくお願いします。
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
中途半端な状況説明ですみません。詳しいご回答ありがとうございます。早速試してみます。
一応状況を補足しますと、レコード数は10万件ぐらいです。ただもう一つのテーブル(こちらのほうは検索条件は一つでレコード数は200万位)の検索方法をfindからseekに変更したところ、かなりのパフォーマンス向上がはかれたので何とかseekに変更したかったのです。
試してみてまたわからない事があったら質問させていただきたいのですが、よろしくお願いします。
No.1
- 回答日時:
直接の回答ではありません。
複雑な(文字列型や日付型などが、混じっている複数フィールドに対して)条件を
付けて検索するのには、Seekメソッドは適していないのではないかと思います。
また、[社員名]や[応対結果]は、曖昧検索も必要なのでないでしょうか?
そうだとすれば、Find系メソッドを使用した方が、自由な検索が出来るのでは
ないかと思いますが、如何でしょうか?
回答ありがとうございます。
当初Findを使っていたのですが、検索に時間がかかリ過ぎてしますのです。seekに変更したところ検索時間がかなり短縮されたため、できればseekを使いたいのですが。。
また[社員名]や[応対結果]はコンボで選択するため曖昧検索の点は大丈夫です。ただすべての条件を指定しなくても検索できるようにしたいため、条件がnullなら無視するようにしたいのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Access(アクセス) Accessフォーム 一部のレコードだけを抽出する方法について 1 2022/06/28 18:45
- Excel(エクセル) INDEX関数とMATCH関数を使用し値を返す数式についてです 2 2022/04/20 13:40
- Access(アクセス) AccessVBAで任意の複数リンクテーブルをAccessVBAを動かす際に削除したいと考えておりま 1 2022/11/17 15:45
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- Excel(エクセル) Excel 値を返す数式についてです 3 2022/11/21 20:08
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Excel(エクセル) VLOOKUPで、検索先が3シートに分かれていて、番号の大小で検索するとエラーになります。 6 2023/07/14 19:09
- Excel(エクセル) エクセルで、同じセルに数値を上書きで入力して、そのセルに累計が出るようにしたい 3 2022/08/10 17:02
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
ACCESSで複数主キーにおけるseek検索
その他(Microsoft Office)
-
ACCESS VBAでSeekメソッドの処理記述
Access(アクセス)
-
ADOでSeekメッソッドが使えません。
SQL Server
-
-
4
FindFirst を複数条件で検索
Visual Basic(VBA)
-
5
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
6
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
7
ACCESSのFindコマンドが遅い
その他(プログラミング・Web制作)
-
8
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
9
SQLの速度をあげるには・・・
Visual Basic(VBA)
-
10
ExcelのMatch関数のようなものは、Accessにはないのですか?
その他(データベース)
-
11
ADOのCursorLocationプロパティ
Visual Basic(VBA)
-
12
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
13
ADOでアクセスのレコードに複数のフィルタをかけるには?
Access(アクセス)
-
14
実行時エラー3251対応処理方法
Access(アクセス)
-
15
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
16
AccessのDAOでフィールド名を配列に格納して・・・
Visual Basic(VBA)
-
17
Accessの画面更新を一時的に停止する方法。
その他(データベース)
-
18
ACCESSのフォーム、開くんですが、見えないようにするには
Access(アクセス)
-
19
実行時エラー 3020の対策
Access(アクセス)
-
20
MSDEまたはSQLServerでReadOnlyのユーザを作成
SQL Server
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「24日の0時」って・・・
-
パソコンで購入したデーターが...
-
差し込み印刷に当日の日付が入...
-
「時間」、「期日」、「日付」...
-
日付の大小の表現
-
エクセル マクロ 名前を付けて...
-
回覧板の日付について質問です...
-
TODAY関数から次の火曜もしくは...
-
エクセルで6ヵ月後を自動入力で...
-
スプレッドシートで使う数式を...
-
ACCESSで1月1日~12月31日まで...
-
EXCELで日付を****年上期、****...
-
フォームの値をクエリーに反映...
-
Excelでヘッダに前日の日付を表...
-
Excel関数 基準日に一番近い指...
-
履歴書の日付間違いで落ちますか。
-
エクセルで日付別にシートを分...
-
関数EDATEを使わないで、何ヶ月...
-
選択クエリで実行結果を非表示...
-
エクセルで日付け表示で、明治...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコンで購入したデーターが...
-
「24日の0時」って・・・
-
「時間」、「期日」、「日付」...
-
差し込み印刷に当日の日付が入...
-
日付の大小の表現
-
回覧板の日付について質問です...
-
エクセル マクロ 名前を付けて...
-
履歴書の日付間違いで落ちますか。
-
EXCELで日付を****年上期、****...
-
エクセルで6ヵ月後を自動入力で...
-
ACCESSで日付ごとに自動連番(...
-
WEEKDAYが反映されない
-
ACCESSで1月1日~12月31日まで...
-
会社や役所などに提出する書類...
-
日付以外のデータを抽出したい...
-
エクセルで日付別にシートを分...
-
Excelでヘッダに前日の日付を表...
-
エクセルで日付け表示で、明治...
-
2つの日付の中間の日付 エク...
-
差込印刷 縦書きで和暦(漢数...
おすすめ情報