엑셀 자동완성, 네이버 검색창처럼 만드는 방법

엑셀에서도 자동완성 기능이 있었으면 하고, 생각해 보신적은 없으신가요?
오늘은 "셀 클릭 → 자동완성창 표시 → 키보드 입력에 따라 자동 추천"이 가능한 고급 자동입력 기능을 만들어보려 합니다.
심지어 ESC 키로 취소하거나, Enter 키로 다음 셀로 자동 이동하는 UX까지 구현됩니다.
👇 핵심 기능 정리:
✔ 특정 셀(C열 2행 이후)을 클릭하면 콤보박스 자동 표시
✔ List 시트에서 데이터를 불러와 자동완성 리스트 생성
✔ 입력 중 일부만 타이핑해도 자동으로 후보 리스트 필터링
✔ Enter로 값 확정 및 다음 셀 이동
✔ ESC로 입력 취소 및 이전 셀 이동
✔ ← → 방향키도 대응하여 콤보박스 자동 종료
복잡해 보이지만, 본문 코드 그대로 붙여넣고 몇 줄만 수정하면 여러분 엑셀에서도 완벽하게 작동합니다.
드롭다운보다 빠르고, 검색창처럼 유연한 자동완성.
엑셀 실무자라면 반드시 알아야 할 고급 기능입니다.
👇 아래 코드로 직접 구현해보세요!
| Option Explicit Dim lis() As Variant Dim memo As Variant Dim ws As Worksheet Dim isEscPressed As Boolean ' ESC 키 눌림 상태 추적 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 다중 셀 선택시 콤보박스 숨기고 종료 If Target.CountLarge > 1 Then Me.ComboBox1.Visible = False Exit Sub End If ' D3 이후 행에서만 동작하도록 수정 If Target.Column <> 3 Or Target.Row <= 1 Then Me.ComboBox1.Visible = False Exit Sub End If Dim zInput As Range Set ws = Sheets("List") Set zInput = Target If Target.Count = 1 Then isEscPressed = False ' 새로운 셀 선택시 ESC 상태 초기화 If memo <> "" Then If IsError(Application.Match(Range(memo), lis, 0)) Then Range(memo) = "" End If ' List 시트의 A2열부터 데이터 가져오기 lis = Application.Transpose(ws.Range("A2:A" & ws.[A65000].End(xlUp).Row)) Me.ComboBox1.List = lis Me.ComboBox1.Height = Target.Height + 3 Me.ComboBox1.Width = Target.Width Me.ComboBox1.Top = Target.Top Me.ComboBox1.Left = Target.Left Me.ComboBox1 = Target Me.ComboBox1.Visible = True Me.ComboBox1.Activate memo = Target.Address Else Me.ComboBox1.Visible = False End If End Sub Private Sub ComboBox1_Change() ' 다중 셀 선택시 종료 If Selection.CountLarge > 1 Then Exit Sub Dim dic Dim tmp As String Dim c As Variant ' ESC 키가 눌렸으면 값 입력하지 않음 If isEscPressed Then Exit Sub If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, lis, 0)) Then Set dic = CreateObject("Scripting.Dictionary") tmp = UCase(Me.ComboBox1) & "*" For Each c In lis If UCase(c) Like tmp Then dic(c) = "" Next c Me.ComboBox1.List = dic.keys Me.ComboBox1.DropDown End If ActiveCell.Value = Me.ComboBox1 End Sub Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) ' 다중 셀 선택시 종료 If Selection.CountLarge > 1 Then Exit Sub ' List 시트의 A2열부터 데이터 가져오기 ComboBox1.List = Application.Transpose(ws.Range("A2:A" & ws.[A65000].End(xlUp).Row)) Me.ComboBox1.DropDown End Sub Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ' 다중 셀 선택시 종료 If Selection.CountLarge > 1 Then Exit Sub If KeyCode = 13 Then ' Enter 키 isEscPressed = False ' ESC 상태 초기화 If IsError(Application.Match(ActiveCell, lis, 0)) Then ActiveCell = "" Me.ComboBox1.Visible = False ActiveCell.Offset(1).Select ' 아래 셀로 이동 ' 아래 셀이 D열이고 3행 이후라면 콤보박스 다시 표시 If ActiveCell.Column = 4 And ActiveCell.Row >= 3 Then Call Worksheet_SelectionChange(ActiveCell) End If ElseIf KeyCode = 27 Then ' ESC 키 isEscPressed = True Me.ComboBox1.Visible = False ActiveCell.Value = "" ActiveCell.Offset(, -1).Select isEscPressed = False ElseIf KeyCode = 37 Or KeyCode = 39 Then ' ← 또는 → 키 Me.ComboBox1.Visible = False If KeyCode = 37 Then ' ← ActiveCell.Offset(, -1).Select ElseIf KeyCode = 39 Then ' → ActiveCell.Offset(, 1).Select End If ElseIf KeyCode = 27 Then ' ESC 키 isEscPressed = True ' ESC 키 눌림 상태 설정 Me.ComboBox1.Visible = False ' C열의 같은 행으로 이동 ActiveCell.Value = ActiveCell.Value ActiveCell.Offset(, -1).Select ActiveCell.Value = "" isEscPressed = False ' ESC 상태 초기화 End If End Sub Private Sub ComboBox1_LostFocus() On Error Resume Next ' 다중 셀 선택시 종료 If Selection.CountLarge > 1 Then Me.ComboBox1.Visible = False Exit Sub End If ' ? 현재 셀이 memo(콤보박스를 띄웠던 셀)와 다르면 값 입력하지 않음 If Not Intersect(ActiveCell, Range(memo)) Is Nothing Then ActiveCell.Value = Me.ComboBox1 End If Me.ComboBox1.Visible = False ' 현재 셀이 C열 2행 이후라면 콤보박스 다시 표시 If ActiveCell.Column = 3 And ActiveCell.Row >= 2 Then Application.EnableEvents = False Application.EnableEvents = True Call Worksheet_SelectionChange(ActiveCell) End If End Sub |