とりにくを好きな人がVBAを勉強しています。

VBAを中心に、その他日々の生活で感じていることを書いていきます。

【VBA】今めっちゃ便利だと思ってはまっているやつについて

おはようございます。こんにちは。こんばんは。
時間がたったら無料で漫画が読めるタイプのアプリにはまってしまい、1週間ぶりの更新となってしまったとりにくVBAです。


今回は最近作ったもので「簡単なのに、いい感じだなあ」と思ったユーザーフォームを紹介します。



ユーザーフォームで検索

まずは完成イメージです。

f:id:mayo032j:20200606135540p:plain



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件と決まっていたので、そのまま数字を入れました。



これでオリジナル検索フォームの完成です。


実際のコード

実際に書いたコードはこちらです。
f:id:mayo032j:20200606142107p:plain



フォームを開いたときには、全部のリストを取得するようにしています。
(UserForm_Initialize())




また、フリガナはカタカナでしたので、テキストボックスを入力するときはカタカナ入力になるようにしています。
また、そのままフォームを閉じるとカタカナ入力が保持されるので、テキストボックスを離れたら、元に戻すようにしています。
(TextBox1_Enter 、 TextBox1_Exit)




あとお試ししてくださればお分かりかと思いますが、AddItemではリストを追加するだけですので、どんどん増えていきます。
なので、テキストボックスの値が変わるたびにいったんリストを全て削除しています。
(ListBox1.Clear)



おわりに

簡単にできたんですが、意外と使い勝手がいいです。オートフィルタで絞りこみも少し面倒ですし、Excelの検索はセルを選択するだけですので。


任意の検索値で、任意の結果を得られるので、アイディア次第でもっと便利なものに変化させられると思います。