[Giúp đỡ] Sửa code tìm kiếm (1 người xem)

  • Thread starter Thread starter adult
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

adult

Thành viên hoạt động
Tham gia
2/12/07
Bài viết
193
Được thích
30
Chào các anh chị,
Em có tìm được 1 file search trong form rất hay và tốc độ rất nhanh, sử dụng phương thức tìm dictionary của thầy @ndu96081631 . Nhưng trong code thì chỉ tìm nội dung gõ chính xác thì mới tìm ra.
Ví du: trong cột Tên hàng có Lắc Châu Bạc, tại ô textbox em phải gõ chữ "Lắc" thì mới ra, còn em gõ chữ "Châu" thì tìm không thấy, các anh chị có thể sửa giúp em code tìm nội dung bất kỳ, không cần tìm từ chữ đầu tiên không ạ? Em có post file lên, nhờ các anh chị giúp nha.
Cảm ơn nhiều

Còn đây là code trong file luôn nhé.
Mã:
Function Filter2DArray(sArray, ColIndex As Long, FindStr As String)
  Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp
  Set Dic = CreateObject("Scripting.Dictionary")
  TmpArr = sArray
  ColIndex = ColIndex + LBound(TmpArr, 2) - 1
  For i = LBound(TmpArr, 1) To UBound(TmpArr, 1)
    TmpStr = Left(TmpArr(i, ColIndex), Len(FindStr))
    If UCase(TmpStr) = UCase(FindStr) Then Dic.Add i, ""
  Next
  If Dic.Count > 0 Then
    Tmp = Dic.Keys
    ReDim Arr(UBound(Tmp), LBound(TmpArr, 2) To UBound(TmpArr, 2))
    For i = LBound(Tmp) To UBound(Tmp)
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        Arr(i, j) = TmpArr(Tmp(i), j)
      Next
    Next
  End If
  Filter2DArray = Arr
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
sáng giờ cũng >30 lượt view và 12 lượt tải mà chưa có bạn nào tìm được cách giải quyết à? Chắc phải nhờ người làm ra code sửa mới được.
Thầy @ndu96081631 ra tay giúp em nha.
 
Upvote 0

File đính kèm

Upvote 0
Mình thử thì thấy đúng rồi. trong file này mình ko thêm Columnheads (tiêu đề cho bảng listbox) được.
Mình có thử đặt code như sau nhưng ko được. Bạn coi gì sửa dùm mình nha
Mã:
Private Sub UserForm_Initialize()
  Col = 1
Listbox1.list()=sArray --> code gốc  
ListBox1.Rowsource = sArray --> sửa như vậy bị báo lỗi
End Sub
Giờ mình ngâm cái code của bạn xem sửa ở đâu.
Cảm ơn bạn nhé
 
Upvote 0
Mình thử thì thấy đúng rồi. trong file này mình ko thêm Columnheads (tiêu đề cho bảng listbox) được.
Mình có thử đặt code như sau nhưng ko được. Bạn coi gì sửa dùm mình nha
Mã:
Private Sub UserForm_Initialize()
  Col = 1
Listbox1.list()=sArray --> code gốc 
ListBox1.Rowsource = sArray --> sửa như vậy bị báo lỗi
End Sub
Giờ mình ngâm cái code của bạn xem sửa ở đâu.
Cảm ơn bạn nhé
Hình như cái này chỉ nhận với Names thôi. Không nhận với mảng thì phải. Bạn tìm hiểu them thử
Muốn hiện tiêu đề vẽ vài cái Label trên cái Listbox rồi điền tiêu đề vào đó cũng ổn bạn ạ
 
Upvote 0
Mình thử thì thấy đúng rồi. trong file này mình ko thêm Columnheads (tiêu đề cho bảng listbox) được.
Mình có thử đặt code như sau nhưng ko được. Bạn coi gì sửa dùm mình nha
Mã:
Private Sub UserForm_Initialize()
End Sub
Giờ mình ngâm cái code của bạn xem sửa ở đâu.
Cảm ơn bạn nhé
Vào UserForm_Initialize
Sửa A13 thành A12
 
