Sửa code VBA tìm kiếm theo từ phải sang trái

Liên hệ QC

quangpro779

Thành viên mới
Tham gia
3/7/21
Bài viết
6
Được thích
1
Em chào mọi người !
Em có dùng code tìm kiếm trong form này của bác @HieuCD lâu rồi em cũng không nhớ link cũ nằm ở đâu nữa. Code tìm kiếm rất hay và nhanh. Hiện tại code tìm kiếm theo phương thức bất kỳ đâu trên chuỗi. Giờ em muốn sửa lại theo từ trái qua phải thì phải làm sao. Tại vì Tên học sinh có rất nhiều trường hợp Họ giống Tên, nên em tìm kiếm nó ra trùng rất nhiều. em xin cảm ơn các bác ạ
1625306005308.png

Mã:
Dim dic As Object, Test As Boolean, sArr As Variant
Private Sub TextBox1_Change()
  locnhapkhonewa
End Sub


  Next
  ListBox1.Clear
  ListBox1.ColumnCount = lcol
  ListBox1.List = dArr
End Sub

Private Sub Add_Data()
  Dim dArr As Variant, tmp As String, i As Long, k As Long, lcol As Byte
  i = Sheets("Sheet1").Range("B65500").End(xlUp).Row
  dArr = Sheets("Sheet1").Range("B4:H" & i).Value
  lcol = UBound(dArr, 2)
  ReDim sArr(1 To UBound(dArr), 1 To lcol + 1)
  For i = 1 To UBound(dArr)
    tmp = dArr(i, 1) & " " & dArr(i, 2)
    If dArr(i, 1) <> "" Or dArr(i, 1) <> " " Then
      k = k + 1
      tmp = Up_TV_KhongDau(UCase(tmp))
      sArr(k, lcol + 1) = tmp
      For j = 1 To lcol
        sArr(k, j) = dArr(i, j)
      Next j
    End If
  Next i
End Sub
Private Sub Add_Dic()
  Dim CharCode, ResText As String, i As Byte
  Set dic = CreateObject("scripting.dictionary")
  CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
                   ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
                   ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
                   ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
                   ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
                   ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
                   ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
                   ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
                   ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
      'dic.Add CharCode(i), Mid(ResText, i + 1, 1)
      dic.Add UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1))
  Next
  Test = True
End Sub
Private Function Up_TV_KhongDau(ByVal Text As String) As String ' bo dau tieng viet
  Dim i As Long, key As String
  If Len(Text) = 0 Then Up_TV_KhongDau = "": Exit Function
  For i = 1 To Len(Text)
    key = Mid(Text, i, 1)
    If dic.Exists(key) Then Mid(Text, i, 1) = dic.Item(key)
  Next
  Up_TV_KhongDau = Text
End Function

Private Sub UserForm_Initialize()
  If Test = False Then Call Add_Dic
  If Not IsArray(sArr) Then Call Add_Data
End Sub
 
Lần chỉnh sửa cuối:
Thử thay câu này:

If sArr(i, lcol) Like "*" & dk & "*" Then

bằng câu:

If sArr(i, lcol) Like dk & "*" Then

.
dạ cảm ơn anh . Code xử lý được rồi. Nhưng do em tìm kiếm theo 2 cột B và C. thì giờ em gõ 1992 nó không hiện ra gì luôn. Tức là code nó chỉ còn tìm kiếm theo 1 cột B. mà em muốn nó tìm kiếm theo 2 cột B và C. Nhờ anh sửa lại giúp em

1625306965383.png
1625307103113.png
 
Upvote 0
Upvote 0
Em chào mọi người !
Em có dùng code tìm kiếm trong form này của bác @HieuCD lâu rồi em cũng không nhớ link cũ nằm ở đâu nữa. Code tìm kiếm rất hay và nhanh. Hiện tại code tìm kiếm theo phương thức bất kỳ đâu trên chuỗi. Giờ em muốn sửa lại theo từ trái qua phải thì phải làm sao. Tại vì Tên học sinh có rất nhiều trường hợp Họ giống Tên, nên em tìm kiếm nó ra trùng rất nhiều. em xin cảm ơn các bác ạ
View attachment 261775

Mã:
Dim dic As Object, Test As Boolean, sArr As Variant
Private Sub TextBox1_Change()
  locnhapkhonewa
End Sub


  Next
  ListBox1.Clear
  ListBox1.ColumnCount = lcol
  ListBox1.List = dArr
End Sub

