ユーザーフォームを作って使ってみるまでを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。
前回記事では、リストボックスのRowSourceプロパティにワークシートの範囲を指定することで、リストボックスにワークシートの範囲にある値を表示する方法をご紹介しました。
しかし前回記事では、「結局、リストボックスにはワークシート上の範囲にある値しか表示できないの?」というモヤモヤが残ってしまいました。
今回はそのモヤモヤを解消すべく、リストボックスのAddItemメソッドを使って、ワークシートの範囲ではない任意の値をリストボックスの値としてセットする方法をご紹介します。
前回までのおさらい
毎度おなじみ、前回までに作成したユーザーフォームがこちら。
前回は、「品名」のテキストボックスに入力した値からこちらのワークシートを検索して…
検索にヒットした値をワークシート上に書き出し、書き出した値を「生産地」リストボックスのRowSourceプロパティにセットして、リストボックスに検索結果を表示させたのでした。
そして、前回作成した検索用のコードがこちら。
Private Sub TextItem_AfterUpdate() With ActiveSheet .Range("E:E").Clear Dim myRange As Range Dim rngSearch As Range Dim strAddress As String Set myRange = .Range("A2:A13") Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart) Dim i As Long i = 1 If Not rngSearch Is Nothing Then .Cells(i, 5).Value = .Cells(rngSearch.Row, rngSearch.Column + 1).Value strAddress = rngSearch.Address Do Set rngSearch = myRange.FindNext(rngSearch) If rngSearch Is Nothing Then Exit Do Else If strAddress <> rngSearch.Address Then i = i + 1 .Cells(i, 5).Value = .Cells(rngSearch.Row, rngSearch.Column + 1).Value End If End If Loop While rngSearch.Address <> strAddress Else .Cells(i, 5).Value = "該当なし" End If 'リストボックスに検索結果の範囲をセット ListRegion.RowSource = .Range(.Cells(1, 5), .Cells(i, 5)).Address End With End Sub
今回は、こちらのコードを、リストボックスのAddItemメソッドを使った処理に置き換えていきましょう。
AddItemメソッドの記述方法
まずはAddItemメソッドの記述方法から。
リストボックスにRowSourceプロパティを使わないで値を追加する場合、AddItemメソッドを使って下記のように記述します。
追加したい順序は、AddItemメソッドで追加しようとしている値をリストの何番目に入れたいのか、を指定するパラメータです。
省略可能で、指定しなければリストの一番下に入れてくれます。
指定したい場合は数値を指定すればよいのですが、先頭が1ではなく0ですので、注意が必要です。
3行以上あるリストの3番目に追加したい場合は、0から3つ数えて「2」を指定することになりますね。
AddItemメソッドでリストボックスに値をセットする
AddItemメソッドで検索結果をリストボックスに追加するコード
では早速、AddItemメソッドを使ってリストボックスに値を追加してみましょう。
コードはこちら。
Private Sub TextItem_AfterUpdate() With ActiveSheet Dim myRange As Range Dim rngSearch As Range Set myRange = .Range("A2:A13") Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart) If Not rngSearch Is Nothing Then ListRegion.AddItem .Cells(rngSearch.Row, rngSearch.Column + 1).Value strAddress = rngSearch.Address Do Set rngSearch = myRange.FindNext(rngSearch) If rngSearch Is Nothing Then Exit Do Else If strAddress <> rngSearch.Address Then ListRegion.AddItem .Cells(rngSearch.Row, rngSearch.Column + 1).Value End If End If Loop While rngSearch.Address <> strAddress End If End With End Sub
前回のRowSouceプロパティを使う方法の、検索にヒットした値の処理部分を、AddItemメソッドでリストボックスに追加するように変更しています。
検索にヒットした値をAddItemメソッドでリストボックスに追加する
では早速、上のコードを実行してみましょう。
検索に使うワークシートは前回同様のこちら。
テキストボックスに「いちご」と入力して、ワークシートから検索してみます。
ワークシート上に「いちご」があるのはこちらの2行のみ。
なのでリストボックスには「福岡」と「栃木」が表示されるはずです。
テキストボックスにいちごを入力してみると…
RowSourceプロパティとの併用はできない
ここまでAddItemメソッドをご紹介してきましたが、注意点がひとつ。
それは、1つのリストボックスに対して、RowSourceプロパティとAddItemメソッドは併用することができないということです。
RowSourceプロパティでリストボックスの値をセットしていた場合、そのリストボックスに対して更にAddItemメソッドで値を追加しようとすると、こんなエラーになってしまいます。
また、AddItemメソッドでリストボックスに値を追加していっても、その後でRowSourceプロパティでリストボックスの値を設定してしまうと、AddItemメソッドで追加した値が、RowSourceプロパティに設定したワークシート範囲の値で上書きされてしまいます。
RowSourceプロパティでセットした値の後に続けてAddItemメソッドで値を追加…や、その逆のような都合のよい使い方はできないということですね。
最後に
リストボックスのAddItemメソッドを使って、任意の値をリストボックスの値としてセットする方法をご紹介しました。
今回ご紹介したAddItemメソッドと、前回ご紹介したRowSourceプロパティ、ユーザーフォームでやりたいことによって使い分けられるとよいですね。
それでは、最後までお読みいただきありがとうございました!
連載目次:【エクセルVBA】ユーザーフォームを使ってみよう!
ユーザーフォームは、ちょっとした画面なら作れてしまう、便利な機能です。
何となく敷居が高いように感じてしまいますが、順を追っていけば難しいことはありませんよ。
- 【エクセルVBA】ユーザーフォームを作ってみよう!VBEでフォームを挿入する方法
- 【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
- 【エクセルVBA】コマンドボタンのClickイベントとUnloadステートメントでユーザーフォームを閉じる方法
- 【エクセルVBA】テキストボックスのプロパティで入力を便利にしよう
- 【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
- 【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
- 【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう
- 【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう
- 【エクセルVBA】ユーザーフォームのリストボックスを使ってみよう!
- 【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
- 【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!
- 【エクセルVBA】リストボックスのListプロパティで複数列の値を更新する
- 【エクセルVBA】ユーザーフォームにコンボボックスを追加する方法
- 【エクセルVBA】コンボボックスに値をセットする2つの方法 RowSourceプロパティとAddItemメソッド