【VBA】今めっちゃ便利だと思ってはまっているやつについて
おはようございます。こんにちは。こんばんは。
時間がたったら無料で漫画が読めるタイプのアプリにはまってしまい、1週間ぶりの更新となってしまったとりにくVBAです。
今回は最近作ったもので「簡単なのに、いい感じだなあ」と思ったユーザーフォームを紹介します。
ユーザーフォームで検索
まずは完成イメージです。
webでダミーデータを生成して、名簿みたいなのを1000件準備しました。
フリガナを使って、名前を検索するものです。
仕事で似たような場面があり、少し時間があったときに作ってみました。
ロジックを考えよう
- C列の値はテキストボックスの値を含むか?
- 含んでいたら、B列の値をリストボックスに追加する
考えることはたったこの2つです。
コードを書いていこう
C列の値はテキストボックスの値を含むか?
ここでは単純にIF文を使いましょう。
If 条件式 Then 処理 End If
条件式は、C列の値がテキストボックスの値を含むかどうかです。
正規表現を使って、次のようにします。
If Sheet1.Cells(i, 3).Value Like TextBox1.Text & "*" Then 処理 End If
※繰り返し処理をする予定なので、行には変数を使っています。
さて、これで分岐についてはコーディングできました。
含んでいたら、B列の値をリストボックスに追加する
次に処理を書いていきましょう。
リストボックスに値を追加するには、AddItemメソッドを使います。
ListBox1.AddItem 値
今回は同じ行の、B列の値をリストにしていきたいので、
ListBox1.AddItem Sheet1.Cells(i, 2).Value
これでB列の値をリストに追加できます。
合体
条件分岐と処理を組み合わせます。
さらに全体をForNext文で挟んで繰り返します。
For i = 2 to 1001 If Sheet1.Cells(i, 3).Value Like TextBox1.Text & "*" Then ListBox1.AddItem Sheet1.Cells(i, 2).Value End If Next i
※今回はデータの数が1000件と決まっていたので、そのまま数字を入れました。
これでオリジナル検索フォームの完成です。
実際のコード
実際に書いたコードはこちらです。
フォームを開いたときには、全部のリストを取得するようにしています。
(UserForm_Initialize())
また、フリガナはカタカナでしたので、テキストボックスを入力するときはカタカナ入力になるようにしています。
また、そのままフォームを閉じるとカタカナ入力が保持されるので、テキストボックスを離れたら、元に戻すようにしています。
(TextBox1_Enter 、 TextBox1_Exit)
あとお試ししてくださればお分かりかと思いますが、AddItemではリストを追加するだけですので、どんどん増えていきます。
なので、テキストボックスの値が変わるたびにいったんリストを全て削除しています。
(ListBox1.Clear)
おわりに
簡単にできたんですが、意外と使い勝手がいいです。オートフィルタで絞りこみも少し面倒ですし、Excelの検索はセルを選択するだけですので。
任意の検索値で、任意の結果を得られるので、アイディア次第でもっと便利なものに変化させられると思います。