배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   ListBox, Userform
제목:   ListBox 용도변경
     
 

새 페이지 1

  STEP> 따라하기
 

※ 오늘 Daily Tip은 곽승주님이 제공해주신 내용입니다.

Userform에서 테이블의 형태 또는 목록의 형태로 데이터를 보여주는 컨트롤을 꼽으라면 ListBox컨트롤입니다. 그러나 유사한 기능을 가진 다른 컨트롤에 비해 ListBox컨트롤은 그리 성능이 좋은 편은 아닙니다.  

그럼에도 필자는 이걸 많이 사용하는 편입니다. 다른 컨트롤을 도구상자에 추가하여 사용하는 경우 내 PC에서는 문제가 없지만 배포하는 경우 다른 사용자의 PC에 해당 컨트롤이 없을 수 있기 때문이죠

보통의 ListBox컨트롤에 하나의 열을 두고 이를 선택하는 용도로 사용하고 있습니다. 또는 다음 그림과 같이 여러 개의 열을 입력할 수 있습니다.

ListBox의 단점

[단점1]
ListBox
의 단점은 열 머리글을 프로그래밍방식으로는 지정할 수 없다는 점입니다. AddItem메소드를 사용하여 항목을 추가하는 경우 머리글을 지정할 수 없습니다.

머리 글을 가진 목록형태의 셀 영역을 RowSource 속성으로 지정해주는 경우 위의 그림처럼 열 머리글이 자동으로 입력됩니다. 물론 ColumnHeads속성을 미리 True로 해주어야 합니다

[단점2]
또 하나의 단점은 위의 그림처럼 여러 개의 열을 가지는 경우 마치 워크시트를 다루듯이 마우스로 드래그하여 각 열의 너비를 조정하는 방법이 없습니다. 미리 ColumnWidths속성에 각 열의 너비를 지정하는 방법밖에는 없습니다. 물론 API를 사용하여 이러한 단점을 해결할 수 있습니다

ListBox의 별난 용도

ListBox는 목록형태의 데이터를 보여주는 용도입니다. 그리고 어느 항목을 클릭하면 선택한 항목에 대한 값을 돌려줍니다. 그러나 또 다른 용도로 필자는 매크로를 실행하는 용도로 사용하고 있습니다.  

ListBox의 항목으로 Sub프로시져의 이름을 채워줍니다. 그리고 어느 항목을 더블클릭하면 선택한 항목의 이름을 가진 매크로를 실행하는 아주 단순한 아이디어입니다. 다음은 ListBox 컨트롤을 가진 Userform의 코드입니다.

Private Sub UserForm_Initialize()
    With ListBox1
        .AddItem "DummyMacro1"
        .AddItem "DummyMacro2"
        .AddItem "DummyMacro3"
    End With
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Application.Run ListBox1.Text
End Sub

위에서 UserForm_Initialize 이벤트 프로시져에서는 ListBox1의 항목을 추가합니다. 추가하는 항목은 Sub프로시져의 이름입니다. Sub프로시져는 다음과 같습니다.

Public Sub DummyMacro1()
   MsgBox "I’m DummyMacro#1 "
End Sub

Public Sub DummyMacro2()
   MsgBox "I’m DummyMacro#2 "
End Sub

Public Sub DummyMacro3()
   MsgBox "I’m DummyMacro#3 "

End Sub

그리고 ListBox의 항목을 더블클릭하는 경우 실행하는 ListBox1_DblClick()이벤트 프로시져에서는 Application.Run ListBox1.Text 으로 해당 프로시져를 실행합니다. 여기서 Application개체의 Run메소드는 매크로나 함수를 불러옵니다.

다음은 위의 Userform을 실행하고 ListBox의 첫 번째 항목을 더블클릭한 그림입니다.