So sánh các chuỗi ký tự

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

hongphuong1997

Thành viên tiêu biểu
Tham gia
12/11/17
Bài viết
742
Được thích
311
Giới tính
Nữ
Em có bài toán như file đính kèm:
Em kính nhờ các bác và các anh chị viết cho em code hoặc Func với ạ.
Em xin cảm ơn ạ!
 

File đính kèm

  • So sánh các chuỗi số.xlsx
    9.4 KB · Đọc: 14
Dòng 5: Kết quả phải là "2_4" trong khi bạn mong muốn nó là "2"?
Nếu là 2, thi dù bạn không nói rõ, nhưng hình như từ dòng 3 trở đi sẽ so sánh với 1 và 2?
Mình giả định quy luật là: 1 dòng bất kỳ sẽ so sánh với tất cả các dòng bên trên nó, nếu thỏa điều kiện từ 4 thành phần trở lên thỏa thì lấy dòng đó.
Kết quả dòng 5 sẽ là "2_4", vì dòng 2 và 4, mỗi dòng có ít nhất 4 thành phần khớp.

PHP:
Option Explicit
Sub timchuoi()
Dim lr&, i&, j&, c&, rng, sp, res()
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A2:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
For i = 2 To UBound(rng)
    For j = 1 To i - 1
        c = 0
        For Each sp In Split(rng(i, 2), ",")
            If InStr(1, rng(j, 2) & ",", sp & ",") Then c = c + 1
            If c = 4 Then
                res(i, 1) = IIf(res(i, 1) = "", "", res(i, 1) & "_") & rng(j, 1)
                Exit For
            End If
        Next
    Next
Next
Range("C2:C10000").ClearContents
Range("C2").Resize(UBound(res), 1).Value = res
End Sub
 

File đính kèm

  • So sánh các chuỗi số.xlsm
    16.1 KB · Đọc: 7
Upvote 0
Dòng 5: Kết quả phải là "2_4" trong khi bạn mong muốn nó là "2"?
Nếu là 2, thi dù bạn không nói rõ, nhưng hình như từ dòng 3 trở đi sẽ so sánh với 1 và 2?
Mình giả định quy luật là: 1 dòng bất kỳ sẽ so sánh với tất cả các dòng bên trên nó, nếu thỏa điều kiện từ 4 thành phần trở lên thỏa thì lấy dòng đó.
Kết quả dòng 5 sẽ là "2_4", vì dòng 2 và 4, mỗi dòng có ít nhất 4 thành phần khớp.

PHP:
Option Explicit
Sub timchuoi()
Dim lr&, i&, j&, c&, rng, sp, res()
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A2:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
For i = 2 To UBound(rng)
    For j = 1 To i - 1
        c = 0
        For Each sp In Split(rng(i, 2), ",")
            If InStr(1, rng(j, 2) & ",", sp & ",") Then c = c + 1
            If c = 4 Then
                res(i, 1) = IIf(res(i, 1) = "", "", res(i, 1) & "_") & rng(j, 1)
                Exit For
            End If
        Next
    Next
Next
Range("C2:C10000").ClearContents
Range("C2").Resize(UBound(res), 1).Value = res
End Sub
Cháu cảm ơn bác ạ (Có khả năng cháu bị nhầm)
Để cháu kiểm tra nhé bác.
Bài đã được tự động gộp:

Dòng 5: Kết quả phải là "2_4" trong khi bạn mong muốn nó là "2"?
Nếu là 2, thi dù bạn không nói rõ, nhưng hình như từ dòng 3 trở đi sẽ so sánh với 1 và 2?
Mình giả định quy luật là: 1 dòng bất kỳ sẽ so sánh với tất cả các dòng bên trên nó, nếu thỏa điều kiện từ 4 thành phần trở lên thỏa thì lấy dòng đó.
Kết quả dòng 5 sẽ là "2_4", vì dòng 2 và 4, mỗi dòng có ít nhất 4 thành phần khớp.

