Tìm 2 cột có dữ liệu sai lệch ít nhất (1 người xem)

Liên hệ QC

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

xuandat3009

Thành viên mới
Tham gia
30/5/21
Bài viết
4
Được thích
2
Kính gửi Anh Chị.
Mong Anh Chị giúp đỡ.
Mình có file dữ liệu thô, bao gồm ~20 cột dữ liệu.
Bài toán đặt ra là: Tìm 2 cột có dữ liệu sai lệch ít nhất (so sánh các cột với nhau, mình xin nói rõ hơn là từng giá trị ở cột 1 sẽ đem so sánh với các cột còn lại theo hàng tương ứng)
P/s: Mình thì làm theo cách thủ công là đi so sánh cột 1 với từng cột còn lại, sau đó lại tiếp tục lấy cột 2 so sánh với các cột còn lại, sau đó là lấy cột 3 so sánh với các cột còn lại. Làm như mình rất thủ công và rất mất thời gian. Mong Anh Chị ai có ý tưởng hoặc có thể gợi ý giúp mình. Mình xin cảm ơn
2.PNG
 

File đính kèm

  • 1.PNG
    1.PNG
    276.4 KB · Đọc: 9
Lần chỉnh sửa cuối:
Kính gửi Anh Chị.
Mong Anh Chị giúp đỡ.
Mình có file dữ liệu thô, bao gồm ~20 cột dữ liệu.
Bài toán đặt ra là: Tìm 2 cột có dữ liệu sai lệch ít nhất (so sánh các cột với nhau, mình xin nói rõ hơn là từng giá trị ở cột 1 sẽ đem so sánh với các cột còn lại theo hàng tương ứng)
P/s: Mình thì làm theo cách thủ công là đi so sánh cột 1 với từng cột còn lại, sau đó lại tiếp tục lấy cột 2 so sánh với các cột còn lại, sau đó là lấy cột 3 so sánh với các cột còn lại. Làm như mình rất thủ công và rất mất thời gian. Mong Anh Chị ai có ý tưởng hoặc có thể gợi ý giúp mình. Mình xin cảm ơn
View attachment 261290
Chạy code dưới đây
Mã:
Option Explicit

Sub min_()
Dim nguon, sld, slc
Dim minSl, kq
Dim i, j, k, x, z, t
nguon = Sheet1.Range("C3:W61")
sld = UBound(nguon)
slc = UBound(nguon, 2)

minSl = 1000000000 ' nguon(1, 1)
For j = 1 To slc - 1
    For z = j + 1 To slc
        t = 0
        For i = 1 To sld
            t = t + Abs(nguon(i, j) - nguon(i, z))
        Next i
        If minSl > t Then
            minSl = t
            kq = j * 100 + z
        End If
    Next z
Next j
MsgBox "cot " & Int(kq / 100) & "_" & "cot " & (kq Mod 100)
End Sub
 
Chạy code dưới đây
Mã:
Option Explicit

Sub min_()
Dim nguon, sld, slc
Dim minSl, kq
Dim i, j, k, x, z, t
nguon = Sheet1.Range("C3:W61")
sld = UBound(nguon)
slc = UBound(nguon, 2)

minSl = 1000000000 ' nguon(1, 1)
For j = 1 To slc - 1
    For z = j + 1 To slc
        t = 0
        For i = 1 To sld
            t = t + Abs(nguon(i, j) - nguon(i, z))
        Next i
        If minSl > t Then
            minSl = t
            kq = j * 100 + z
        End If
    Next z
Next j
MsgBox "cot " & Int(kq / 100) & "_" & "cot " & (kq Mod 100)
End Sub
Đầu tiên xin cảm ơn Anh
nhưng em chạy thì báo lỗi ạ
Mong Anh giúp.3.PNG
 
Cột V sẽ thể hiện cột 1 và W sẽ thể hiện cột 2 cho từng dòng:
V3:
Mã:
=AGGREGATE(15,6,$A$1:$U$1/(ABS($A3:$U3-TRANSPOSE($A3:$U3))=AGGREGATE(15,6,ABS($A3:$U3-TRANSPOSE($A3:$U3)),$U$1+1)),COLUMN(A:A))
Công thức mảng, kết thúc bằng Ctrl-Shift-Enter, thay vì chỉ Enter.
Copy sang phải và xuống dưới
 

