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

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

ただいまの
回答率

90.50%

  • VBA

    2315questions

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

  • Excel

    1926questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,268

miniryu

score 9

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

<やりたいこと>

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

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

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

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

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

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

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

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

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


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

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

'---ユーザーを検索
Private Sub SearchButton_Click()

'    On Error GoTo Err_Handler   'エラーが起きたら"Err_Handler"へ
    Call ConnectDB  'データベースに接続

    strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター" '特定のフィールドを抽出
    adoRs.Open strSQL, adoCn

    If adoRs.BOF = True And adoRs.EOF = True Then   'データがない場合、データベースを切断して終了
        Call CutDB
        MsgBox "参照先にデータがありません。"
        Exit Sub
    End If

    If strSQL Like "*" & Me.TextBox1.Value & "*" Or strSQL Like "*" & Me.TextBox2.Value & "*" Then  '検索が一致すれば(結果をリストボックスに表示)
        Do Until adoRs.EOF      '抽出したレコードが終了するまで繰り返す
            With Me.SearchList  '該当したレコードをリストボックスに表示する
                .AddItem adoRs.Fields(0).Value
            End With
            adoRs.MoveNext
        Loop
    Else                        '検索に一致するものがなければ、データベースを切断して終了
        Call CutDB
        MsgBox "一致するデータがありません。"
    End If

    Call CutDB      '検索がすんだら、データベースを切断して終了
    Exit Sub

Err_Handler:        'エラーが起きたときの飛び先
    Call CutDB
    MsgBox Error$
    Debug.Print Error$
    Debug.Print strSQL

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hatena19

    2018/03/15 17:23

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

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

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

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

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

サンプルコード

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

'---ユーザーを検索
Sub SearchButton_Click()
    Dim strSQL As String
    Dim cnt As long
'    On Error GoTo Err_Handler   'エラーが起きたら"Err_Handler"へ
    Call ConnectDB  'データベースに接続

    strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2, セイ FROM 顧客マスター"
    adoRs.Open strSQL, adoCn

    If adoRs.BOF And adoRs.EOF Then   'データがない場合、データベースを切断して終了
        Call CutDB
        MsgBox "参照先にデータがありません。"
        Exit Sub
    End If

    '抽出条件を設定してフィルタをかける
    adoRs.Filter = "姓 & メイ Like '%" & Me.TextBox1.Value & "%'" & _
              " AND 電話番号1 & ";" & 電話番号2 Like '%" & Me.TextBox1.Value & "%'"
    If adoRs.BOF AND adoRs.EOF Then
        Call CutDB
        MsgBox "条件に一致するデータがありません。"    
    Else
        With Me.SearchList  '該当したレコードをリストボックスに表示する
            .ColumnCount = 7 '列数 7
            .ColumnWidths = "10;30;30;100;50;50" '列幅を設定
            Do Until adoRs.EOF      '抽出したレコードが終了するまで繰り返す
                .AddItem ""
                .List(cnt,0) = adoRs(0).Value
                .List(cnt,1) = adoRs(1).Value
                .List(cnt,2) = adoRs(2).Value
                .List(cnt,3) = adoRs(3).Value
                .List(cnt,4) = adoRs(4).Value
                .List(cnt,5) = adoRs(5).Value
                .List(cnt,6) = adoRs(6).Value                
                adoRs.MoveNext
                cnt = Cnt + 1
            Loop
        End With
    End If

    Call CutDB      '検索がすんだら、データベースを切断して終了
    Exit Sub

Err_Handler:        'エラーが起きたときの飛び先
    Call CutDB
    MsgBox Error$

End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 00:37

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

    キャンセル

  • 2018/03/16 09:59

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

    キャンセル

  • 2018/03/19 14:30

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

    キャンセル

0

先ず、

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  '検索が一致すれば(結果をリストボックスに表示)


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/19 14:33

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

    キャンセル

0

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

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

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


VBA側はこんな感じ。

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 00:36

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

    キャンセル

  • 2018/03/16 01:35

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

    キャンセル

  • 2018/03/19 14:32

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

    キャンセル

同じタグがついた質問を見る

  • VBA

    2315questions

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

  • Excel

    1926questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • トップ
  • VBAに関する質問
  • ユーザーフォームに検索機能を実装したいが、検索に必要なコードの書き方が分からない