Event

셀 클릭하면 자동 완성창이 뜬다고? 이게 진짜 됩니다.

노만e 2025. 8. 7. 22:03

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

 

엑셀에서도 자동완성 기능이 있었으면 하고, 생각해 보신적은 없으신가요?

오늘은 "셀 클릭 → 자동완성창 표시 → 키보드 입력에 따라 자동 추천"이 가능한 고급 자동입력 기능을 만들어보려 합니다.
심지어 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

 

 

문자열 자동완성_콤보박스_최종.xlsm
0.03MB