hongphuong1997
Thành viên tiêu biểu

- Tham gia
- 12/11/17
- Bài viết
- 773
- Được thích
- 322
- Giới tính
- Nữ
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)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.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 ạ.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
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
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 ạ!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
Em xin phép mượn bài của anh bebo021999, chuyển Voi thành Trâu cho bạn hongphuong1997.được voi đòi TRÂU tý tẹo nhé bác???? ....
Bác chuyển thể từ sub() thành Func với ạ.
Dạ, em cảm ơn anh ạ, nhừn đêm đã về khuya rùi, nên em cũng chưa thể test được ạ.Em xin phép mượn bài của anh bebo021999, chuyển Voi thành Trâu cho bạn hongphuong1997.
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.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
Vâng ạ, vì cháu suy nghĩ chưa đầy đủ ạ.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.