Upvote 0
Bạn @♫ђöล♥ßล†♥†µ♫ vui lòng hỗ trợ giúp mình thêm trường hợp sau:
Sau khi mình chọn từ "lắc" trong textbox2 thì listbox1 nó hiện ra nhiều loại Lắc xi latin, lắc tay, ... Trong textbox3 mình muốn search dữ liệu từ listbox1 mới lọc ra (Ví dụ: chọn mã "ST" thì listbox1 phải ra phần có liên quan đến mặt hàng "Lắc" thôi chứ bây giờ mình gõ "ST" nó ra toàn bộ các mặt hàng ko liên quan đến "Lắc" luôn).
Bạn xem chỉnh lại code giúp mình với nha.
Cảm ơn bạn nhiều.
 
Upvote 0
Bạn @♫ђöล♥ßล†♥†µ♫ vui lòng hỗ trợ giúp mình thêm trường hợp sau:
Sau khi mình chọn từ "lắc" trong textbox2 thì listbox1 nó hiện ra nhiều loại Lắc xi latin, lắc tay, ... Trong textbox3 mình muốn search dữ liệu từ listbox1 mới lọc ra (Ví dụ: chọn mã "ST" thì listbox1 phải ra phần có liên quan đến mặt hàng "Lắc" thôi chứ bây giờ mình gõ "ST" nó ra toàn bộ các mặt hàng ko liên quan đến "Lắc" luôn).
Bạn xem chỉnh lại code giúp mình với nha.
Cảm ơn bạn nhiều.
Các anh chị vui lòng dành chút thời gian để hỗ trợ mình nhé.
 
Upvote 0
Các anh chị vui lòng dành chút thời gian để hỗ trợ mình nhé.
Chúc mọi người ngày mới tốt lành.
Nhắc lại nội dung cũ nhờ mọi người hỗ trợ:

Sau khi mình chọn từ "lắc" trong textbox2 thì listbox1 nó hiện ra nhiều loại Lắc xi latin, lắc tay, ... Trong textbox3 mình muốn search dữ liệu từ listbox1 mới lọc ra (Ví dụ: chọn mã "ST" thì listbox1 phải ra phần có liên quan đến mặt hàng "Lắc" thôi chứ bây giờ mình gõ "ST" nó ra toàn bộ các mặt hàng ko liên quan đến "Lắc" luôn).
Bạn xem chỉnh lại code giúp mình với nha.
Cảm ơn các anh chị nhiều.
File trong #3 nhé.
 
Upvote 0
Chúc mọi người ngày mới tốt lành.
Nhắc lại nội dung cũ nhờ mọi người hỗ trợ:

Sau khi mình chọn từ "lắc" trong textbox2 thì listbox1 nó hiện ra nhiều loại Lắc xi latin, lắc tay, ... Trong textbox3 mình muốn search dữ liệu từ listbox1 mới lọc ra (Ví dụ: chọn mã "ST" thì listbox1 phải ra phần có liên quan đến mặt hàng "Lắc" thôi chứ bây giờ mình gõ "ST" nó ra toàn bộ các mặt hàng ko liên quan đến "Lắc" luôn).
Bạn xem chỉnh lại code giúp mình với nha.
Cảm ơn các anh chị nhiều.
File trong #3 nhé.
Chỉnh lại code, lúc nhập vô textbox3 thì lọc cái mảng trong listbox1, chứ không phải mảng ban đầu. Code đang lọc sArray là cái mảng ban đầu.
 
Upvote 0
Chỉnh lại code, lúc nhập vô textbox3 thì lọc cái mảng trong listbox1, chứ không phải mảng ban đầu. Code đang lọc sArray là cái mảng ban đầu.
Mình có chỉnh thử rồi và đã giải quyết được bài toán lọc từ array đã được lọc từ listbox 1 nhưng nó bị vấn đề sau:
Khi delete nội dung cần lọc trong textbox 3 thì listbox1 không show lại những gì đã lọc ở textbox2.
Bạn xem có fix được vụ này thì giúp mình nha.
Cảm ơn
Mình fix xong rồi, thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có chỉnh thử rồi và đã giải quyết được bài toán lọc từ array đã được lọc từ listbox 1 nhưng nó bị vấn đề sau:
Khi delete nội dung cần lọc trong textbox 3 thì listbox1 không show lại những gì đã lọc ở textbox2.
Bạn xem có fix được vụ này thì giúp mình nha.
Cảm ơn
Mình fix xong rồi, Cảm ơn
Mã:
Private Sub TextBox1_Change()
    Call LocDuLieu

