- ベストアンサー
VBAリストボックス作成
- VBA初心者の質問です。ユーザーフォームにタブつきのリストボックスを作りたいですが、どうすればいいでしょうか?リストはsheet1にあり、果物、野菜、青果のタブで表示されるようにしたいです。
- リストボックスにはsheet1のデータを表示するため、まずは該当するリストボックスを選択し、リストを設定します。果物、野菜、青果のタブに応じてリストボックスのデータが表示されるようにします。
- ユーザーフォームのInitializeイベントで、リストボックスの初期設定を行います。各リストボックスのデータはsheet1から取得し、タブに応じて表示させます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まずユーザーフォームにマルチページのコントロールを追加します。 タブで右クリックし新しいページを作成します。 各タブのCaption「果物」、「野菜」、「青果」にします。 果物ページにリストボックス(ListBox1)を追加、 野菜ページにリストボックス(ListBox2)を追加、 青果ページにリストボックス(ListBox3)を追加します。 コードに以下のソースを追加します。 Private Sub UserForm_Initialize() Dim x As Integer Dim y As Integer Worksheets("Sheet1").Activate With Worksheets("Sheet1") Me.ListBox1.ColumnCount = 2 Me.ListBox2.ColumnCount = 2 Me.ListBox3.ColumnCount = 2 For i = 1 To 6 If .Cells(i, 3).Value = "果物" Then Me.ListBox1.AddItem .Cells(i, 1).Value & ";" & .Cells(i, 2).Value ElseIf .Cells(i, 3).Value = "野菜" Then Me.ListBox2.AddItem .Cells(i, 1).Value & ";" & .Cells(i, 2).Value End If Me.ListBox3.AddItem .Cells(i, 1).Value & ";" & .Cells(i, 2).Value Next i End With End Sub
その他の回答 (2)
- sh_hirose
- ベストアンサー率66% (56/84)
>このリストですが、表示した後に複数選択し、セルに書き込んでいきます。 >1つのセルにNOと品名が入るようになっています。 > >Me.ListBox1.AddItem .Cells(i, 1).Value & ";" & .Cells(i, 2).Value > >の部分を改造したら出来るのではと思いいろいろやっているのですが、進めずに降ります。 選択したものが取得できないという意味? そうだとして回答します。 まずリストボックスのプロパティ「MultiSelect」を「fmMultiSelectMult」か「fmMultiSelectExtended」に選択します。 セルに書き込むトリガー用にボタン(CommandButton1)を作成しました。 Private Sub CommandButton1_Click() Dim y As Integer For y = 0 To Me.ListBox1.ListCount - 1 If Me.ListBox1.Selected(y) Then Debug.Print Me.ListBox1.List(y, 0) & " " & Me.ListBox1.List(y, 1) End If Next y End Sub Debug.Printの部分を適宜変更してください。
お礼
sh_hirose さま お忙しい中ありがとうございます。 思い通りに出来ました。 ありがとうございました。 VBAってとっても難しくて、でも魅力があるので、がんばって勉強します。またお世話になることがあるかもしれませんが、その時はよろしくお願いいたします。 長時間お付き合いいただきありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
>タブつきのリストボックス これがあってもおかしくはないが、普通はこういうコントロールは見つからないのでは。 コントロールなどは、業者レベル(やプロ級の人)になればいくらでも作れるもので購入すれば使えるものだからあってもおかしくはないが。 しかし私どもは、身近にある(使える)コントロールでやるのが普通で、そこには、タブつきのリストボックスは、ないでしょう。 ーー そして良く似たもので、「マルチページ」や「タブストリップ」「タブコントロール」 http://www.ken3.org/vba/backno/vba099.html(アクセスの例。参考)などが有るのでそれに使うとおもう。 どちらかというと表示用で、リストボックスは(選択して、入力する) 用途のものと思う。 各タブで選択できるページは、フォームの中のフォームだと思えばよい。色々なコントロールを、そこに貼り付けることが出来る。 リストボックスを貼り付けてみよう。 Page1にリストボックスを貼り付ける(ツールボックスからD&D)。Listbox1となる。 Page2にリストボックスを貼り付ける。Listbox2となる。 一方シートのF1:F5に、リストボックス1用のリストボックス用のアイテムを入れておく(ここがエクセルVBAらしく、シートと連携を取るところが、VBと違うところ)入れるセル範囲はどこでも良い。 ほうれん草 きゅうり なす かぼちゃ ーー またシートのG1:G5に、リストボックス2用のリストボックスのアイテムを入れておく。 りんご バナナ ぶどう さくらんぼ イチゴ ーー ユーザーフォームのnitializeイベントに Private Sub UserForm_Initialize() MultiPage1.BackColor = RGB(256, 0, 0) MultiPage1.Pages(0).Caption = "野菜" 'ページ 0 のキャプションを設定 MultiPage1.Pages(1).Caption = "果物" 'ページ 1 の 〃 MultiPage1.Value = 1 '果物のページタブ選択 MultiPage1.Pages(0).ListBox1.RowSource = "F1: F5" MultiPage1.Pages(1).ListBox2.RowSource = "G1: G5" End Sub これで、Sub/ユーザーフォームの実行で Page1のリストボックスには ほうれん草 きゅうり ・・が Page2のリストボックスには りんご バナナ ・・ が表示さていることが判る。 ーー MultiPage1.Value = 1 '果物のページタブ選択 でプログラムで、ページを選択できる。 ーーー Private Sub ListBox2_Click() MsgBox ListBox2.List(ListBox2.ListIndex) End Sub (ListBox1の場合も同形) を入れておくと、ListBox2のアイテムの1つをクリックして選択すると、上記例では、りんごなど、選択された品名が表示される。 本番では、その品名を使って、何か処理があるでしょう。
補足
早速にありがとうございます。 フォームに表示することが出来ました。 が、 このリストですが、表示した後に複数選択し、セルに書き込んでいきます。 1つのセルにNOと品名が入るようになっています。 Me.ListBox1.AddItem .Cells(i, 1).Value & ";" & .Cells(i, 2).Value の部分を改造したら出来るのではと思いいろいろやっているのですが、進めずに降ります。 お忙しいなか大変申し訳ありませんが、ここも教えていただけないでしょうか?よろしくお願いします。