[Giúp đỡ] Sửa code tìm kiếm

Liên hệ QC

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

  • search userform.xlsb
    697 KB · Đọc: 36
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

  • search userform.xlsb
    696.3 KB · Đọc: 34
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

  • search userform.xlsb
    691.4 KB · Đọc: 23
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
Web KT
Back
Top Bottom