Private priArray
Private priIsFocus As Boolean
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count = 1 And Target.Row > 6 And Target.Column = 2 Then
        Dim e As Long
        Dim sh As Worksheet
        Set sh = Sheets("List-code")
        If Not IsArray(priArray) Then
            e = sh.Range("B" & Rows.Count).End(xlUp).Row
            priArray = sh.Range("B6:C" & e).Value2
        End If
        Call HienComboBox
    Else
        Call AnComboBox
    End If
End Sub
 
Private Sub ComboBox1_Change()
    If priIsFocus Then Exit Sub
    If ComboBox1.MatchFound Then
        ActiveCell.Value = ComboBox1.Text
        ActiveCell.Offset(, 1).Value = ComboBox1.Column(1)
    Else
        ActiveCell.Value = ""
        ActiveCell.Offset(, 1).Value = ""
    End If
End Sub
 
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    On Error Resume Next
    Select Case KeyCode
    Case 16, 17, 37 To 40
    Case 9
        ActiveCell.Offset(, 1).Activate
    Case 13
        ActiveCell.Offset(1).Activate
    Case Else
        If IsArray(priArray) Then
            Dim strValue As String
            strValue = LCase(ComboBox1.Text)
            ComboBox1.ListRows = 20
            If Trim(strValue) > "" Then
                Dim ArrFilter, GetRow()
                Dim c As Long, i As Long, n As Long, r As Long
                For r = 1 To UBound(priArray, 1)
                    If LCase(priArray(r, 1)) Like "*" & strValue & "*" Then
                        n = n + 1
                        ReDim Preserve GetRow(1 To n)
                        GetRow(n) = r
                    End If
                Next
                If n Then
                    Dim u As Byte
                    u = UBound(priArray, 2)
                    ReDim ArrFilter(1 To n, 1 To u)
                    For r = 1 To n
                        For c = 1 To u
                            ArrFilter(r, c) = priArray(GetRow(r), c)
                        Next
                    Next
                    ComboBox1.List = ArrFilter
                Else
                    ComboBox1.Clear
                    ComboBox1.ListRows = 0
                End If
                ComboBox1.DropDown
            Else
                If ComboBox1.ListCount <> UBound(priArray) Then
                    ComboBox1.List = priArray
                    ComboBox1.DropDown
                End If
            End If
        End If
    End Select
End Sub
 
Private Sub HienComboBox()
    priIsFocus = True
    With ComboBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .ListWidth = ActiveCell.Resize(, 3).Width + 12
        .ColumnWidths = .Width - 4 & "." & ActiveCell.Offset(, 1).Width
        .Height = ActiveCell.Height
        .List = priArray
        .Text = ActiveCell.Value
        .Activate
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
    priIsFocus = False
End Sub
 
Private Sub AnComboBox()
    With ComboBox1
        If .Visible Then
            .Visible = False
        End If
    End With
End Sub