![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
Access2003を使用しています。
フォームでユーザーNOコントロールボックスでユーザを選ぶと、商品番号コントロールボックスにはそのユーザーが所有する商品番号だけを絞り込んで表示するように設定しました。(QNo.3477730で質問)
ですが、商品番号コントロールボックスのプルダウンをクリックしてから、商品番号が表示されるまでに5秒近くかかってしまいます。
これは、妥当な所要時間でしょうか?
私としては、1秒ぐらいに縮めたいのですが方法はないでしょうか?
他のユーザの商品も含めて商品数は1600件あります。
PCのメモリは260MB RAMです。
テーブルの商品番号のプロパティのインデックスは、はい(重複あり)になっております。
こうすればもう少し時間を短く出来る方法がありましたら教えていただけないでしょうか。
No.3ベストアンサー
- 回答日時:
先の回答の際に私が作成したテストテーブルは次のようです。
少し、長くなりますが、問題解決のヒントにはなるかと思います。
顧客マスター:
ユーザーNo___氏名
_____________1___鈴木 一郎
_____________2___中村 主水
商品マスター:
商品番号____品名
___________1___商品A
___________2___商品B
顧客商品管理:
ID___ユーザーNo_____商品番号
1____鈴木 一郎_______商品A
2____鈴木 一郎_______商品B
3____中村 主水_______商品A
もちろん、<顧客商品管理>の実際のデータは次のようです。
1_______________1__________________________1
2_______________1__________________________2
3_______________2__________________________1
次にテストしたのは、<ユーザーNo=1>が所有する商品の品名のリストを検索すること。
[イミディエイトウインドウ]
? DBSelect("SELECT 商品マスター.品名
FROM 顧客商品管理
INNER JOIN 商品マスター
ON 顧客商品管理.[商品番号]=商品マスター.商品番号
WHERE 顧客商品管理.[ユーザーNo]=1;")
商品A;商品B
確かに、<商品A;商品B>をセミコロン(;)で区切って抜き出しています。
ならば、 ユーザ番号_AfterUpdate() で次のように書けば、目的は達成します。
Private Sub ユーザ番号_AfterUpdate()
Dim strQuerySQL As String
strQuerySQL = "SELECT 商品マスター.品名
FROM 顧客商品管理
INNER JOIN 商品マスター
ON 顧客商品管理.[商品番号]=商品マスター.商品番号
WHERE 顧客商品管理.[ユーザーNo]=" & Me.ユーザ番号
Me.コンボ_ユーザ所有商品名一覧.RowSource = DBSelect(strQuerySQL)
Me.コンボ_ユーザ所有商品名一覧.Value = Me.コンボ_ユーザ所有商品名一覧.ItemData(0)
End Sub
先の回答では、このテスト内容は一切示していません。
しかし、質問文から、上述のようなテーブル構造になっているのか一抹の不安を覚えていました。
また、クエリにフォームを条件として組み込めば実行速度が大幅に低下するとも思っていました。
確かに、それは簡単に実現できる手法かも知れません。
が、クエリも所詮は SQL文。
ならば、VBA で直接に値リストを設定するのが手っ取り早いと思います。
SQL文自体は、クエリで作成すればいいです。
実際、上述のSQL文もクエリで作成しています。
もちろん、DBSelect関数は最速ではありません。
DAOでINDEXとSEEKを使えば、もっと、高速化します。
が、いずれにしろ 0.01秒以下の世界の話で、どっちでもいいのじゃないですかね。
Public Function DBSelect(ByVal strQuerySQL As String, _
Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
Dim I As Integer
Dim J As Integer
Dim R As Integer
Dim C As Integer
Dim M As Integer
Dim N As Integer
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim Datas As String
Set rst = New ADODB.Recordset
' =================
' Begin With: rst
' -----------------
With rst
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
M = .RecordCount - 1
N = .Fields.Count - 1
.MoveFirst
For R = 0 To M
For C = 0 To N
Datas = Datas & .Fields(C) & strSeparator
Next C
.MoveNext
Next R
End If
End With
' ---------------
' End With: rst
' ===============
Exit_DBSelect:
DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0))
Exit Function
Err_DBSelect:
MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & Err.Description & Chr$(13) & _
"・SQL Text=" & strQuerySQL, _
vbExclamation, " 関数エラーメッセージ"
Resume Exit_DBSelect
End Function
No.2
- 回答日時:
たかがレコード数1600で5秒は考えられないです
1秒でも長すぎます
PCのスペックなんかの問題ではなく作り方に問題があるのでしょうね
それを詳しく説明してみれば
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_01.png?5a7ff87)
No.1
- 回答日時:
>ユーザーが所有している商品番号は、商品リストと顧客名簿というテーブルを連結させたクエリで出来上がっています。
これから推測すると、顧客名簿に商品番号を入れるところがあるようですね。 1ユーザーが複数商品を保有する場合のデータの登録方法がどうなっているのかわかりませんが、顧客名簿の商品番号も、インデックスは、はい(重複あり)にすると良いと思います。 あとは最適化を行ってみること。 それで改善しなければ、他のスペックのPCで動かしてみて、改善があるか調べてみることくらいかな。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- ヤフオク! ヤフオク!の仕様が変更になり、落札者の電話番号が表示されません。 発送時に電話番号が必要なため、 落 3 2022/10/10 22:34
- Excel(エクセル) エクセルの表について 3 2023/04/14 18:00
- 国産バイク 大型バイク カワサキz900rsに付ける ヨシムラのマフラーの質問です、 【 商 品 I D 】14 2 2023/06/27 13:43
- その他(悩み相談・人生相談) Q.オンラインショップで商品を買いましたが 住所、郵便番号、電話番号(携帯)は描きましたが 番地を書 2 2023/06/11 07:15
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- ヤフオク! 関税 詐欺でしょうか?ヤフオク 3 2023/06/25 11:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
商品番号を入力すると、商品名...
-
LEFT JOIN あいまいな外部結合
-
2つのテーブルを結合して最大値...
-
Accessのフォームで思った順番...
-
特定条件での連番の振り方を教...
-
orace SQL文のエラー(ORA-0092...
-
各伝票に対して明細を1行目だけ...
-
文字列のあるキーワードから開...
-
ACCESSでフォーム上のオブジェ...
-
updateでグループ化
-
複数のゲストカテゴリ別売上集...
-
エクセルVBAコードで教えて下さ...
-
差し込み後、元データを変更し...
-
止まなーい雨はない でもお前に...
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
1、Rstudioで回帰直線を求める...
-
列のヘッダーを含めるのをデフ...
-
エクセルで最後の文字だけ置き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンピュータ
-
商品番号を入力すると、商品名...
-
LEFT JOIN あいまいな外部結合
-
特定条件での連番の振り方を教...
-
Accessのフォームで思った順番...
-
2つのテーブルを結合して最大値...
-
IDの欠番
-
updateでグループ化
-
orace SQL文のエラー(ORA-0092...
-
各伝票に対して明細を1行目だけ...
-
ACCESSでフォーム上のオブジェ...
-
Word差し込み印刷 数式について
-
エクセルでリピート率
-
同一テーブルのデータを検索条...
-
マクロをご教示ください。
-
文字列のあるキーワードから開...
-
Accessの追加クエリの方法(重...
-
アクセスのフォームで連動した...
-
正規化の問題
-
SQL文について
おすすめ情報