
Gửi bởi
minhtien0408
[IMG]images/smilies/a41.gif[/IMG] Cám ơn anh nhiều lắm ạ. Nhờ anh mà em tiết kiệm được 1 đống thời gian làm việc đó ạ . Cám ơn anh nhiều [IMG]images/smilies/a44.gif[/IMG][IMG]images/smilies/a44.gif[/IMG][IMG]images/smilies/a44.gif[/IMG]
Tôi thấy thuật toán của bạn gtri chưa ổn. Bạn thử với dữ liệu như sau sẽ thấy nhiều chỗ có vấn đề:
Tác giả
Tác phẩm của Giải pháp Excel
Tác phẩm
của
Giải pháp
Excel
Ngoài ra, với dữ liệu lớn thì dùng thuật toán trên sẽ rất chậm, có thể đơ Excel máy luôn.
Nếu là tôi thì tôi dùng thuật toán như sau:
- Sắp xếp dữ liệu đầu vào theo thứ tự từ chuỗi dài nhất đến chuỗi ngắn nhất
- Duyệt qua dữ liệu (từ chuỗi dài đến chuỗi ngắn) Dùng hàm Filter lọc mảng kết quả với điều kiện lần lượt là từng từ trong câu, có kế thừa kết quả lọc của các từ trong một câu. Nếu sau khi lọc hết các từ trong câu mà mảng kết quả lọc không có phần tử nào thì ghi câu đó vào mảng kết quả.
Giải thích thì hơi lòng vòng khó hiểu. Đây là code:
Mã nguồn PHP:
Sub Loc()Dim ArrData, ArrWord() As String, ArrTmp1() As Long, i As Long, j As Long, StrTmp As String, LngTmp As LongArrData = Range([A1], [A65536].End(xlUp)).ValueReDim ArrTmp1(1 To UBound(ArrData, 1))For i = 1 To UBound(ArrData, 1) ArrData(i, 1) = Application.WorksheetFunction.Trim(ArrData(i, 1)) ArrTmp1(i) = Len(ArrData(i, 1))NextFor i = 1 To UBound(ArrTmp1, 1) - 1 For j = i + 1 To UBound(ArrTmp1, 1) If ArrTmp1(i) < ArrTmp1(j) Then StrTmp = ArrData(i, 1): ArrData(i, 1) = ArrData(j, 1): ArrData(j, 1) = StrTmp LngTmp = ArrTmp1(i): ArrTmp1(i) = ArrTmp1(j): ArrTmp1(j) = LngTmp End If NextNextErase ArrTmp1Dim ArrTmp2() As StringDim ArrResult() As StringReDim ArrResult(1 To 1)ArrResult(1) = " " & ArrData(1, 1) & " "LngTmp = 1For i = 2 To UBound(ArrData, 1) If ArrData(i, 1) <> "" Then ArrWord = Split(ArrData(i, 1), " ") For j = LBound(ArrWord, 1) To UBound(ArrWord, 1) ArrTmp2 = Filter(ArrResult, " " & ArrWord(j) & " ", True, vbTextCompare) If UBound(ArrTmp2, 1) = -1 Then LngTmp = LngTmp + 1 ReDim Preserve ArrResult(1 To LngTmp) ArrResult(LngTmp) = " " & ArrData(i, 1) & " " Exit For End If Next End IfNext[D:D].ClearContents[D1].Resize(LngTmp).Value = Application.WorksheetFunction.Transpose(ArrResult)End Sub