【VBA】ユーザーフォームで絞りこみ検索をする【部分一致で抽出してForとIfで値を取得】

Поділитися
Вставка
  • Опубліковано 5 лис 2024

КОМЕНТАРІ • 7

  • @takebom207
    @takebom207 2 роки тому +2

    毎回、良い動画をありがとうございます。
    大変、参考になります!

  • @syouzama
    @syouzama Рік тому +1

    とても勉強になりました。今、ユーザーフォームで2段階のプルダウンリストを作成したいのですが、苦慮しています。
    例えば1つ目のプルダウンリストで総務部、営業部、経理部といった部を選択し、2つ目のプルダウンリストでそれぞれの
    部に所属する課を選択するといった事をしたいです。
    エクセルの機能で簡単にできるのは知っているのですが、ユーザーフォーム上で実行するにはどうしたらいいか
    私の知識ではわかりません。大変厚かましいのですが、もし可能であればご教授願いたいです。よろしくお願いします。

    • @IT-gx8sf
      @IT-gx8sf  Рік тому +1

      コメントありがとうございます!
      表の左上がA1セルになるように、下記のリストをシートに入力します。
      ↓シートに入力するリスト
      総務部 営業部 経理部
      総務第1課 営業第1課 経理第1課
      総務第2課 営業第2課 経理第2課
      総務第3課 営業第3課 経理第3課
      ↓ユーザーフォームに作成する項目
      「UserForm1」を作成して、「コンボボックス」を2つ作成します。オブジェクト名は、デフォルトのままとして、「ComboBox1」と「ComboBox2」とします。
      次のように、「UserForm1」のVBAコードを記載します。
      ↓ユーザーフォームのVBAコード
      Private Sub UserForm_Initialize()
      For j = 1 To 3
      ComboBox1.AddItem Cells(1, j)
      Next
      End Sub
      Private Sub ComboBox1_Change()
      ComboBox2.Clear
      For j = 1 To 3
      If ComboBox1.Text = Cells(1, j) Then
      For i = 2 To 4
      ComboBox2.AddItem Cells(i, j)
      Next
      Exit For
      End If
      Next
      ComboBox2.SetFocus
      SendKeys "%{DOWN}"
      End Sub
      ↓実行した結果
      これで、「ComboBox1」のリストを選択すると、それに連動して「ComboBox2」のリストが変更されます。変更されたリストを使って、「ComboBox2」から値を選択することができます。
      VBAコードの流れとしては、次のようになります。
      ↓VBAコードの流れ
      ・ユーザーフォームの「Initialize」イベントで、「ComboBox1」のリストにA1~C1の値を設定
      ・「ComboBox1」の「Change」イベントで、「ComboBox1」の値が変更されたタイミングで実行
      ・「ComboBox1」の値が入力されているシートの「列番号」を取得
      ・「列番号」の2~4行目のリストを「ComboBox2」のリストに登録
      参考になればと思います(^^)不明な点がございましたら、コメントいただければと思います。

    • @syouzama
      @syouzama Рік тому +1

      @@IT-gx8sf ありがとうございます!ちょっと時間かかると思いますがやってみます。
      こんなにすぐ返事いただけると思っていませんでした。本当にありがとうございます。

  • @Asobi_Asobi
    @Asobi_Asobi Рік тому +1

    先生、エンターを押しても
    検索できません!
    どうしたら良いですか?
    何かヒントでも教えて頂かないでしょうか

    • @IT-gx8sf
      @IT-gx8sf  Рік тому +1

      コメントありがとうございます!
      原因としては次が考えられます。
      ①KeyDownイベントがうまく実行していない
      ②大文字小文字、全角半角の違いでうまく検索できていない
      ■原因①
      ①が実行できているかの確認で、次のVBAコードを実行した場合は、メッセージが表示されますでしょうか。
      Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

      If KeyCode vbKeyReturn Then Exit Sub 'Enter以外は、処理を終了

      MsgBox "A"

      End Sub
      ■原因②
      原因①で実行できた場合は、検索する際に「大文字小文字」や「全角半角」の違いでうまく検索できていない可能性があります。
      例えば、検索は小文字の「A」で検索したけど、入力されているのは大文字の「A」というような場合です。
      「InStr」の引数をうまく使うことで、全角や半角、大文字や小文字、ひらがなカタカナを区別せずに検索することができます。
      VBAコードは、次のようになります。
      Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode vbKeyReturn Then Exit Sub 'Enter以外は、処理を終了
      ListBox1.Clear 'リストボックスをクリア
      'データベースを検索
      For i = 2 To Sheets("DB").Cells(Rows.Count, "A").End(xlUp).Row
      '部分一致で商品を検索
      If InStr(1, Sheets("DB").Cells(i, "A"), TextBox1.Text, vbTextCompare) > 0 Then
      ListBox1.AddItem Sheets("DB").Cells(i, "A") 'リストボックスに値を追加
      End If
      Next

      End Sub
      「InStr(1, 文字列1, 文字列2, vbTextCompare)」というように使うことで、大文字小文字、全角半角、ひらがなカタカナを区別せずに検索することができます。
      上記の2つの方法でまずは確認してみるといいかもしれません。
      参考になればと思います(^^)

    • @Asobi_Asobi
      @Asobi_Asobi Рік тому +1

      @@IT-gx8sf 先生のご教授があり、無事に仕事が捗りました!
      先生本当に感謝しかありません。
      また宜しくお願いします🤲