PHP:
Option Explicit
Sub timchuoi()
Dim lr&, i&, j&, c&, rng, sp, res()
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A2:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
For i = 2 To UBound(rng)
    For j = 1 To i - 1
        c = 0
        For Each sp In Split(rng(i, 2), ",")
            If InStr(1, rng(j, 2) & ",", sp & ",") Then c = c + 1
            If c = 4 Then
                res(i, 1) = IIf(res(i, 1) = "", "", res(i, 1) & "_") & rng(j, 1)
                Exit For
            End If
        Next
    Next
Next
Range("C2:C10000").ClearContents
Range("C2").Resize(UBound(res), 1).Value = res
End Sub
Bác oi, cháu kiểm tra rùi bác oi.
Code của bác chuẩn quá rùi.
Do cháu nhìn bằng mắt nên cháu bị sai đó bác.
 
Upvote 0
Bác @bebo021999 cháu kiểm tra kỹ lại rùi, code của bác vẫn bị nhầm bác oi.
Cháu đã thay đổi dữ liệu thì thấy nó sai sai bác oi.
Dòng 5: Kết quả phải là "2_4" trong khi bạn mong muốn nó là "2"?
Nếu là 2, thi dù bạn không nói rõ, nhưng hình như từ dòng 3 trở đi sẽ so sánh với 1 và 2?
Mình giả định quy luật là: 1 dòng bất kỳ sẽ so sánh với tất cả các dòng bên trên nó, nếu thỏa điều kiện từ 4 thành phần trở lên thỏa thì lấy dòng đó.
Kết quả dòng 5 sẽ là "2_4", vì dòng 2 và 4, mỗi dòng có ít nhất 4 thành phần khớp.

PHP:
Option Explicit
Sub timchuoi()
Dim lr&, i&, j&, c&, rng, sp, res()
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A2:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
For i = 2 To UBound(rng)
    For j = 1 To i - 1
        c = 0
        For Each sp In Split(rng(i, 2), ",")
            If InStr(1, rng(j, 2) & ",", sp & ",") Then c = c + 1
            If c = 4 Then
                res(i, 1) = IIf(res(i, 1) = "", "", res(i, 1) & "_") & rng(j, 1)
                Exit For
            End If
        Next
    Next
Next
Range("C2:C10000").ClearContents
Range("C2").Resize(UBound(res), 1).Value = res
End Sub
Bác oi, bác sửa lại code cho cháu với ạ.
Những điều kiện trước là cháu chưa suy nghĩ kỹ mừ chỉ suy xét theo một chiều. (Tức là chỉ xét từ trên xuống dưới)
Bác chỉnh sửa giúp cháu là xét theo kiểu vòng tròn với bác.
Cháu cảm ơn bác ạ!
 

File đính kèm

  • So sánh các chuỗi số.xlsm
    16.3 KB · Đọc: 2
Upvote 0
Kết quả nó ra khác khác của bạn. chẳng biết đúng hay sai nữa
1698035264152.png
 
Upvote 0
Bác @bebo021999
Bác chỉnh sửa giúp cháu là xét theo kiểu vòng tròn với bác.
Cháu cảm ơn bác ạ!
OK. Ít ra thì điều kiện phải rõ ràng thế chứ, dùng "ngoại suy" thì đau đầu lắm
Theo code này thì, đứng tại 1 dòng sẽ xét các dòng còn lại, ngoại trừ chính nó (Xét vòng tròn):
PHP:
Option Explicit
Sub timchuoi()
Dim lr&, i&, j&, c&, rng, sp, res()
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A2:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
For i = 1 To UBound(rng)
    For j = 1 To UBound(rng)
        c = 0
        If i <> j Then
            For Each sp In Split(rng(i, 2), ",")
                If InStr(1, rng(j, 2) & ",", sp & ",") Then c = c + 1
                If c >= 4 Then
                    res(i, 1) = IIf(res(i, 1) = "", "", res(i, 1) & "_") & rng(j, 1)
                    Exit For
                End If
            Next
        End If
    Next
