質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

2回答

5599閲覧

2つのリストボックスに複数列を表示させたい

gumiPons

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

0グッド

0クリップ

投稿2020/03/10 12:59

前提・実現したいこと

初めて投稿させて頂きます。
VBAで2つのリストボックスを連動させました。
2つ目のリストボックスで複数列を表示させようとした際、エラーが発生してしました。
(画像は架空の個人情報です)
イメージ説明

発生している問題・エラーメッセージ

実行時エラー'381': listプロパティを設定できません。プロパティの配列のインデックスが無効です。

該当のソースコード

VBA

1Private Sub UserForm_Initialize() 2 Dim i As Long 3 Dim lastRow As Long 4 With ListBox1 5 6 .Clear 7 .ColumnCount = 2 8 .ColumnWidths = 20 9 End With 10 With Worksheets("リスト1") 11 For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 12 ListBox1.AddItem Cells(i, 1) 13 ListBox1.List(i - 2, 1) = .Cells(i, 2) 14 Next 15 ListBox1.ListIndex = 0 16 End With 17End Sub 18 19Private Sub ListBox1_Click() 20 Dim i As Long 21 ListBox2.Clear 22 With Worksheets("リスト1") 23 For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 24 If ListBox1.Text = .Cells(i, 1) Then 25 ListBox2.AddItem .Cells(i, 3) 26 'ListBox2.List(i - 2, 1) = .Cells(i, 4) ここでエラーになる 27 End If 28 Next 29 End With 30End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

一例です。

ExcelVBA

1Option Explicit 2 3Private Sub ListBox1_Change() 4 Dim v As Variant 5 6 With Me.ListBox1 7 v = WorksheetFunction.Index(.List, .ListIndex + 1, 0) 8 End With 9 10 With Me.ListBox2 11 .Clear 12 .AddItem v(1) 13 .AddItem v(2) 14 .AddItem v(4) 15 .AddItem v(5) 16 End With 17End Sub 18 19Private Sub UserForm_Initialize() 20 With Worksheets(1).Range("A1").CurrentRegion 21 Me.ListBox1.List = Intersect(.Resize(, 7), .Offset(1, 1)).Value 22 End With 23End Sub

こういうことがやりたいのかな?


ExcelVBA

1Option Explicit 2 3Private Sub UserForm_Initialize() 4 With Worksheets(1).Range("A1").CurrentRegion 5 Me.ListBox1.List = Intersect(.Resize(, 7), .Offset(1, 1)).Value 6 End With 7 Me.ListBox1.MultiSelect = fmMultiSelectExtended 8 With Me.ListBox2 9 .ColumnCount = 4 10 .ColumnWidths = "20;20;20;20" 11 End With 12End Sub 13 14Private Sub ListBox1_Change() 15 Dim ix As Long 16 Dim v As Variant 17 Dim i As Long, j As Long 18 19 Me.ListBox2.Clear 20 21 With Me.ListBox1 22 For ix = 0 To .ListCount - 1 23 If .Selected(ix) Then 24 Me.ListBox2.AddItem "" 25 i = 0 26 j = 0 27 For Each v In WorksheetFunction.Index(.List, ix + 1, 0) 28 j = j + 1 29 If j <> 3 Then 30 Me.ListBox2.List(Me.ListBox2.ListCount - 1, i) = v 31 i = i + 1 32 End If 33 Next 34 End If 35 Next 36 End With 37End Sub

説明の言葉が難しくてよくわかんないけど。。。

投稿2020/03/11 00:35

編集2020/03/12 10:19
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gumiPons

2020/03/12 09:04

ありがとうございます!intersectメソッドを知らなかったので、試して勉強になりました! 質問が悪かったのですが、一意のリストボックス1に対し、リストボックス2は複数の行を返すように作成を目指していました! ListBox2.List(i - 2, 1) = .Cells(i, 4) を ListBox2.List(ListBox2.ListCount - 1, 1) = .Cells(i, 4) に変更することでできました。
guest

0

ベストアンサー

vba

1Private Sub UserForm_Initialize() 2 Dim i As Long 3 With ListBox1 4 .ColumnCount = 2 5 .ColumnWidths = "15;50" 6 End With 7 8 '↓ListBox2の列数と列幅を設定する必要がある 9 With ListBox2 10 .ColumnCount = 2 11 .ColumnWidths = "50;50" 12 End With 13 With Worksheets("リスト1") 14 For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 15 ListBox1.AddItem Cells(i, 1) 16 ListBox1.List(i - 2, 1) = .Cells(i, 2) 17 Next 18 ListBox1.ListIndex = 0 19 End With 20End Sub 21 22Private Sub ListBox1_Click() 23 Dim i As Long 24 25 ListBox2.Clear 26 With Worksheets("リスト1") 27 For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 28 If ListBox1.Text = .Cells(i, 1) Then 29 ListBox2.AddItem .Cells(i, 3) 30 '↓1行しかないので1行目の2列目に代入 31 ListBox2.List(0, 1) = .Cells(i, 4) 32 Exit For 33 End If 34 Next 35 End With 36End Sub

別案

vba

1Private Sub UserForm_Initialize() 2 With ListBox1 3 .ColumnCount = 4 4 .ColumnWidths = "20;100;0;0" 5 End With 6 7 With ListBox2 8 .ColumnCount = 2 9 .ColumnWidths = "50;50" 10 End With 11 12 With Worksheets("リスト1").Range("A1").CurrentRegion 13 ListBox1.List = .Offset(1).Resize(.Rows.Count - 1, 4).Value 14 ListBox1.ListIndex = 0 15 End With 16End Sub 17 18Private Sub ListBox1_Click() 19 With ListBox1 20 ListBox2.Clear 21 ListBox2.AddItem .List(.ListIndex, 2) 22 ListBox2.List(0, 1) = .List(.ListIndex, 3) 23 End With 24End Sub

投稿2020/03/10 13:43

編集2020/03/10 15:35
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gumiPons

2020/03/10 15:42

初めて質問サイトで質問しましたが、詳しく記載頂き感動しました。 案1を走らせて動いたため更に感動しました。 2列目に1行しか入らなかったためエラーが発生したと理解できました。 別案は明日、試させていただきます。
gumiPons

2020/03/12 10:09

ListBox2.List(i - 2, 1) = .Cells(i, 4) がエラーなのに、どうしてListBox2.List(0, 1) = .Cells(i, 4)で可能なのか考えた結果、ループすることで配列の数がズレるのかな?と思い ListBox2.List(ListBox2.ListCount - 1, 1) = .Cells(i, 4)にすることで実現できました! 別案も試させていただきました。 簡素にコーディングが記述してあり、素晴らしいです。 初投稿ということもあり、質問が悪かったのですがリスト1の一意の数をもとにリスト2は複数の行を抽出し連動させたいということでした! とても助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問