End Sub
Private Sub TextBox2_Change()
    Call LocDuLieu
End Sub


Sub LocDuLieu()
    Dim mangKetQua '()
    If Len(Trim(TextBox1.Value)) = 0 Then
        mangKetQua = sArray 'chap nhan moi ket qua, khong loc gì ca
    Else
        mangKetQua = Filter2DArray(sArray, 1, "*" & TextBox1.Value & "*", False) 'loc theo txtbox1
    End If
    If Len(Trim(TextBox2.Value)) <> 0 Then
        'loc khi da nhap thong tin textbox2
        If IsArray(mangKetQua) Then 'neu loc textbox1 co ket qua
            mangKetQua = Filter2DArray(mangKetQua, 2, "*" & TextBox2.Value & "*", False)
        End If
    End If
    If IsArray(mangKetQua) Then
        ListBox1.List = mangKetQua
        Erase mangKetQua
    Else
        ListBox1.Clear
        
    End If
    

End Sub
 
Upvote 0
Mình có chỉnh thử rồi và đã giải quyết được bài toán lọc từ array đã được lọc từ listbox 1 nhưng nó bị vấn đề sau:
Khi delete nội dung cần lọc trong textbox 3 thì listbox1 không show lại những gì đã lọc ở textbox2.
Bạn xem có fix được vụ này thì giúp mình nha.
Cảm ơn
Mình fix xong rồi, Cảm ơn
Để tăng tốc và thuận tiện cho việc lọc dữ liệu theo nhiều điều kiện, mình dựa vào code của bạn @ndu96081631
http://www.giaiphapexcel.com/forum/...p-ý-hoàn-thiện-về-hàm-UDF-Filter2DArray/page4
Viết thêm 3 điều kiện, do không hiểu hết code gốc nên có thể chưa hoàn chỉnh, các bạn góp ý thêm
Mã:
Function Filter2DArray_sCon(ByVal sarr, ByVal HasTitle As Boolean, ByVal ColIndex1 As Byte, ByVal FindStr1 As String, _
            Optional ByVal ColIndex2 As Byte = 0, Optional ByVal FindStr2 As String = vbEmpty, _
            Optional ByVal ColIndex3 As Byte = 0, Optional ByVal FindStr3 As String = vbEmpty, _
            Optional ByVal ColIndex4 As Byte = 0, Optional ByVal FindStr4 As String = vbEmpty)
'Filter2DArray_sCon(Mang loc, có tieu de bang?, Cot loc 1, dieu kien loc 1, Cot loc 2, dieu kien loc 2,
                    'Cot loc 3, dieu kien loc 3, Cot loc 4, dieu kien loc 4)