Private Sub Add_Data()
  Dim dArr As Variant, tmp As String, i As Long, k As Long, lcol As Byte
  i = Sheets("Sheet1").Range("B65500").End(xlUp).Row
  dArr = Sheets("Sheet1").Range("B4:H" & i).Value
  lcol = UBound(dArr, 2)
  ReDim sArr(1 To UBound(dArr), 1 To lcol + 1)
  For i = 1 To UBound(dArr)
    tmp = dArr(i, 1) & " " & dArr(i, 2)
    If dArr(i, 1) <> "" Or dArr(i, 1) <> " " Then
      k = k + 1
      tmp = Up_TV_KhongDau(UCase(tmp))
      sArr(k, lcol + 1) = tmp
      For j = 1 To lcol
        sArr(k, j) = dArr(i, j)
      Next j
    End If
  Next i
End Sub
Private Sub Add_Dic()
  Dim CharCode, ResText As String, i As Byte
  Set dic = CreateObject("scripting.dictionary")
  CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
                   ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
                   ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
                   ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
                   ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
                   ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
                   ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
                   ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
                   ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
      'dic.Add CharCode(i), Mid(ResText, i + 1, 1)
      dic.Add UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1))
  Next
  Test = True
End Sub
Private Function Up_TV_KhongDau(ByVal Text As String) As String ' bo dau tieng viet
  Dim i As Long, key As String
  If Len(Text) = 0 Then Up_TV_KhongDau = "": Exit Function
  For i = 1 To Len(Text)
    key = Mid(Text, i, 1)
    If dic.Exists(key) Then Mid(Text, i, 1) = dic.Item(key)
  Next
  Up_TV_KhongDau = Text
End Function

Private Sub UserForm_Initialize()
  If Test = False Then Call Add_Dic
  If Not IsArray(sArr) Then Call Add_Data
End Sub
Code thiếu nhiều lệnh nên không chỉnh được
 
Upvote 0
Xin lỗi bác. Bửa em đang đăng bài nó mất điện đột ngột. quên kiểm tra lại đã đính kèm file hay chưa . Nhờ bác sửa giúp em ạ
Chinh code
Mã:
Option Explicit
Dim dicVN As Object, sArr As Variant, sCol&

Private Sub TextBox1_Change()
  locnhapkhonewa
End Sub

Private Sub locnhapkhonewa()
On Error Resume Next
  Dim arr(), tArr(), i&, k&, j&, dk$
  If TypeName(dicVN) = "Nothing" Then Call Add_Dic
  If Not IsArray(sArr) Then Call Add_Data
  dk = Up_TV_KhongDau(LCase(TextBox1.Value))
  ReDim arr(1 To 1)
  For i = 1 To UBound(sArr)
    If sArr(i, sCol + 1) Like dk & "*" Or sArr(i, sCol + 2) Like dk & "*" Then
      k = k + 1
      ReDim Preserve arr(1 To k)
      arr(k) = i
    End If
  Next
 
  ReDim tArr(1 To k, 1 To sCol)
  For i = 1 To k
    For j = 1 To sCol
      tArr(i, j) = sArr(arr(i), j)
    Next j
  Next
  ListBox1.Clear
  ListBox1.ColumnCount = sCol
  ListBox1.List = tArr
End Sub

Private Sub Add_Data()
  Dim tArr(), sRow&, i&, k&, j&
  i = Sheets("Sheet1").Range("B65500").End(xlUp).Row
  tArr = Sheets("Sheet1").Range("B4:H" & i).Value
  sRow = UBound(tArr): sCol = UBound(tArr, 2)
  ReDim sArr(1 To sRow, 1 To sCol + 2)
  For i = 1 To sRow
    If tArr(i, 1) <> Empty Or tArr(i, 2) <> Empty Then
      k = k + 1
      If tArr(i, 1) <> Empty Then sArr(k, sCol + 1) = Up_TV_KhongDau(LCase(tArr(i, 1)))
      If tArr(i, 2) <> Empty Then sArr(k, sCol + 2) = Up_TV_KhongDau(LCase(tArr(i, 2)))
      For j = 1 To sCol
        sArr(k, j) = tArr(i, j)
      Next j
    End If
  Next i
End Sub

Private Sub Add_Dic()
  Dim CharCode, ResText$, i&
  Set dicVN = CreateObject("scripting.dictionary")
  CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
                   ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
                   ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
                   ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
                   ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
                   ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
                   ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
                   ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
                   ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
      dicVN.Add CharCode(i), Mid(ResText, i + 1, 1)
      'dic.Add UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1))
  Next
End Sub

Private Function Up_TV_KhongDau(ByVal Text As String) As String ' bo dau tieng viet
  Dim i&, iKey$
  If Len(Text) = Empty Then Up_TV_KhongDau = "": Exit Function
  For i = 1 To Len(Text)
    iKey = Mid(Text, i, 1)
    If dicVN.Exists(iKey) Then Mid(Text, i, 1) = dicVN.Item(iKey)
  Next
  Up_TV_KhongDau = Text
End Function

Private Sub UserForm_Initialize()
  If TypeName(dicVN) = "Nothing" Then Call Add_Dic
  If Not IsArray(sArr) Then Call Add_Data
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom