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

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

ただいまの
回答率

88.04%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,449

score 7

前提・実現したいこと

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

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

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

該当のソースコード

Private Sub UserForm_Initialize()
    Dim i As Long
    Dim lastRow As Long
    With ListBox1

        .Clear
        .ColumnCount = 2
        .ColumnWidths = 20
    End With
    With Worksheets("リスト1")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            ListBox1.AddItem Cells(i, 1)
            ListBox1.List(i - 2, 1) = .Cells(i, 2)
        Next
        ListBox1.ListIndex = 0
    End With
End Sub

Private Sub ListBox1_Click()
    Dim i As Long
    ListBox2.Clear
    With Worksheets("リスト1")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            If ListBox1.Text = .Cells(i, 1) Then
                ListBox2.AddItem .Cells(i, 3)
                'ListBox2.List(i - 2, 1) = .Cells(i, 4) ここでエラーになる
            End If
        Next
    End With
End Sub
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Private Sub UserForm_Initialize()
    Dim i As Long
    With ListBox1
        .ColumnCount = 2
        .ColumnWidths = "15;50"
    End With

    '↓ListBox2の列数と列幅を設定する必要がある
    With ListBox2
        .ColumnCount = 2
        .ColumnWidths = "50;50"
    End With
    With Worksheets("リスト1")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            ListBox1.AddItem Cells(i, 1)
            ListBox1.List(i - 2, 1) = .Cells(i, 2)
        Next
        ListBox1.ListIndex = 0
    End With
End Sub

Private Sub ListBox1_Click()
    Dim i As Long

    ListBox2.Clear
    With Worksheets("リスト1")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            If ListBox1.Text = .Cells(i, 1) Then
                ListBox2.AddItem .Cells(i, 3)
                '↓1行しかないので1行目の2列目に代入
                ListBox2.List(0, 1) = .Cells(i, 4)
                Exit For
            End If
        Next
    End With
End Sub

別案

Private Sub UserForm_Initialize()
    With ListBox1
        .ColumnCount = 4
        .ColumnWidths = "20;100;0;0"
    End With

    With ListBox2
        .ColumnCount = 2
        .ColumnWidths = "50;50"
    End With

    With Worksheets("リスト1").Range("A1").CurrentRegion
        ListBox1.List = .Offset(1).Resize(.Rows.Count - 1, 4).Value
        ListBox1.ListIndex = 0
    End With
End Sub

Private Sub ListBox1_Click()
    With ListBox1
        ListBox2.Clear
        ListBox2.AddItem .List(.ListIndex, 2)
        ListBox2.List(0, 1) = .List(.ListIndex, 3)
    End With
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/11 00:42

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

    キャンセル

  • 2020/03/12 19: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は複数の行を抽出し連動させたいということでした!
    とても助かりました。ありがとうございます!

    キャンセル

+1

一例です。

Option Explicit

Private Sub ListBox1_Change()
    Dim v As Variant

    With Me.ListBox1
        v = WorksheetFunction.Index(.List, .ListIndex + 1, 0)
    End With

    With Me.ListBox2
        .Clear
        .AddItem v(1)
        .AddItem v(2)
        .AddItem v(4)
        .AddItem v(5)
    End With
End Sub

Private Sub UserForm_Initialize()
    With Worksheets(1).Range("A1").CurrentRegion
        Me.ListBox1.List = Intersect(.Resize(, 7), .Offset(1, 1)).Value
    End With
End Sub


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


Option Explicit

Private Sub UserForm_Initialize()
    With Worksheets(1).Range("A1").CurrentRegion
        Me.ListBox1.List = Intersect(.Resize(, 7), .Offset(1, 1)).Value
    End With
    Me.ListBox1.MultiSelect = fmMultiSelectExtended
    With Me.ListBox2
        .ColumnCount = 4
        .ColumnWidths = "20;20;20;20"
    End With
End Sub

Private Sub ListBox1_Change()
    Dim ix As Long
    Dim v As Variant
    Dim i As Long, j As Long

    Me.ListBox2.Clear

    With Me.ListBox1
        For ix = 0 To .ListCount - 1
            If .Selected(ix) Then
                Me.ListBox2.AddItem ""
                i = 0
                j = 0
                For Each v In WorksheetFunction.Index(.List, ix + 1, 0)
                    j = j + 1
                    If j <> 3 Then
                        Me.ListBox2.List(Me.ListBox2.ListCount - 1, i) = v
                        i = i + 1
                    End If
                Next
            End If
        Next
    End With
End Sub

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/12 18:04

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

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る