'Chi loc theo toi da 4 dieu kien
'sArr: Mang 2 chieu
'HasTitle: True có tieu de, False khong có tieu de cot
'ColIndex1: so thu tu cot dieu kien 1 cua mang sArr
'FindStr1: dieu kien 1, neu so sanh dang só thì dùng <, <=, = ...., neu dang chuoi có the dung ky tu dai dien *
' .....
  Dim colArr(), Arr(), Dic As Object
  Dim Tmp, TmpVal As Double, FindStr, jChk As Boolean, sChk As Boolean
  Dim i As Long, j As Byte
  
  On Error Resume Next
  i = LBound(sarr, 2) - 1
  j = 1
  ReDim colArr(1 To 2, 1 To j)
  colArr(1, j) = ColIndex1 + i: colArr(2, j) = FindStr1

  If Len(FindStr2) And ColIndex2 > 0 Then
    j = j + 1
    ReDim Preserve colArr(1 To 2, 1 To j)
    colArr(1, j) = ColIndex2 + i: colArr(2, j) = FindStr2
  End If

  If Len(FindStr3) And ColIndex3 > 0 Then
    j = j + 1
    ReDim Preserve colArr(1 To 2, 1 To j)
    colArr(1, j) = ColIndex3 + i: colArr(2, j) = FindStr3
  End If
  
  If Len(FindStr4) And ColIndex4 > 0 Then
    j = j + 1
    ReDim Preserve colArr(1 To 2, 1 To j)
    colArr(1, j) = ColIndex4 + i: colArr(2, j) = FindStr4
  End If

  Set Dic = CreateObject("Scripting.Dictionary")
  For i = LBound(sarr, 1) - HasTitle To UBound(sarr, 1)
    For j = 1 To UBound(colArr, 2)
      sChk = False
      Tmp = sarr(i, colArr(1, j))
      FindStr = colArr(2, j)
      jChk = (InStr("><=", Left(FindStr, 1)) > 0)
      
      If jChk And FindStr <> "" Then
        If CStr(Tmp) = CStr(CDbl(Tmp)) Then sChk = Evaluate(CDbl(Tmp) & FindStr)
      Else
        If Left(FindStr, 1) = "!" Then
          If Not (UCase(Tmp) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then sChk = True
        Else
          If UCase(Tmp) Like UCase(FindStr) Then sChk = True
        End If
      End If
      If sChk = False Then Exit For
    Next j
    If sChk = True Then Dic.Add i, ""
  Next i
  
  If Dic.Count > 0 Then
    Tmp = Dic.keys
    ReDim Arr(LBound(sarr, 1) To UBound(Tmp) + LBound(sarr, 1) - HasTitle, LBound(sarr, 2) To UBound(sarr, 2))
    For i = LBound(sarr, 1) - HasTitle To UBound(Tmp) + LBound(sarr, 1) - HasTitle
      For j = LBound(sarr, 2) To UBound(sarr, 2)
        Arr(i, j) = sarr(Tmp(i - LBound(sarr, 1) + HasTitle), j)
      Next j
    Next i
    If HasTitle Then
      For j = LBound(sarr, 2) To UBound(sarr, 2)
        Arr(LBound(sarr, 1), j) = sarr(LBound(sarr, 1), j)
      Next j
    End If
    Filter2DArray_sCon = Arr
  Else
    Filter2DArray_sCon = vbEmpty
  End If
End Function
 

File đính kèm

Upvote 0
Để tăng tốc và thuận tiện cho việc lọc dữ liệu theo nhiều điều kiện, mình dựa vào code của bạn @ndu96081631
http://www.giaiphapexcel.com/forum/showthread.php?53566-Thắc-mắc-góp-ý-hoàn-thiện-về-hàm-UDF-Filter2DArray/page4
Viết thêm 3 điều kiện, do không hiểu hết code gốc nên có thể chưa hoàn chỉnh, các bạn góp ý thêm
Mã:
Function Filter2DArray_sCon(ByVal sarr, ByVal HasTitle As Boolean, ByVal ColIndex1 As Byte, ByVal FindStr1 As String, _
            Optional ByVal ColIndex2 As Byte = 0, Optional ByVal FindStr2 As String = vbEmpty, _
            Optional ByVal ColIndex3 As Byte = 0, Optional ByVal FindStr3 As String = vbEmpty, _
            Optional ByVal ColIndex4 As Byte = 0, Optional ByVal FindStr4 As String = vbEmpty)
'Filter2DArray_sCon(Mang loc, có tieu de bang?, Cot loc 1, dieu kien loc 1, Cot loc 2, dieu kien loc 2,
                    'Cot loc 3, dieu kien loc 3, Cot loc 4, dieu kien loc 4)
'Chi loc theo toi da 4 dieu kien
'sArr: Mang 2 chieu
'HasTitle: True có tieu de, False khong có tieu de cot
'ColIndex1: so thu tu cot dieu kien 1 cua mang sArr
'FindStr1: dieu kien 1, neu so sanh dang só thì dùng <, <=, = ...., neu dang chuoi có the dung ky tu dai dien *
' .....
  Dim colArr(), Arr(), Dic As Object
  Dim Tmp, TmpVal As Double, FindStr, jChk As Boolean, sChk As Boolean
  Dim i As Long, j As Byte

  On Error Resume Next
  i = LBound(sarr, 2) - 1
  j = 1
  ReDim colArr(1 To 2, 1 To j)
  colArr(1, j) = ColIndex1 + i: colArr(2, j) = FindStr1

  If Len(FindStr2) And ColIndex2 > 0 Then
    j = j + 1
    ReDim Preserve colArr(1 To 2, 1 To j)
    colArr(1, j) = ColIndex2 + i: colArr(2, j) = FindStr2
  End If

  If Len(FindStr3) And ColIndex3 > 0 Then
    j = j + 1
    ReDim Preserve colArr(1 To 2, 1 To j)
    colArr(1, j) = ColIndex3 + i: colArr(2, j) = FindStr3
  End If

  If Len(FindStr4) And ColIndex4 > 0 Then
    j = j + 1
    ReDim Preserve colArr(1 To 2, 1 To j)
    colArr(1, j) = ColIndex4 + i: colArr(2, j) = FindStr4
  End If

  Set Dic = CreateObject("Scripting.Dictionary")
  For i = LBound(sarr, 1) - HasTitle To UBound(sarr, 1)
    For j = 1 To UBound(colArr, 2)
      sChk = False
      Tmp = sarr(i, colArr(1, j))
      FindStr = colArr(2, j)
      jChk = (InStr("><=", Left(FindStr, 1)) > 0)
    
      If jChk And FindStr <> "" Then
        If CStr(Tmp) = CStr(CDbl(Tmp)) Then sChk = Evaluate(CDbl(Tmp) & FindStr)
      Else
        If Left(FindStr, 1) = "!" Then
          If Not (UCase(Tmp) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then sChk = True
        Else
          If UCase(Tmp) Like UCase(FindStr) Then sChk = True
        End If
      End If
      If sChk = False Then Exit For
    Next j
    If sChk = True Then Dic.Add i, ""
  Next i

  If Dic.Count > 0 Then
    Tmp = Dic.keys
    ReDim Arr(LBound(sarr, 1) To UBound(Tmp) + LBound(sarr, 1) - HasTitle, LBound(sarr, 2) To UBound(sarr, 2))
    For i = LBound(sarr, 1) - HasTitle To UBound(Tmp) + LBound(sarr, 1) - HasTitle
      For j = LBound(sarr, 2) To UBound(sarr, 2)
        Arr(i, j) = sarr(Tmp(i - LBound(sarr, 1) + HasTitle), j)
      Next j
    Next i
    If HasTitle Then
      For j = LBound(sarr, 2) To UBound(sarr, 2)
        Arr(LBound(sarr, 1), j) = sarr(LBound(sarr, 1), j)
      Next j
    End If
    Filter2DArray_sCon = Arr
  Else
    Filter2DArray_sCon = vbEmpty
  End If
End Function
Khi nghĩ tới 2, 3 điều kiện và nhiều hơn thế thì người ta không có chơi theo kiểu của bạn nhé, người ta nghĩ tới trường hợp n điều kiện, chứ không phải là giới hạn mấy điều kiện.


UCase(Mid(FindStr, 2, Len(FindStr))))
UCase(FindStr)

Mấy cái trên thì xử lý rất vụng, có thể tối ưu được không?
Cuối cùng code trên dùng dic, tức là nó chỉ lọc theo kiểu duy nhất, cái này là đại kỵ chứ chả hay kho gì cả nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi nghĩ tới 2, 3 điều kiện và nhiều hơn thế thì người ta không có chơi theo kiểu của bạn nhé, người ta nghĩ tới trường hợp n điều kiện, chứ không phải là giới hạn mấy điều kiện.
4 điều kiện là đủ dùng cho đa số trường hợp rồi, còn n điều kiện đã từng thử nhưng nhìn cách dùng thấy kỳ kỳ nên thôi, để phần cho người khác
UCase(Mid(FindStr, 2, Len(FindStr))))
UCase(FindStr)
Mấy cái trên thì xử lý rất vụng, có thể tối ưu được không?
Mỗi người 1 cách, đang chờ cách khác như thế nào
Cuối cùng code trên dùng dic, tức là nó chỉ lọc theo kiểu duy nhất, cái này là đại kỵ chứ chả hay kho gì cả nhé.
Cái nầy 100% là code của bạn Ndu, còn các kiểu lọc chịu khó đọc lại từng dòng lệnh, nếu không hiểu thì thì chạy từng dòng lệnh xem các kiểu lọc nằm ở dòng lệnh nào
Hôm nay trời nắng nóng, bạn viết thêm code để trời mưa như hôm qua cho mát trời đất, ngập lụt Sài gòn :p
 
