質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2498閲覧

ユーザーフォームに検索機能を実装したいが、検索に必要なコードの書き方が分からない

miniryu

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/03/15 07:41

編集2018/03/15 08:35

前回の質問に対する回答を受けてエラーを消すことができました。次に検索機能の実装に必要なコードについて質問させてください)

<やりたいこと>

  • Excelのユーザーフォームで検索する
  • その際はAccessのデータベースを参照する

<ユーザーフォームの操作>

テキストボックスは2つ用意してますが、使用するのは基本的にどちらか1つで、より絞り込んで検索したい場合は2つとも使用する、というふうに考えております。

検索条件は
1つめのテキストボックスに「姓」または「セイ」を入力する
2つめのテキストボックスに「電話番号」を入力する
ということを、また部分一致を想定しています。

このうちのいずれかがデータと一致していたら、検索結果が表示されるようにしたいです。

検索対象フィールドは
「姓」「セイ」「電話番号1」「電話番号2」
というのを想定しています。

リストボックスに表示させたいフィールドが
「顧客コード」「姓」「名」「住所1」「住所2」「電話番号1」「電話番号2」
です。

下記は(書き方を理解できていない)検索条件のコードです…

vba

1If strSQL Like "*" & Me.TextBox1.Value & "*" Or strSQL Like "*" & Me.TextBox2.Value & "*" Then '検索が一致すれば(結果をリストボックスに表示)

前回の質問時にstrSQLはただの文字列なので、LIKEで比較しても検索できないとご指摘いただいています。
自分でも調べてみたのですが、まだ要領がわかっておりません。

検索用のコード全文は下記の通りです。よろしくお願いします。

vba

1'---ユーザーを検索 2Private Sub SearchButton_Click() 3 4' On Error GoTo Err_Handler 'エラーが起きたら"Err_Handler"へ 5 Call ConnectDB 'データベースに接続 6 7 strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター" '特定のフィールドを抽出 8 adoRs.Open strSQL, adoCn 9 10 If adoRs.BOF = True And adoRs.EOF = True Then 'データがない場合、データベースを切断して終了 11 Call CutDB 12 MsgBox "参照先にデータがありません。" 13 Exit Sub 14 End If 15 16 If strSQL Like "*" & Me.TextBox1.Value & "*" Or strSQL Like "*" & Me.TextBox2.Value & "*" Then '検索が一致すれば(結果をリストボックスに表示) 17 Do Until adoRs.EOF '抽出したレコードが終了するまで繰り返す 18 With Me.SearchList '該当したレコードをリストボックスに表示する 19 .AddItem adoRs.Fields(0).Value 20 End With 21 adoRs.MoveNext 22 Loop 23 Else '検索に一致するものがなければ、データベースを切断して終了 24 Call CutDB 25 MsgBox "一致するデータがありません。" 26 End If 27 28 Call CutDB '検索がすんだら、データベースを切断して終了 29 Exit Sub 30 31Err_Handler: 'エラーが起きたときの飛び先 32 Call CutDB 33 MsgBox Error$ 34 Debug.Print Error$ 35 Debug.Print strSQL 36 37End Sub 38

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2018/03/15 08:23

検索条件は、完全一致ですか、それとも、部分一致ですか。Like "*" & Me.TextBox1.Value & "*" というような条件は部分一致ですが。
guest

回答3

0

ベストアンサー

検索対象フィールドは
「姓」「セイ」「電話番号1」「電話番号2」

リストボックスに表示させたいフィールドが
「顧客コード」「姓」「名」「住所1」「住所2」「電話番号1」「電話番号2」

です。

これらの全てのフィールドを含むレコードセットを開く必用がありますので、SQL文字列は、
"SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2, セイ FROM 顧客マスター"
ですね。

上記のSQL文字列を利用してレコードセットを開いたあと、そのレコードセットに抽出条件を設定するには、Filter プロパティを利用します。

複数列のリストボックスの作成は下記が参考になるでしょう。

Office TANAKA - Excel VBA Tips[複数列のリストボックス]

サンプルコード

条件の詳細な仕様が不明なので、部分一致で、(姓, セイ) と (電話番号1, 電話番号2) はAND条件 と仮定してます。

vba

