양식 컨트롤 콤보박스와 ActiveX컨트롤 콤보박스 중 Active 컨트롤 콤보박스에 리스트(목록)을 입력하는 방법에는 몇가지가 있습니다.
☞ 콤보박스에 리스트 입력방법
- ListFillRange 에 범위 입력
- 셀주소로 리스트 범위 입력 : 리스트와 콤보박스가 같은 시트에 있는 경우 가능
- 정의된 이름으로 리스트 범위 입력 : 리스트와 콤보박스가 같거나 다른 시트에 있는 경우 가능
- VBA 활용
- ComboBox.AddItem
- ComboBox.ListFillRange
- ComboBox.List
위 방법중에서 VBA를 활용하여 ComboBox(콤보박스)에 목록을 입력하는 방법을 설명드립니다.
<워크시트에서 콤보상자는 [개발도구] - [삽입] - [콤보상자]를 선택하여 삽입합니다.>
VBA를 활용하여 콤보상자에 리스트(목록) 입력하기
앞에서도 설명했지만 VBA를 활용하여 콤보박스에 리스트(목록)를 입력하는 방법은 아래와 같습니다.
- ComboBox.AddItem 매소드
- ComboBox.ListFillRange 속성
- ComboBox.List 속성
이 중에서는 워크시트에 목록없이 리스트를 만들 수 있지만 사용의 편의를 위해 아래와 같이 리스트목록을 따로 만들어 사용하는 경우가 대부분입니다.
AddItem 메소드
Sub ComboBox리스트1()
With Sheet1.ComboBox1
If .ListCount >= 0 Then .Clear '---①
.AddItem "수입"
.AddItem "식비"
.AddItem "주거비"
End With
End Sub
- ① 은 콤보박스에 리스트(목록)이 있는 경우 목록을 지워 줍니다. 특시 워크시트에서 콤보박스를 사용하는 경우는 매크로가 콤보박스의 드롭버튼을 클릭했을 때 실행되도록 하는 경우가 많아 이때는 반드시 콤보박스의 목록을 지워 주어야 합니다.
- AddItem 매소드로 콤보박스에 리스트(목록)을 하나씩 입력 합니다.
- AddItem을 쓰는 경우는 리스트가 거의 변함이 없고 갯수가 적은 경우 사용하면 좋습니다.
- 워크시트에 리스트(목록)이 없어도 직접 입력이 가능합니다.
Sub ComboBox리스트2()
For Each c In Sheet2.Range("A2:A7")
Sheet1.ComboBox1.AddItem c.Value
Next c
End Sub
- 위 예는 워크시트에 참조할 리스트(목록)이 있는 경우 각 셀의 값을 리스트로 불러오는 방법입니다.
- For Each 구문으로 Sheet2의 A2:A7 셀 범위의 값을 하나씩 리스트에 추가합니다.
- 리스트 갯수가 많거나 참조하는 셀주소를 변수로 입력하여 동적인 리스트를 만들 수 있습니다.
ListFillRange 속성
Sub ComboBox리스트3()
Sheet1.ComboBox1.ListFillRange = "주거비"
Sheet1.ComboBox1.RowSource = "주거비" '---① 콤보상자(ActiveX)에서 사용시 오류
End Sub
- 콤보박스(ActiveX)의 속성인 ListFillRange에 참조 범위를 입력하여 리스트를 추가합니다.
- 여기서 "주거비"는 이름정의를 사용하여 미리 정의 된 이름입니다.
- 콤보박스와 리스트가 같은 워크시트에 있는 경우는 셀주소를 그냥 입력해도 됩니다.(예 D2:D8)
- 참고로 Userform의 콤보박스는 ListFillRange 가 아닌 Rowsource 속성을 사용합니다.
List 속성
Sub ComboBox리스트4()
Sheet1.ComboBox1.List = Sheet2.Range("B2:B9") '---① 런타임 오류
Sheet1.ComboBox1.List = Application.WorksheetFunction.Transpose(Sheet2.Range("B2:B9"))
End Sub
- List 속성은 AddItem처럼 목록을 하나씩 추가하는 방식이 아니라 배열값을 한번에 리스트(목록)에 입력합니다.
- 그리고 ① 과 같이 범위를 입력하는 경우에는 아래와 같이 런타임 오류가 발생합니다. 배열값이 아니기 때문입니다.
- 위와 같은 오류를 없애기 위해 워크시트 함수 Transpose를 사용합니다. Transepose 함수는 행과 열을 바꾸는 함수이지만 함수 자체가 배열함수로 결과는 배열로 반환합니다.
Sub ComboBox리스트5()
Dim 계정 As Variant
계정 = Array("미용비", "의복비", "잡화비", "의료비", "보건비") '---①
Sheet1.ComboBox1.List = 계정
Sheet1.ComboBox1.List = Array("미용비", "의복비", "잡화비", "의료비", "보건비") '---②
End Sub
- List 속성은 배열값으로 입력되어야 합니다. 그래서 Array 함수를 이용해서 각 품목을 배열로 반환한 값을 대입하면 됩니다.
- 다시 설명드리지만 AddItem은 하나씩 추가하고 List는 배열값을 한꺼번에 입력합니다.
- ② 와 같이 한줄로 입력해도 무관합니다. 다만 Array 함수의 배열변수는 Variant 형으로 선언해야 된다는 것을 보여 주기 위해 ① 과 같이 코딩 해보았습니다.
Sub ComboBox리스트6()
Dim 계정(3) As String '---배열변수는 (괄호)로 선언하고 (괄호)안 숫자는 배열크기를 나타냄.
Dim k As Byte
For Each c In Sheet2.Range("F2:F5")
계정(k) = c.Value
k = k + 1
Next c
Sheet1.ComboBox1.List = 계정
End Sub
- 위 예제는 정적배열변수를 사용한 예입니다.
- 배열변수를 사용해서 참조범위의 각각의 값을 For Each 구문으로 배열변수에 대입하고 배열변수를 List 속성에 적용하는 방법입니다.
Sub ComboBox리스트7()
Dim 계정() As String '동적배열선언
Dim i As Integer
i = Sheet2.Range("G1").End(xlDown).Row
ReDim 계정(1 To i - 1) '---배열크기변경
k = 1
For Each c In Sheet2.Range("G2:G" & i)
계정(k) = c.Value
k = k + 1
Next c
Sheet1.ComboBox1.List = 계정
End Sub
- 위 예제는 동적배열변수를 사용하여 리스트의 갯수가 추가되거나 줄어들어도 코드를 변경하지 않고 사용할 수 있는 예입니다. 배열에 대한 자세한 설명은 관련글 또는 TAG에서 배열을 참조 바랍니다.
댓글 쓰기