Upvote 0
4 điều kiện là đủ dùng cho đa số trường hợp rồi, còn n điều kiện đã từng thử nhưng nhìn cách dùng thấy kỳ kỳ nên thôi, để phần cho người khác
Đúng là chỉ cần một vài điều kiện thôi; bày vẽ nhiều quá mệt lắm. Code bao nhiều quá thì nó cũng có cái giá phải trả.
Tuy nhiên, cái vụ nhiều điều kiện nếu làm theo đúng tinh thần code có cấu trúc thì người ta làm khác.

Để đó xem người viết bài #15 sẽ đề nghị làm ra sao.
 
Upvote 0
Chào các anh chị,
Em có tìm được 1 file search trong form rất hay và tốc độ rất nhanh, sử dụng phương thức tìm dictionary của thầy @ndu96081631 . Nhưng trong code thì chỉ tìm nội dung gõ chính xác thì mới tìm ra.
...
Nhìn mà biết được là thì hay đáng lẽ phải biết cách sửa chứ. Tại sao lại phải nhờ sửa
sáng giờ cũng >30 lượt view và 12 lượt tải mà chưa có bạn nào tìm được cách giải quyết à? ...
....
Thiếu giống gì cách giải quyết. Nhưng ông nội tôi cũng khong biết tiêu chuẩn "hay và tốc độ" của bạn ra sao, rớ vào mệt lắm.
 