Next
Range("C2:C10000").ClearContents
Range("C2").Resize(UBound(res), 1).Value = res
End Sub
 

File đính kèm

  • So sánh các chuỗi số (1).xlsm
    16.5 KB · Đọc: 13
Upvote 0
OK. Ít ra thì điều kiện phải rõ ràng thế chứ, dùng "ngoại suy" thì đau đầu lắm
Theo code này thì, đứng tại 1 dòng sẽ xét các dòng còn lại, ngoại trừ chính nó (Xét vòng tròn):
PHP:
Option Explicit
Sub timchuoi()
Dim lr&, i&, j&, c&, rng, sp, res()
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A2:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
For i = 1 To UBound(rng)
    For j = 1 To UBound(rng)
        c = 0
        If i <> j Then
            For Each sp In Split(rng(i, 2), ",")
                If InStr(1, rng(j, 2) & ",", sp & ",") Then c = c + 1
                If c >= 4 Then
                    res(i, 1) = IIf(res(i, 1) = "", "", res(i, 1) & "_") & rng(j, 1)
                    Exit For
                End If
            Next
        End If
    Next
Next
Range("C2:C10000").ClearContents
Range("C2").Resize(UBound(res), 1).Value = res
End Sub
Cháu cảm ơn bác rất nhiều ạ!
hihi.... bác oi bác cho cháu được voi đòi TRÂU tý tẹo nhé bác???? ....
Bác chuyển thể từ sub() thành Func với ạ.
Cháu cảm ơn bác ạ.
 
Upvote 0

File đính kèm

  • So sánh các chuỗi số (1).xlsm
    17.9 KB · Đọc: 7
Upvote 0
Tùy theo dạng dữ liệu thực tế code có thể lượt bớt vài lệnh, nếu xét tất cả các khả năng cần phải viết đầy đủ các lệnh
Ví dụ thêm ô B8= b2,b4,b6,11
 
Upvote 0
So a với b rồi sau đó lại so b với a là lãng phí. Nhưng với cái kiểu thay đổi yêu cầu liên tục như thế này thì hơi đâu mà tối ưu, ra kết quả là được. Cái sự lãng phí trước đó hóa ra lại phù hợp với yêu cầu chuyển thành Function.
Tùy theo dạng dữ liệu thực tế code có thể lượt bớt vài lệnh, nếu xét tất cả các khả năng cần phải viết đầy đủ các lệnh
Ví dụ thêm ô B8= b2,b4,b6,11
Cũng không trách người hỗ trợ được, còn tùy tâm và tùy khả năng nữa. Nếu người hỏi đã hài lòng với câu trả lời mà sau này phát sinh trường hợp ngoài mong muốn thì chỉ có thể trách mình hỏi không đến nơi đến chốn mà thôi.
--
Cái kiểu vừa mới phán "quá chuẩn rồi" ngay sau đó lại "thấy sai sai" là thấy không đáng tin rồi.
 
Upvote 0
So a với b rồi sau đó lại so b với a là lãng phí. Nhưng với cái kiểu thay đổi yêu cầu liên tục như thế này thì hơi đâu mà tối ưu, ra kết quả là được. Cái sự lãng phí trước đó hóa ra lại phù hợp với yêu cầu chuyển thành Function.

Cũng không trách người hỗ trợ được, còn tùy tâm và tùy khả năng nữa. Nếu người hỏi đã hài lòng với câu trả lời mà sau này phát sinh trường hợp ngoài mong muốn thì chỉ có thể trách mình hỏi không đến nơi đến chốn mà thôi.
--
Cái kiểu vừa mới phán "quá chuẩn rồi" ngay sau đó lại "thấy sai sai" là thấy không đáng tin rồi.
Vâng ạ, vì cháu suy nghĩ chưa đầy đủ ạ.
 
Upvote 0
Web KT
Back
Top Bottom