【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!


リストボックス,additem皆様こんにちは、ノグチです。

ユーザーフォームを作って使ってみるまでを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。

前回記事では、リストボックスのRowSourceプロパティにワークシートの範囲を指定することで、リストボックスにワークシートの範囲にある値を表示する方法をご紹介しました。

【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
エクセルのユーザーフォームを作って使うことを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。今回は、リストボックスのRowSourceプロパティをVBAで指定することで、他のコントロールの入力値によってリストボックスに表示する値を変動させる方法をご紹介しています。

しかし前回記事では、「結局、リストボックスにはワークシート上の範囲にある値しか表示できないの?」というモヤモヤが残ってしまいました。

今回はそのモヤモヤを解消すべく、リストボックスの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メソッドを使って下記のように記述します。

ListBoxオブジェクト.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行のみ。

ユーザーフォーム,リストボックス,AddItem,検索結果

なのでリストボックスには「福岡」と「栃木」が表示されるはずです。

テキストボックスにいちごを入力してみると…

ユーザーフォーム,リストボックス,AddItem

この通り、表示されてほしい値だけがAddItemメソッドでリストボックスに追加されていますね。

ユーザーフォーム,リストボックス,AddItem,検索結果,フォーム

RowSourceプロパティとの併用はできない

ここまでAddItemメソッドをご紹介してきましたが、注意点がひとつ。

それは、1つのリストボックスに対して、RowSourceプロパティとAddItemメソッドは併用することができないということです。

RowSourceプロパティでリストボックスの値をセットしていた場合、そのリストボックスに対して更にAddItemメソッドで値を追加しようとすると、こんなエラーになってしまいます。

ユーザーフォーム,リストボックス,AddItem,エラー

また、AddItemメソッドでリストボックスに値を追加していっても、その後でRowSourceプロパティでリストボックスの値を設定してしまうと、AddItemメソッドで追加した値が、RowSourceプロパティに設定したワークシート範囲の値で上書きされてしまいます。

RowSourceプロパティでセットした値の後に続けてAddItemメソッドで値を追加…や、その逆のような都合のよい使い方はできないということですね。

1つのリストボックスに対して何度も値を変更させたい場合は、値を追加する方法はAddItemメソッドでの追加か、RowSourceプロパティを使うかのどちらかに統一しましょう。

最後に

リストボックスのAddItemメソッドを使って、任意の値をリストボックスの値としてセットする方法をご紹介しました。

今回ご紹介したAddItemメソッドと、前回ご紹介したRowSourceプロパティ、ユーザーフォームでやりたいことによって使い分けられるとよいですね。

それでは、最後までお読みいただきありがとうございました!

連載目次:【エクセルVBA】ユーザーフォームを使ってみよう!

ユーザーフォームは、ちょっとした画面なら作れてしまう、便利な機能です。

何となく敷居が高いように感じてしまいますが、順を追っていけば難しいことはありませんよ。

  1. 【エクセルVBA】ユーザーフォームを作ってみよう!VBEでフォームを挿入する方法
  2. 【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
  3. 【エクセルVBA】コマンドボタンのClickイベントとUnloadステートメントでユーザーフォームを閉じる方法
  4. 【エクセルVBA】テキストボックスのプロパティで入力を便利にしよう
  5. 【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
  6. 【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
  7. 【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう
  8. 【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう
  9. 【エクセルVBA】ユーザーフォームのリストボックスを使ってみよう!
  10. 【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
  11. 【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!
  12. 【エクセルVBA】リストボックスのListプロパティで複数列の値を更新する
  13. 【エクセルVBA】ユーザーフォームにコンボボックスを追加する方法
  14. 【エクセルVBA】コンボボックスに値をセットする2つの方法 RowSourceプロパティとAddItemメソッド

 


タイトルとURLをコピーしました