kscongtrinh
Thành viên mới
- Tham gia
- 11/7/16
- Bài viết
- 35
- Được thích
- 1
Bạn thử 1 file ví dụ lênMình có 1 bảng dữ liệu gồm , dữ liệu gốc so sánh , Và dữ liệu cần so sánh sắp xếp lại như sau
View attachment 202573
Khi sắp xếp dựa vào % giống nhau được config sẽ xuất ra kết quả , sắp xếp lại cùng hàng với dòng dữ liệu gốc như sau
View attachment 202574
Xin chân thành cảm ơn bạn đã giúp đỡ
mình add file mẫu đây bạnBạn thử 1 file ví dụ lên
Sub sosanhsapxep()
Dim Arr1 As Variant, Arr2 As Variant
Dim ListR() As Integer
Dim MyString As String
Dim Result As Variant
Dim i As Integer, j As Integer, k As Integer, x, z
Arr1 = Sheet1.Range("a1:a4")
Arr2 = Sheet1.Range("b1:c3")
Result = Arr1
ReDim Preserve Result(1 To UBound(Arr1), 1 To 3)
For i = 1 To UBound(Arr2)
ReDim ListR(1 To UBound(Arr1))
MyString = Mid(Arr2(i, 1), 1, 1)
k = 0
For j = 1 To UBound(Arr1)
If Left(Arr1(j, 1), 1) = MyString Then
k = k + 1
ListR(k) = j
End If
Next j
If k > 0 Then
z = 2
Do While k > 0
ReDim Preserve ListR(1 To k)
MyString = Mid(Arr2(i, 1), z, 1)
k = 0
For Each x In ListR
If z < Len(Arr1(x, 1)) + 1 Then
If Mid(Arr1(x, 1), z, 1) = MyString Then
k = k + 1
ListR(k) = x
End If
End If
Next x
z = z + 1
Loop
End If
Result(ListR(1), 2) = Arr2(i, 1)
Result(ListR(1), 3) = Arr2(i, 2)
Next i
Sheet1.Range("a12").Resize(UBound(Result), UBound(Result, 2)) = Result
End Sub
Đoạn code đang lỗi,Bạn chạy thử sub này xem sao
Mã:Sub sosanhsapxep() Dim Arr1 As Variant, Arr2 As Variant Dim ListR() As Integer Dim MyString As String Dim Result As Variant Dim i As Integer, j As Integer, k As Integer, x, z Arr1 = Sheet1.Range("a1:a4") Arr2 = Sheet1.Range("b1:c3") Result = Arr1 ReDim Preserve Result(1 To UBound(Arr1), 1 To 3) For i = 1 To UBound(Arr2) ReDim ListR(1 To UBound(Arr1)) MyString = Mid(Arr2(i, 1), 1, 1) k = 0 For j = 1 To UBound(Arr1) If Left(Arr1(j, 1), 1) = MyString Then k = k + 1 ListR(k) = j End If Next j If k > 0 Then z = 2 Do While k > 0 ReDim Preserve ListR(1 To k) MyString = Mid(Arr2(i, 1), z, 1) k = 0 For Each x In ListR If z < Len(Arr1(x, 1)) + 1 Then If Mid(Arr1(x, 1), z, 1) = MyString Then k = k + 1 ListR(k) = x End If End If Next x z = z + 1 Loop End If Result(ListR(1), 2) = Arr2(i, 1) Result(ListR(1), 3) = Arr2(i, 2) Next i Sheet1.Range("a12").Resize(UBound(Result), UBound(Result, 2)) = Result End Sub
Lắm khi nhà họ đâu có lường hết được đâu ạ. Cứ tưởng cái VBA nó thông minh lắm. Cứ tưởng nó nhẩy vào trong đầu đọc ý tưởng của con người và thực công việc mà người ta đang suy nghĩ vậy@kscongtrinh code trên đã chạy thử trên file bạn gửi thì không có lỗi. Việc này không biết có phải do số liệu có gì khác file mẫu hay không, bạn kiểm tra lại xem lỗi chỗ nào rồi quăng lên.
Arr1, Arr2 là để chạy trên mảng cho nhanh vậy thôi.
file mẫu của bạn là so sánh ký tự thì viết so sánh ký tự, còn như "anh cần em" vs "em cần anh" thì là so sánh từ rồi nhé. Nếu cần thì bạn có mẫu lên mới hiệu chỉnh được.
Thế thì "cần anh em" và "anh em cần" có giống nhau không?...
thứ 2 so sánh hiện tại dựa trên thuật toán Bảng chữ cái "abc...xyz" , có thể so sánh dựa chữ tiếng việt ví dụ "anh cần em " VS "em cần anh" giống nhau 100%. thì sắp xếp lại ạ
Cảm ơn bạn rất nhiều
Mình test file mẫu ok lắm bạn, cảm ơn bạn nhiều nhưng mình test file khác thì nó báo lỗiBạn chạy thử sub này xem sao
Mã:Sub sosanhsapxep() Dim Arr1 As Variant, Arr2 As Variant Dim ListR() As Integer Dim MyString As String Dim Result As Variant Dim i As Integer, j As Integer, k As Integer, x, z Arr1 = Sheet1.Range("a1:a4") Arr2 = Sheet1.Range("b1:c3") Result = Arr1 ReDim Preserve Result(1 To UBound(Arr1), 1 To 3) For i = 1 To UBound(Arr2) ReDim ListR(1 To UBound(Arr1)) MyString = Mid(Arr2(i, 1), 1, 1) k = 0 For j = 1 To UBound(Arr1) If Left(Arr1(j, 1), 1) = MyString Then k = k + 1 ListR(k) = j End If Next j If k > 0 Then z = 2 Do While k > 0 ReDim Preserve ListR(1 To k) MyString = Mid(Arr2(i, 1), z, 1) k = 0 For Each x In ListR If z < Len(Arr1(x, 1)) + 1 Then If Mid(Arr1(x, 1), z, 1) = MyString Then k = k + 1 ListR(k) = x End If End If Next x z = z + 1 Loop End If Result(ListR(1), 2) = Arr2(i, 1) Result(ListR(1), 3) = Arr2(i, 2) Next i Sheet1.Range("a12").Resize(UBound(Result), UBound(Result, 2)) = Result End Sub
Mình thực sự cảm ơn bạn rất nhiều đã giúp đỡ@kscongtrinh code trên đã chạy thử trên file bạn gửi thì không có lỗi. Việc này không biết có phải do số liệu có gì khác file mẫu hay không, bạn kiểm tra lại xem lỗi chỗ nào rồi quăng lên.
Arr1, Arr2 là để chạy trên mảng cho nhanh vậy thôi.
file mẫu của bạn là so sánh ký tự thì viết so sánh ký tự, còn như "anh cần em" vs "em cần anh" thì là so sánh từ rồi nhé. Nếu cần thì bạn có mẫu lên mới hiệu chỉnh được.