Upvote 0
Khi nghĩ tới 2, 3 điều kiện và nhiều hơn thế thì người ta không có chơi theo kiểu của bạn nhé, người ta nghĩ tới trường hợp n điều kiện, chứ không phải là giới hạn mấy điều kiện.
Thích n điều kiện?

Chẳng qua là gọi hàm gốc n lần thôi
Mã:
Res = sArray
dk = Array(Array(TextBox1.Value, ..., TextBoxn.Value), Array(ColIndex1, ..., ColIndexn))
For k = 0 To UBound(dk(0))
    Res = Filter2DArray(Res, dk(1)(k), "*" & dk(0)(k) & "*", False)
Next k
Chỉ là vd. chỉ ra hướng thôi
 
Upvote 0
Thích n điều kiện?

Chẳng qua là gọi hàm gốc n lần thôi
Mã:
Res = sArray
dk = Array(Array(TextBox1.Value, ..., TextBoxn.Value), Array(ColIndex1, ..., ColIndexn))
For k = 0 To UBound(dk(0))
    Res = Filter2DArray(Res, dk(1)(k), "*" & dk(0)(k) & "*", False)
Next k
Chỉ là vd. chỉ ra hướng thôi
Đúng là sẽ phải dùng mảng để nạp thông tin về cột và giá trị cần lọc. Viết theo gợi ý của anh thì sẽ là ăn nhanh, không phải code nhiều, dùng cái có sẵn chỉ việc phát triển thêm. Đối với những bạn thích vọc thì thêm thắt bẫy lỗi trường hợp lọc được kết quả empty nữa. Mà viết thành một hàm hoàn chỉnh nó cũng có cái thú chứ anh.
Để đó xem người viết bài #15 sẽ đề nghị làm ra sao.
Đầu em đậu hũ thì có nghĩ được cái gì hay đâu, có chăng thì "bây giờ tình đến với tôi như mây hững hờ mây trôi":
Cứ theo code #14 mà triển khai lại, tuy nhiên đầu vào bây giờ là hai mảng chẳng hạn, một mảng chỉ số cột, một mảng giá trị tìm kiếm tương ứng.
Cái nầy 100% là code của bạn Ndu, còn các kiểu lọc chịu khó đọc lại từng dòng lệnh, nếu không hiểu thì thì chạy từng dòng lệnh xem các kiểu lọc nằm ở dòng lệnh nào
Hôm nay trời nắng nóng, bạn viết thêm code để trời mưa như hôm qua cho mát trời đất, ngập lụt Sài gòn
TRưa trời nắng tui nhìn không rõ, tuy vậy tui cũng chả ham cái vụ dùng dic để save kết quả.
 
Upvote 0
...
UCase(Mid(FindStr, 2, Len(FindStr))))
UCase(FindStr)

Mấy cái trên thì xử lý rất vụng, có thể tối ưu được không?
Với code trên mà nói chuyện "vụng" và "tối ưu" là đặt lầm chỗ ưu tiên.
Điểm quan trọng là phải hỏi lại thớt muốn tìm như thế nào. Theo code trên thì tìm từ "cà" trong "cà chua" sẽ ra cả "càng cua"
...
Cuối cùng code trên dùng dic, tức là nó chỉ lọc theo kiểu duy nhất, cái này là đại kỵ chứ chả hay kho gì cả nhé.
Đại kỵ chỗ nào? Có thể đúng, có thể sai, có thể dùng dao mổ trâu cắt cổ gà, chứ làm gì đến nổi đụng vào là không tốt.
Đúng là sẽ phải dùng mảng để nạp thông tin về cột và giá trị cần lọc. Viết theo gợi ý của anh thì sẽ là ăn nhanh, không phải code nhiều, dùng cái có sẵn chỉ việc phát triển thêm. Đối với những bạn thích vọc thì thêm thắt bẫy lỗi trường hợp lọc được kết quả empty nữa. Mà viết thành một hàm hoàn chỉnh nó cũng có cái thú chứ anh.
...
Cứ theo code #14 mà triển khai lại, tuy nhiên đầu vào bây giờ là hai mảng chẳng hạn, một mảng chỉ số cột, một mảng giá trị tìm kiếm tương ứng.
Đã nghĩ đến dùng mảng mà vẫn còn cố chấp. Theo đúng tinh thần Excel thì phải dùng Paramarray chứ.
 
Upvote 0
Đúng là sẽ phải dùng mảng để nạp thông tin về cột và giá trị cần lọc. Viết theo gợi ý của anh thì sẽ là ăn nhanh, không phải code nhiều, dùng cái có sẵn chỉ việc phát triển thêm. Đối với những bạn thích vọc thì thêm thắt bẫy lỗi trường hợp lọc được kết quả empty nữa. Mà viết thành một hàm hoàn chỉnh nó cũng có cái thú chứ anh.
Tôi không có ý ăn nhanh đâu. Tôi đưa ra cách mà người "mù" VBA có thể tự làm được nếu chịu khó suy nghĩ.

1. Nếu là người thạo code thì họ biết viết code hoặc sửa code của người khác. Tôi không bàn tới những người này vì họ tự mình làm được.

2. Nếu là người không thạo, không biết cách sửa code thì cách tôi đưa ra là cho họ. Họ không phải sửa gì trong code nguồn. Thậm chí họ không cần nhờ bất cứ ai. Chỉ cần suy nghĩ một chút là họ làm được. Gọi hàm gốc lần thứ nhất thì res là kết quả các dòng thỏa đk1. Nếu truyền mảng res đó khi gọi hàm gốc lần thứ 2 thì res sau khi gọi hàm gốc lần thứ 2 chính là kết quả các dòng thỏa đk1 và đk2 ***. Gọi hàm gốc n lần thì res là kết quả các dòng thỏa đk1, đk2, ..., đkn. Thế thôi.

Còn cách đưa các đk vào mảng chẳng qua là để có thể dùng vòng lặp FOR
-----------
***: Nếu tôi đưa cho ông kiểm duyệt một bài b1 và lệnh cho ông ta là phải xóa các từ sex thì ông ta trình tôi bản kq1 không còn từ sex nào nữa. Nếu tiếp đó tôi đưa bản b2 = kq1 mà ông ta vừa làm và lệnh phải xóa các từ orgasm thì ông ta trình bản kq2. Rõ ràng bản kq2 không chứa orgasm vì ông kiểm duyệt vừa xóa. Cũng không chứa sex vì bản gốc b2 = kq1 không có.

Giải thích cho những người thấy chướng mắt khi tôi dùng vd. với sex và orgasm. Đây là bài viết sẽ đăng trên báo dành cho trẻ vị thành niên. Vì thế phải lược bỏ những từ trên nếu tác giả cố tình dùng. Kiểm duyệt (censorship) mà.
 
Upvote 0
Với code trên mà nói chuyện "vụng" và "tối ưu" là đặt lầm chỗ ưu tiên.
Điểm quan trọng là phải hỏi lại thớt muốn tìm như thế nào. Theo code trên thì tìm từ "cà" trong "cà chua" sẽ ra cả "càng cua"

