こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA リストボックスについて

VBA初心者です。どうぞよろしくお願いします。
ユーザーフォームにタブつきのリストボックスを作りたいと思っています。
リストはsheet1の中にあります。
  A    B    C    D・・・
1  NO  品名  売場
2  1  いちご  果物
3  2  みかん  果物
4  3  もも    果物
5  4  ハクサイ 野菜
6  5  キャベツ 野菜
7  6  きゅうり  野菜
8  7
9


果物のタブには、果物の品名が表示される。
1いちご
2みかん
3もも
野菜のタブには、野菜の品名が表示される。
4ハクサイ
5キャベツ
6きゅうり
青果のタブには、果物、野菜が表示される。
1いちご
2みかん
3もも
4ハクサイ
5キャベツ
6きゅうり

本を見ながら格闘しておりますが、きっと的違いで滅茶苦茶なことをしているのだと思います。
どうにも出来ず困っております。どなたか教えていただけないでしょうか。よろしくお願いします。

Private Sub UserForm_Initialize()

Dim LastRow As Long
Dim i As Integer
Dim ListBoxNo As Integer
Dim ListBox As Control
Dim Listtabu(3) As Long 'タブの数
For i = 1 To 3
Listtabu(i) = 0
Next i

Worksheets("sheet1").Activate

With Worksheets("sheet1")
LastRow = .Range("A65536").End(xlUp).Row
For i = 2 To LastRow

If Worksheets("sheet1").Range(Cells(i, 3)) = "果物" Then
ListBoxNo = 1
Set ListBox = 果物
果物.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value
End If

If Worksheets("sheet1").Range(Cells(i, 3)) = "野菜" Then
ListBoxNo = 2
Set ListBox = 野菜
野菜.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value
End If

If Worksheets("sheet1").Range(Cells(i, 3)) = "果物" & "野菜" Then
ListBoxNo = 3
Set ListBox = 青果
青果.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value
End If

ListBox.AddItem
ListBox.List(Listtabu(LstBxNo), 0) = Worksheets("sheet1").Cells(i, 1).Value
ListBox.List(Listtabu(LstBxNo), 1) = Worksheets("sheet1").Cells(i, 2).Value
Listtabu(LstBxNo) = Listtabu(LstBxNo) + 1
Next
End With
End Sub

投稿日時 - 2009-06-11 11:22:59

QNo.5034761

困ってます

質問者が選んだベストアンサー

まずユーザーフォームにマルチページのコントロールを追加します。

タブで右クリックし新しいページを作成します。

各タブの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

投稿日時 - 2009-06-11 13:03:41

補足

早速にありがとうございます。
フォームに表示することが出来ました。
が、
このリストですが、表示した後に複数選択し、セルに書き込んでいきます。
1つのセルにNOと品名が入るようになっています。

Me.ListBox1.AddItem .Cells(i, 1).Value & ";" & .Cells(i, 2).Value

の部分を改造したら出来るのではと思いいろいろやっているのですが、進めずに降ります。
お忙しいなか大変申し訳ありませんが、ここも教えていただけないでしょうか?よろしくお願いします。

投稿日時 - 2009-06-11 14:47:53

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>このリストですが、表示した後に複数選択し、セルに書き込んでいきます。
>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の部分を適宜変更してください。

投稿日時 - 2009-06-11 21:51:57

お礼

sh_hirose さま
お忙しい中ありがとうございます。
思い通りに出来ました。
ありがとうございました。
VBAってとっても難しくて、でも魅力があるので、がんばって勉強します。またお世話になることがあるかもしれませんが、その時はよろしくお願いいたします。
長時間お付き合いいただきありがとうございました。

投稿日時 - 2009-06-12 09:45:10

ANo.2

>タブつきのリストボックス
これがあってもおかしくはないが、普通はこういうコントロールは見つからないのでは。
コントロールなどは、業者レベル(やプロ級の人)になればいくらでも作れるもので購入すれば使えるものだからあってもおかしくはないが。
しかし私どもは、身近にある(使える)コントロールでやるのが普通で、そこには、タブつきのリストボックスは、ないでしょう。
ーー
そして良く似たもので、「マルチページ」や「タブストリップ」「タブコントロール」
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つをクリックして選択すると、上記例では、りんごなど、選択された品名が表示される。
本番では、その品名を使って、何か処理があるでしょう。

投稿日時 - 2009-06-11 15:13:30

あなたにオススメの質問