Please Enable JavaScript!
Gon[ Enable JavaScript ]

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

엑셀(Excel)/VBA
반응형

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

 

환경 : Microsoft Excel 2010

 

목록상자 컨트롤은 다중선택이 가능하며 여러 자료를 동시에 조회 가능합니다. 콤보박스는 하나의 자료만 볼수 있지만 목록은 펼쳐서 보여주므로 여러 자료를 동시에 볼수 있습니다. 사용법이나 속성등은 대부분 비슷해서 금방 파악이 될것입니다.

 

아래 예제는 혼수를 장만하기 위해 물건을 선택한다고 생각해 봅죠. 왼쪽에 대분류가

있고 대분류를 선택하면 오른쪽 그 상세 내용이 나오게 됩니다. 아래 내용을 목록상자로 꾸며 볼 것입니다.

 

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

 

폼에서 두개의 목록상자컨트롤을 추가합니다. 하나는 목록의 제목에 해당하므로 열이 하나이고 오른쪽에 있는 목록은 제품명과 가격이 들어가게 됩니다.

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

 

폼이 초기화 할 때 값을 넣어야 하므로 UerForm_Initialize() 함수를 생성합니다.

아래 소스처럼 왼쪽에 있는 목록상자에 Additem 이용해 값을 추가 합니다.

 

Private Sub UserForm_Initialize()

    With Me.lstTitle

        .AddItem "전자제품"

        .AddItem "가구"

        .AddItem "주방기구"

        .AddItem "생활용품"

    End With

End Sub

 

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

 

왼쪽 목록상자에 값을 더블클릭 해서 선택하게 되면 오른쪽에 해당하는 제품을 나열할 것입니다. 그럴려면 목록상자를 더블클릭할 때 발생하는 이벤트 함수를 만들어야 합니다. 상단 콤보박스에서 왼쪽은 목록상자컨트롤을, 오른쪽은 DblClick 선택하시면 함수가 생성됩니다.

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

 

아래 소스는 목록상자를 더블클릭했을 때 오른쪽상세 목록상자에 해당하는 제품을 보여주는 내용입니다. 상세목록상자의 이름이 lstDetail 인데 제품명과 가격을 표시하기 위해 컬럼을 ColumnCount =2 로 셋팅했네요. 상세 목록상자에 옵션을 끝냈으면 값을 집어넣어야 하겠죠. 목록상자에서 몇번째를 선택했느냐에 따라 Select Case 써서 영역을 가져온뒤 각 case 별로 상세 목록상자에 셋팅을 하였습니다.

 

Private Sub lstTitle_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    With Me.lstDetail

        .ColumnCount = 2

        .ColumnWidths = "120;50"

        .ColumnHeads = True

        Select Case Me.lstTitle.ListIndex

        Case 0

            .RowSource = "상품정보!A2:B14"

        Case 1

            .RowSource = "상품정보!C2:D7"

        Case 2

            .RowSource = "상품정보!E2:F11"

        Case 3

            .RowSource = "상품정보!G2:H11"

        End Select

        .ListIndex = 0

    End With

End Sub

 

엑셀(Excel) VBA - 목록상자 컨트롤 이용하여 목록 조회, 선택하기

 

이렇게 왼쪽 목록을 클릭하게 되면 오른쪽에 상세 내용이 표시되는 목록상자 컨트롤에 대해서 알아보았습니다. 동작하는 모습이 담긴 간단한 영상도 첨부하였습니다. 참고하시기 바랍니다.

 

반응형
Posted by 녹두장군

댓글을 달아 주세요

  1. goodays 2017.09.12 17:01  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    vba 목록상자 2개를 사용하여
    listbox1은 대분로
    listbox2는 listbox1에서 선택된 대부류 항목이 나타나게 하도록 만들었습니다.
    데이타가 많아서 for next 문을 사용하여 listbox1은 해결을 했는데
    listbox2 즉 listbox1_click 에서는 for next 문을 사용할 경우

    컴파일 오류로 "Select Case와 맨 처음 Case 사이의 문들과 레이블이 잘못되었습니다" 라는
    메시지가 나옵니다.

    데이터를 지속적으로 추가하면서 사용하려고 하는데
    좋은 방법을 가르쳐 주십시오
    감사드립니다.

    혹시 답변을 찾기 어려울수도 있어서
    제 이메일을 보내드립니다.

    goodays2000@hanmail.net

    '****************************************************************
    Private Sub UserForm_Initialize() ' 콤보박스 및 목록박스 시작

    Workbooks("목록상자.xlsm").Activate



    '************************************************************ 목록상자-자재분류

    With Me.ListBox1 '품목의 분류

    For i = 3 To 2400 Step 16

    Sheets("품목").Select
    Range("A" & i).Select
    If Sheets("품목").Range("A" & i) = "" Then Exit For
    Me.ListBox1.AddItem Sheets("품목").Range("A" & i).Value
    Next i
    '.AddItem "CAP"
    '.AddItem "CASE"
    '.AddItem "COVER"
    '.AddItem "HOUSING"
    '.AddItem "PIPE"
    '.AddItem "BEARING"
    '.AddItem "도장"
    '.AddItem "포장"
    End With


    End Sub
    '************************************************************


    '*************************************************************
    Private Sub ListBox1_Click()

    '************************************************************ 목록상자 2

    Sheets("품목").Activate

    With Me.ListBox2
    .ColumnCount = 5
    .ColumnWidths = "110;200;110;60;70"
    .ColumnHeads = False
    Select Case Me.ListBox1.ListIndex

    For i = 0 To 2400 Step 16 '&&&&&&&&&&&& 여기서부터 않됩니다

    Range("A" & i, "F" & i + 17).Select
    If Sheets("품목").Range("A" & i, "F" & i + 17) = "" Then Exit For

    Case i
    .RowSource = "품목!B" & i + 3 & ":F" & i + 17
    Next i

    'Case 0
    ' .RowSource = "품목!B3:F12"
    'Case 1
    ' .RowSource = "품목!B13:F24"
    'Case 2
    ' .RowSource = "품목!B25:F36"
    'Case 3
    ' .RowSource = "품목!B37:F54"
    'Case 4
    ' .RowSource = "품목!B55:F66"
    'Case 5
    ' .RowSource = "품목!B67:F76"
    'Case 6
    ' .RowSource = "품목!B77:F88"
    'Case 7
    ' .RowSource = "품목!B89:F100"
    End Select

    .ListIndex = 0

    End With

    End Sub
    '*******************************************************