Đại kỵ chỗ nào? Có thể đúng, có thể sai, có thể dùng dao mổ trâu cắt cổ gà, chứ làm gì đến nổi đụng vào là không tốt.

Đã nghĩ đến dùng mảng mà vẫn còn cố chấp. Theo đúng tinh thần Excel thì phải dùng Paramarray chứ.
mấy cái ucase vụng là ở chỗ phải tính đi tính lại, trong khi chỉ cần tính một lần trước vòng lặp for, em chỉ góp ý cho cái code, còn dic thì trưa qua nắng, nhìn không rõ, dùng dic là dùng dao mổ trâu thịt trim
 
Upvote 0
Với code trên mà nói chuyện "vụng" và "tối ưu" là đặt lầm chỗ ưu tiên.
Điểm quan trọng là phải hỏi lại thớt muốn tìm như thế nào. Theo code trên thì tìm từ "cà" trong "cà chua" sẽ ra cả "càng cua"

Đại kỵ chỗ nào? Có thể đúng, có thể sai, có thể dùng dao mổ trâu cắt cổ gà, chứ làm gì đến nổi đụng vào là không tốt.

Đã nghĩ đến dùng mảng mà vẫn còn cố chấp. Theo đúng tinh thần Excel thì phải dùng Paramarray chứ.
Dùng một tham số để chứa chỉ số và chuỗi tìm kiếm hay 2 tham số nó khâc nhau không nhiều
 
Upvote 0
mấy cái ucase vụng là ở chỗ phải tính đi tính lại, trong khi chỉ cần tính một lần trước vòng lặp for,
Cách nầy quá tuyệt, hãy múa phím viết code theo ý tưởng tuyệt vời nầy xem có được không?
em chỉ góp ý cho cái code, còn dic thì trưa qua nắng, nhìn không rõ, dùng dic là dùng dao mổ trâu thịt trim
Dùng "dao" nào không quan trọng bằng cách thức "thịt trim" đúng điệu, đúng "qui trình"
Sáng nay trời nắng, đang chờ tụ mây gọi mưa
 
Upvote 0
mấy cái ucase vụng là ở chỗ phải tính đi tính lại, trong khi chỉ cần tính một lần trước vòng lặp for, em chỉ góp ý cho cái code, còn dic thì trưa qua nắng, nhìn không rõ, dùng dic là dùng dao mổ trâu thịt trim
Đã nói đặt ưu tiên sai chỗ rồi. Cái quan trọng là có nên dùng hàm InStr hay không, và nếu dùng thì như thế nào.
Dùng một tham số để chứa chỉ số và chuỗi tìm kiếm hay 2 tham số nó khâc nhau không nhiều
Khác rất nhiều.
Dùng Paramarray khi có khả năng con số động 0-n ; điển hình là hàm Choose, hay gần hơn là hàm SUMIFS (n là số chẵn)
Dùng Array khi cần thiết phải nạp mảng; điển hình là hàm Match
Ở đây, không có nhu cầu lấy điều kiện lọc từ một range cho nên không dùng mảng.

Mảng là một cấu trúc cho nên cho phép code hoạt động rộng rãi (bao quát) hơn. Tuy nhiên, cũng vì là một cấu trúc cho code gọi hàm cũng phải dựng dữ liệu thành cấu trúc trước khi nạp tham - trừ trường hợp nạp cả range như đã đề cập ở trên.
 
Upvote 0
Đã nói đặt ưu tiên sai chỗ rồi. Cái quan trọng là có nên dùng hàm InStr hay không, và nếu dùng thì như thế nào.
HỊ hị, tại em chỉ quan tâm cái vụ code cụ thể. Như gợi ý của anh ở bài trước thì việc này cần tách bạch một số cái, ví dụ là tìm theo từ hay theo chữ cái, ví dụ tìm "Vũ" thì là tìm từ "Vũ" hay là tìm câu nào có hai chữ "V" và "Ũ" đứng cạnh nhau.
 
Upvote 0
Ồ đĩa, ồ đĩa, hia câm trúp bồ...
Mi in lịch nát bét hở?

Nguyên bản:
Oh dear, oh dear, here comes trouble.
Me English not bad, heh?
 
Upvote 0

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

Back
Top Bottom