1'---ユーザーを検索 2Sub SearchButton_Click() 3 Dim strSQL As String 4 Dim cnt As long 5' On Error GoTo Err_Handler 'エラーが起きたら"Err_Handler"へ 6 Call ConnectDB 'データベースに接続 7 8 strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2, セイ FROM 顧客マスター" 9 adoRs.Open strSQL, adoCn 10 11 If adoRs.BOF And adoRs.EOF Then 'データがない場合、データベースを切断して終了 12 Call CutDB 13 MsgBox "参照先にデータがありません。" 14 Exit Sub 15 End If 16 17 '抽出条件を設定してフィルタをかける 18 adoRs.Filter = "姓 & メイ Like '%" & Me.TextBox1.Value & "%'" & _ 19 " AND 電話番号1 & ";" & 電話番号2 Like '%" & Me.TextBox1.Value & "%'" 20 If adoRs.BOF AND adoRs.EOF Then 21 Call CutDB 22 MsgBox "条件に一致するデータがありません。" 23 Else 24 With Me.SearchList '該当したレコードをリストボックスに表示する 25 .ColumnCount = 7 '列数 7 26 .ColumnWidths = "10;30;30;100;50;50" '列幅を設定 27 Do Until adoRs.EOF '抽出したレコードが終了するまで繰り返す 28 .AddItem "" 29 .List(cnt,0) = adoRs(0).Value 30 .List(cnt,1) = adoRs(1).Value 31 .List(cnt,2) = adoRs(2).Value 32 .List(cnt,3) = adoRs(3).Value 33 .List(cnt,4) = adoRs(4).Value 34 .List(cnt,5) = adoRs(5).Value 35 .List(cnt,6) = adoRs(6).Value 36 adoRs.MoveNext 37 cnt = Cnt + 1 38 Loop 39 End With 40 End If 41 42 Call CutDB '検索がすんだら、データベースを切断して終了 43 Exit Sub 44 45Err_Handler: 'エラーが起きたときの飛び先 46 Call CutDB 47 MsgBox Error$ 48 49End Sub

投稿2018/03/15 12:11

編集2018/03/15 13:04
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/03/15 15:37

ワイルドカードは*では?
hatena19

2018/03/16 00:59

ADOの場合は、ワイルドカードは % ですね。 ただ、今、確認してみたら、Filterプロパティに設定する場合は、* でも % でもいいみたいですね。 SQLの場合は、% でないとだめですが。
miniryu

2018/03/19 05:30

サンプルコードを元に自分の思う仕様に近づけることができました。 私の理解が不十分な点についても的確にアドバイスいただけて助かりました。 前回に引き続き、ありがとうございました。
guest

0

検索条件のところ良く見てなかったので適当な回答になってましたので訂正します。

SQL文に検索条件を組み込みましょう。
SQL自体はこんな感じで(TextBox1と2を指定した場合)

SQL

1SELECT 顧客コード,,,住所1,住所2,電話番号1,電話番号2 2 FROM 顧客マスター 3 WHERELIKE '%検索性%' OR 電話番号1='検索番号' OR 電話番号2='検索番号'

VBA側はこんな感じ。

VBA

1strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター " 2strSQL = strSQL & "WHERE 姓 LIKE '%" & TextBox1.Value & "%' OR 電話番号1='" & TextBox2.Value & "' OR 電話番号2='" & TextBox2.Value & "'"

姓は部分一致、電話番号は完全一致にしていますが、仕様にあわせて修正してください。
またTextBox1と2が必ず指定されるわけではないはずですので、必要な分だけ条件を追加しましょう。
電話番号が数字型なのか文字型なのかわからないので、とりあえず文字型としています。
条件がORなのかANDなのかはわからないので、仕様にあわせてください。

投稿2018/03/15 08:32

編集2018/03/15 08:50
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/03/15 15:36

ワイルドカードは*では?
ttyp03

2018/03/15 16:35

おっと、accessだから*か。うっかり。 指摘ありがとうございます。
miniryu

2018/03/19 05:32

動的なSQL?の書き方があるんですね。勉強になります。 ありがとうございました。
guest

0

先ず、

1つめのテキストボックスに「姓」または「セイ」を入力する

とは、漢字か半角カナを入力するということですか?
もしそうなら、検索対象とする項目はなんでしょう?
該当しそうな項目は「姓」,「名」しかありませんがこちらには漢字の氏名が格納されているのではないでしょうか?

条件の氏名の部分は条件追加になるでしょうが、記述としては以下のようになるかと。

VBA

1 If adoRs!姓 Like "*" & IIF(IsNull(Me.TextBox1.Value), "", Me.TextBox1.Value) & "*" Or adoRs!電話番号1 Like "*" & IIF(IsNull(Me.TextBox2.Value), "", Me.TextBox2.Value) & "*" Or adoRs!電話番号2 Like "*" & IIF(IsNull(Me.TextBox2.Value), "", Me.TextBox2.Value) & "*" Then '検索が一致すれば(結果をリストボックスに表示)

ところで以下はリストボックスに顧客コードを追加していますが、顧客コードのみで分かるんでしょうか?

VBA

1 With Me.SearchList '該当したレコードをリストボックスに表示する 2 .AddItem adoRs.Fields(0).Value 3 End With

投稿2018/03/15 08:30

編集2018/03/15 08:39
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miniryu

2018/03/19 05:33

私の理解が不十分なところをご指摘いただきありがとうございます。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問