일단 엑셀에서는 ‘데이터 유효성 검사’를 사용하여 콤보박스를 사용할 수 있다.
하지만 위 기능은 한 개만 선택이 가능하고 여러개를 선택해서 셀값에 넣고 싶을 때는..
예를 들어 아래처럼 여러개를 선택하고 싶을때
엑셀 기능만으로는 한계가 있는거 같았다… 몇일동안 엑셀 기본기능으로 구현하고 싶어서 찾았는데 결국 못 찾음.
일단 공식 사이트는 아래와 같이 사용하라고 하긴 하는데 나한텐 더 복잡해 보였음.
외국 형님이 비슷하게 구현한게 있긴한데 이것도 일단 vba 사용해서 만들었다.
그리고 아래글은 여러개를 선택을 한번에 못 하고 한번에 한개씩 해야 하는것 같다.
새로운 값은 “,” 로 구분지어서 이어붙이는 식…
How to create multi-select drop down list in Excel
그래서 여러가지 고민하다가 내가 생각한 방법은
Userform 생성 ⏩ VBA 코드생성 하는 방법으로 사용할 예정이다.
우선 해당 셀을 더블클릭 했을 때 화면처럼 여러개를 선택할 수 있게 만들어서 여러개가 선택 되었을 경우에는 ,(콤마)로 이어붙여서 값을 채워줄 것이다.
우선 해당 시트에서 더블클릭 했을 때의 이벤트를 만들어 줘야한다.
vba 프로젝트를 열어서 해당 시트를 더블클릭하거나 오른쪽 눌러서 코드보기 눌러준다.
코드 인수 에서 Target 으로 보이는 Range 변수가 사용자가 더블클릭 한 셀을 받아온다.
if 문을 안 걸어주면 모든셀을 더블클릭 했을 때 이벤트가 발생하므로 더블클릭했을 때 이벤트가 발생하는 셀의 범위를 G열로 한정한다. (G열은 7번째…ㅎㅎ)
아래처럼 코드를 사용했을 때 UserFrom_다중선택 이라는 userform을 불러오게 설정한다.
아직 “UserForm_다중선택”을 만들지 않았으니 테스트 하려고하면 다른 코드를 넣어서 테스트 해봐도 된다.
MsgBox "Hello” 같은거..
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 7 Then
UserForm_다중선택.Show
End If
End Sub
이제 불러올 UserForm_다중선택을 만들어보자. 오른쪽 아래처럼 클릭해서 만들면 된다.
만들고 왼쪽밑에 속성을 알아보기 쉽게 바꿔주자.
이름을 알아보기 쉽게 꼭 바꿔주자. 변수같은것이니..
Caption 부분을 바꾸면 사용자 화면에 표시되는 이름이 변경된다.
다음에는 목록상자를 만들어서 끓어다 만들고, 명령단추를 끓어다 만든다.
목록상자의 속성은 아래처럼 바꾸고
명령단추는 아래처럼 설정한다.
두개다 위와 비슷하게 이름과 caption 정도만 설정했다.
이제 만든 UserForm에서 코드 보기 눌러서 들어가 본다.
왼쪽에서 UserFrom 선택하고 오른쪽에서는 Initialize 선택해준다.
그럼 자동으로 프로시저하나 생성되는데 그곳에 다음과 같이 적어준다.
Userform이 실행될때 초기화 되는 코드이다.
Private Sub UserForm_Initialize()
List_과일.ColumnCount = 2
List_과일.ColumnHeads = False
List_과일.ColumnWidths = StrCWidths
List_과일.List = Worksheets("과일").Range("a2", Worksheets("과일").Range("a2").End(xlDown)).Value
List_과일.MultiSelect = fmMultiSelectMulti
List_과일.ListStyle = fmListStyleOption
End Sub
만들어둔 버튼도 비슷한 방법으로 만들어주면 된다. 오른쪽은 Click 이다.
거의 다 왔다. 마지막으로 버튼을 클릭했을 때 값을 넣어주는 코드만 짜면 된다. 간단하게 만들어봤다.
우선 리스트목록에서 선택을 하게 되면 .Selected 속성에 True 값이 담기게 된다.
그리고 리스트 개수가 n개이면 리스트(i) 의 인덱스는 0 부터 시작하기 때문에 개수 -1 까지가 인덱스로 담겨져 있다.
리스트 안의 값은 리스트.Column(column 위치, row 위치) 로 값을 불러올 수 있다.
column 위치까지 있다는 말은 지금은 리스트에 column이 1개 이지만 여러개도 담을 수 있다.
리스트 초기화 할 때 리스트 범위를 참조할 때 2개 이상의 컬럼을 설정할 수도 있다.
Private Sub btn_선택완료_Click()
Dim str셀값 As String, str입력값 As String
str셀값 = Selection.Value
Selection.ClearContents
For i = 0 To List_과일.ListCount - 1
If List_과일.Selected(i) = True Then
If str입력값 = "" Then
str입력값 = List_과일.Column(0, i)
Else
str입력값 = str입력값 & ", " & List_과일.Column(0, i)
End If
End If
Next
Selection = str입력값
Unload UserForm_다중선택
End Sub
아무튼 이렇게 만들고 확인해보면..
아래처럼 더블 해당셀을 더블클릭하고 선택완료 버튼을 누르면
잘 표현이 된다.
아무튼 다중콤보박스로 데이터 유효성 검사의 제한적인 기능을 대체했다. 다소 복잡하긴 했지만…
'[VBA]' 카테고리의 다른 글
[VBA] Array.Contain(특정 값이 배열안에 있는지 확인) (0) | 2024.04.03 |
---|---|
[VBA] Dynamic Array(동적으로 배열 추가하기) (0) | 2024.04.03 |
[VBA] 엑셀범위 그림파일로 저장(Range to jpg) (0) | 2023.08.03 |
[VBA] VBA 정규식 사용하기 (0) | 2022.08.24 |
[VBA] vba string.format, printf 기능 (0) | 2022.06.04 |