File đính kèm

Cột V sẽ thể hiện cột 1 và W sẽ thể hiện cột 2 cho từng dòng:
V3:
Mã:
=AGGREGATE(15,6,$A$1:$U$1/(ABS($A3:$U3-TRANSPOSE($A3:$U3))=AGGREGATE(15,6,ABS($A3:$U3-TRANSPOSE($A3:$U3)),$U$1+1)),COLUMN(A:A))
Công thức mảng, kết thúc bằng Ctrl-Shift-Enter, thay vì chỉ Enter.
Copy sang phải và xuống dưới
Tham khảo kết quả bằng VBA xem kết quả bằng công thức và VBA tại sao lại có sự khác nhau nhé!
 

File đính kèm

Kính gửi Anh Chị.
Mong Anh Chị giúp đỡ.
Mình có file dữ liệu thô, bao gồm ~20 cột dữ liệu.
Bài toán đặt ra là: Tìm 2 cột có dữ liệu sai lệch ít nhất (so sánh các cột với nhau, mình xin nói rõ hơn là từng giá trị ở cột 1 sẽ đem so sánh với các cột còn lại theo hàng tương ứng)
P/s: Mình thì làm theo cách thủ công là đi so sánh cột 1 với từng cột còn lại, sau đó lại tiếp tục lấy cột 2 so sánh với các cột còn lại, sau đó là lấy cột 3 so sánh với các cột còn lại. Làm như mình rất thủ công và rất mất thời gian. Mong Anh Chị ai có ý tưởng hoặc có thể gợi ý giúp mình. Mình xin cảm ơn
View attachment 261290
Anh @Ba! cho em mượn file của anh để em ráp công thức cho thớt tham khảo nha! Cảm ơn anh.

@xuandat3009:
Thử:
Mã:
=MOD(AGGREGATE(15,6,ROUND(ABS(N(OFFSET($A3,,ROW($1:$21)-1))-$A3:$U3),1)*10/(ROW($1:$21)<>COLUMN($A:$U))/($A3:$U3<>"")+ROW($1:$21)%,COLUMNS($A:A)),1)/1%
Chỉ Enter, fill qua phải rồi xuống.

Thân
 

File đính kèm

Anh @Ba! cho em mượn file của anh để em ráp công thức cho thớt tham khảo nha! Cảm ơn anh.

@xuandat3009:
Thử:
Mã:
=MOD(AGGREGATE(15,6,ROUND(ABS(N(OFFSET($A3,,ROW($1:$21)-1))-$A3:$U3),1)*10/(ROW($1:$21)<>COLUMN($A:$U))/($A3:$U3<>"")+ROW($1:$21)%,COLUMNS($A:A)),1)/1%
Chỉ Enter, fill qua phải rồi xuống.

Thân
Em cảm ơn Bác nhiều. Chúc Bác nhiều sức khoẻ.
Bài đã được tự động gộp:

Bạn chạy thử file đính kèm, vẫn là code ở trên, chỉ khác tên sheet chứa dữ liệu
Thành công rồi Bác ạ
Em cảm ơn Bác nhiều. Chúc Bác nhiều sức khoẻ.
Bài đã được tự động gộp:

Tham khảo kết quả bằng VBA xem kết quả bằng công thức và VBA tại sao lại có sự khác nhau nhé!
Em cảm ơn Bác nhiều. Chúc Bác nhiều sức khoẻ.
Bài đã được tự động gộp:

Cột V sẽ thể hiện cột 1 và W sẽ thể hiện cột 2 cho từng dòng:
V3:
Mã:
=AGGREGATE(15,6,$A$1:$U$1/(ABS($A3:$U3-TRANSPOSE($A3:$U3))=AGGREGATE(15,6,ABS($A3:$U3-TRANSPOSE($A3:$U3)),$U$1+1)),COLUMN(A:A))
Công thức mảng, kết thúc bằng Ctrl-Shift-Enter, thay vì chỉ Enter.
Copy sang phải và xuống dưới
Em cảm ơn Bác nhiều. Chúc Bác nhiều sức khoẻ.
 
Web KT

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

Back
Top Bottom