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 |
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의 첫 번째 항목을 더블클릭한 그림입니다.