Tìm kiếm dữ liệu gần đúng nhất? (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào các bạn,

Nhờ các xem giúp tôi có cách nào xử lý được vấn đề mong muốn nêu trong tập tin gửi kèm không ạ?
Xin cảm ơn rất nhiều,
Oanh Thơ
 

File đính kèm

Macro này chỉ đảm bảo cho những số liệu bạn đưa lên trong file mà thôi:
PHP:
Sub TimGanDung()
 Dim Rng As Range, sRng As Range, Cls As Range
 Dim MyAdd As String:               Dim MyColor As Byte

 Set Rng = Range([m6], [m6].End(xlDown))
 With Range([F7], [F7].End(xlDown))
    .Offset(, 1).ClearContents:     Randomize
    .Interior.ColorIndex = 2:       MyColor = 34 + 4 * Rnd() \ 1
 End With
 For Each Cls In Range([F7], [F7].End(xlDown))
    Set sRng = Rng.Find(Trim$(Cls.Value), , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        Cls.Offset(, 1).Value = sRng.Offset(, 1).Value
    End If
 Next Cls
 For Each Cls In Range([F7], [F7].End(xlDown))
    If Cls.Offset(, 1).Value = "" Then
        Set sRng = Rng.Find(Cls.Value, , , xlPart)
        If Not sRng Is Nothing Then
            Cls.Offset(, 1).Value = sRng.Offset(, 1).Value
            Cls.Interior.ColorIndex = MyColor
        Else
            Set sRng = Rng.Find(Left(Cls.Value, 9))
            If Not sRng Is Nothing Then
                Cls.Offset(, 1).Value = sRng.Offset(, 1).Value
                Cls.Interior.ColorIndex = 3 + MyColor
            End If
        End If
    End If
 Next Cls
End Sub

Nhưng vẫn đang sai ở dòng 13
 
Lần chỉnh sửa cuối:
Xin chào các bạn,

Nhờ các xem giúp tôi có cách nào xử lý được vấn đề mong muốn nêu trong tập tin gửi kèm không ạ?
Xin cảm ơn rất nhiều,
Oanh Thơ
Thêm cách dùng công thức:
Mã:
G7=OFFSET($N$6,MOD(AGGREGATE(14,6,MMULT(N(ISNUMBER(FIND(MID(F7,FIND("|",SUBSTITUTE(F7,"-","|",2))+1,COLUMN($A:$D)),MID($M$7:$M$23,FIND("|",SUBSTITUTE($M$7:$M$23,"-","|",2))+1,4)))),ROW($1:$4)^0)/(LEFT(F7,5)=LEFT($M$7:$M$23,5))*10^3+ROW($1:$50),1),10^3),)
Chỉ Enter; Copy xuống.

Công thức sau xét kỹ và rút gọn hơn chút:
Mã:
G7=OFFSET($N$6,MOD(AGGREGATE(14,6,MMULT(N(ISNUMBER(FIND(MID(F7,FIND("|",SUBSTITUTE(F7,"-","|",2))+1,COLUMN($A:$D)),REPLACE($M$7:$M$23,1,9,"")))),ROW($1:$4)^0)/(LEFT(F7,9)=LEFT($M$7:$M$23,9))*10^3+ROW($1:$50),1),10^3),)
Chỉ Enter; Copy xuống.

Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Phức tạp thế mà chỉ có kết quả mong đơi, không có mô tả dữ liệu, mô tả cách tìm kiếm.

Tôi nghĩ rằng cách tìm kiếm vd. 64320-ATO-7100 phải là:
0. Gọi str = 64320-ATO-7100
1.tìm xem trong cột M có mục nào có đoạn đầu là str hay không. Nếu có thì lấy kết quả tương ứng ở cột N và kết thúc
2. str = str sau khi bỏ 1 ký tự cuối. Nhẩy về điểm 1

Lúc đó công thức cho G7
Mã:
=VLOOKUP(LOOKUP(2,1/COUNTIF(M$7:M$23,MID(F7,1,ROW(INDIRECT("1:"&LEN(F7))))&"*"),MID(F7,1,ROW(INDIRECT("1:"&LEN(F7))))&"*"),M$7:N$23,2,0)
Nhưng kết quả không như mong đợi ở dòng 13. Vậy thì chắc chắn cách dò kết quả mong đợi phải khác như tôi đã giả thiết.

Nhưng tôi không chơi trò đoán ý đồng đội.
 
Xin chào các bạn,

Nhờ các xem giúp tôi có cách nào xử lý được vấn đề mong muốn nêu trong tập tin gửi kèm không ạ?
Xin cảm ơn rất nhiều,
Oanh Thơ
Theo đề bài 9 kí tự đầu tiên không đổi , có thể dùng công thức này :
Mã:
G7=INDEX($N$7:$N$23,LOOKUP(10^6,MATCH(LEFT(F7,9)&MID(F7,FIND("-",F7,9),ROW($1:$20))&"*",$M$7:$M$23,)))
 
Theo đề bài 9 kí tự đầu tiên không đổi
Lưu ý cho Chủ thớt phải là: 9 ký tự đầu tiên của bảng 2 không đổi, đồng thời ký tự thứ 10 phải là "-" thì công thức Index(....) trên bài #5 mới hoạt động chính xác. :)
Tỷ như, nếu bảng 2 ký tự thứ 10 là một ký tự chữ cái nào khác, như: M13= "64320-AFYK-6802" thì nó sẽ tìm giá trị khác yêu cầu.
Thêm chút xíu sẽ chắc ăn hơn:
=INDEX($N$7:$N$23,LOOKUP(10^6,MATCH(LEFT(F7,9)&"*"&MID(F7,FIND("-",F7,9),ROW($1:$20))&"*",$M$7:$M$23,)))

Thân!
 
Lần chỉnh sửa cuối:
Mọi trò đoán ý đồng đội đều mạo hiểm.
Với cách đoán của tôi thì khi dò tìm F13 = 64320-AFYN-6800 thì ta tìm thấy khi str = 64320-AFY. Mà tìm thấy ở 2 vị trí M12 và M13. Do VLOOKUP lấy mục đầu nên sẽ trả về N12 <> mong đợi.
Nếu tôi vẫn đoán mò như trên nhưng thêm 1 chi tiết: nếu tìm thấy hơn 1 mục thì lấy mục cuối cùng. Lúc đó thay cho VLOOKUP tôi dùng LOOKUP và có N13. Tức với dữ liệu cụ thể này thì công thức may mắn trả về các giá trị mong đợi. Nhưng liệu trong trường hợp tổng quát có trả về các giá trị mong đợi không? Chưa chắc, vì qui tắc dò có thể khác. Cái gì không nói ra thì mãi mãi nó chỉ tồn tại trong đầu người không nói, người khác dù có đoán cũng không thể chắc 100%.
Công thức khủng
Mã:
=LOOKUP(2,SEARCH(LOOKUP(2,1/COUNTIF(M$7:M$23,MID(F7,1,ROW(INDIRECT("1:"&LEN(F7))))&"*"),MID(F7,1,ROW(INDIRECT("1:"&LEN(F7))))&"*"),M$7:M$23),N$7:N$23)
chắc chắn cho kết quả mong đợi với dữ liệu đã cho. Nhưng chắc gì đã đúng ý trong trường hợp tổng quát. Vì ai mà biết nhà thơ nghĩ gì :D

Dữ liệu luôn phải mô tả, luôn phải mô ta qui tắc tính toán. Giúp đỡ giải quyết vấn đề chứ tôi không tham dự thi "đoán ý đồng đội". Thế thôi.
 
Lần chỉnh sửa cuối:
------------------
 
Lần chỉnh sửa cuối:
Kính chào Bác batman1 và toàn thể anh chị,

Xin cảm ơn tất cả mọi người đã giúp đỡ cho Oanh Thơ ạ.
Thực sự bài toán này Oanh Thơ đưa ra, nó không có một qui tắc rõ ràng nào ạ (cũng có thể nó có nhưng tại thời điểm này đến bản thân Oanh Thơ chưa cũng chưa lý giải được ạ).
vì vậy mà cứ nhắm mắt nhắm mũi để đưa lên thôi ạ. Mục đ làm sao để có thể nhận được sự góp ý/lời khuyên của tất cả mọi người ạ. Thật khâm phục và ngưỡng mộ tất cả mọi người.
Oanh Thơ sẽ thử nghiệm thêm một số trường hợp khác nữa, nếu có chỗ nào còn vướng mắc rất mong lại nhận được sự hỗ trợ của tất cả mọi người, để có thể giải quyết trường hợp tổng quát nhất ạ.

Chân thành cảm ơn.
Oanh Thơ
 
Kính chào Bác batman1 và toàn thể anh chị,

Xin cảm ơn tất cả mọi người đã giúp đỡ cho Oanh Thơ ạ.
Thực sự bài toán này Oanh Thơ đưa ra, nó không có một qui tắc rõ ràng nào ạ (cũng có thể nó có nhưng tại thời điểm này đến bản thân Oanh Thơ chưa cũng chưa lý giải được ạ).
vì vậy mà cứ nhắm mắt nhắm mũi để đưa lên thôi ạ. Mục đ làm sao để có thể nhận được sự góp ý/lời khuyên của tất cả mọi người ạ. Thật khâm phục và ngưỡng mộ tất cả mọi người.
Oanh Thơ sẽ thử nghiệm thêm một số trường hợp khác nữa, nếu có chỗ nào còn vướng mắc rất mong lại nhận được sự hỗ trợ của tất cả mọi người, để có thể giải quyết trường hợp tổng quát nhất ạ.

Chân thành cảm ơn.
Oanh Thơ
Chưa có qui tắc rõ, thì làm khó nhau rồi, các công thức và code trên sẽ khó đáp ứng được tất cả trường hợp xảy ra (gần đúng)
 
Chưa có qui tắc rõ, thì làm khó nhau rồi, các công thức và code trên sẽ khó đáp ứng được tất cả trường hợp xảy ra (gần đúng)
Vì thế khi đưa ra công thức tôi ghi rõ nó được viết cho qui tắc giả thiết nào. Muốn kiểm tra tính đúng đắn thì chỉ cần nhập các dữ liệu khác nhau thì nhìn thấy ngay.
Còn các bạn kia cho công thức, code nhưng không cho biết nó được viết cho qui tắc giả thiết nào. Nên có muốn kiểm tra sự đúng đắn với giả thiết đó thì cũng chịu. Chỉ còn nước dò và phân tích code thôi.
 
Chắc chắn 1 điều là không đáp án nào có thể thỏa mãn iêu cầu của tác giả;
Vì dữ liệu của tác giả chưa có qui luật nào duy nhất. Có thể nó có là nhiều qui luật tập hợp lại.
Vậy thì tác giả cứ xài cái đáp án nào mà thấy thích thôi.

Chúc vui vẻ & hạnh fúc nhân dịp Tết đến, Xuân về!
 
chủ thớt muốn giải mã dữ liệu? Gửi yêu cầu, tình huống thực thế mà bạn đang gặp lên.
 
Web KT

Bài viết mới nhất

Back
Top Bottom