Xin giúp đỡ về tìm tập hợp các giá trị duy nhất. (1 người xem)

Liên hệ QC

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

huuhien80

Thành viên chính thức
Tham gia
30/12/08
Bài viết
54
Được thích
8
Em có một bảng dữ liệu đính kèm.

Em muôn tìm tập hợp ít nhất các giá trị mà trong chuỗi giá trị đó dòng nào trong bảng cũng phải chứa ít nhất 1 giá trị trong tập hợp đó.

Em đã dùng cách gán số liệu cho từng giá trị và ... tạo vòng lặp nhưng nhiều vòng lặp quá khiến chạy rất lâu mà vẫn không khả thi.

Em đưa dữ liệu gốc lên đây. Mong các Thầy giúp đỡ...
 

File đính kèm

Em chuyển sang dạng dữ liệu số. Mong Các Thầy giúp đỡ.

Cảm ơn các Thầy nhiều.
 

File đính kèm

Upvote 0
Em có một bảng dữ liệu đính kèm.

Em muôn tìm tập hợp ít nhất các giá trị mà trong chuỗi giá trị đó dòng nào trong bảng cũng phải chứa ít nhất 1 giá trị trong tập hợp đó.

Em đã dùng cách gán số liệu cho từng giá trị và ... tạo vòng lặp nhưng nhiều vòng lặp quá khiến chạy rất lâu mà vẫn không khả thi.

Em đưa dữ liệu gốc lên đây. Mong các Thầy giúp đỡ...

thử với code này xem thế nào : ( với file dữ liệu bạn up bài #1, bài #2 tôi chưa xem )
Mã:
Sub GPE()
    Dim tmparr, Arr, item, tmp, ArrCount, index%, Count%
    Dim i&, j&, str$
        tmparr = [A3:F61]
        ReDim ArrCount(1 To 6): Count = UBound(tmparr, 1) : index = 1
        For i = 1 To 6
            ArrCount(i) = UBound(tmparr, 1)
        Next
        ReDim Arr(1 To UBound(tmparr, 1), 1 To 6)
        With CreateObject("scripting.dictionary")
            For i = 1 To UBound(tmparr, 1)
                For j = 1 To 6
                    tmp = Trim(CStr(tmparr(i, j)))
                    If Len(tmp) Then
                        If Not .exists(tmp) Then
                            .Add tmp, ""
                            Arr(i, j) = tmp
                        Else
                            ArrCount(j) = ArrCount(j) - 1
                            If ArrCount(j) < Count Then
                               Count = ArrCount(j): index = j
                            End If
                        End If
                    End If
                Next
              Next
        End With
        For j = 1 To UBound(Arr, 1)
            tmp = Arr(j, index)
            If Len(tmp) Then
                str = str & tmp & "-"
            End If
        Next
        MsgBox "Ket qua La :" & vbLf & Left(str, Len(str) - 1)
        'Range("I2").Resize(, 6) = ArrCount: MsgBox index
        'Range("i3").Resize(i - 1, 6) = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh đã xem giúp và trả lời sớm.
Code của anh chạy rất nhanh nhưng vẫn chưa chính xác. Code của anh cho ra tổng hợp 13 ký tự nhưng em làm phép tính thử thì 1 số dòng vẫn không có ký tự trong tổng hợp đó.

Anh xem lại giúp em với. Em đã nhập kết quả trong file.
Cảm ơn anh.
 

File đính kèm

Upvote 0
Cảm ơn anh đã xem giúp và trả lời sớm.
Code của anh chạy rất nhanh nhưng vẫn chưa chính xác. Code của anh cho ra tổng hợp 13 ký tự nhưng em làm phép tính thử thì 1 số dòng vẫn không có ký tự trong tổng hợp đó.

Anh xem lại giúp em với. Em đã nhập kết quả trong file.
Cảm ơn anh.

Vậy kết quả chính xác (theo dữ liệu trong file này) sẽ là gì?
 
Upvote 0
Mình tìm ra chuỗi như vầy, không chắc là chuỗi ngắn nhất:

e1 n1 c2 z2 d2 l2 o v2 j3 e3 x k3 j1 g t3 v3 u3 d1 r1 q1
 
Upvote 0
Em chuyển sang dạng dữ liệu số. Mong Các Thầy giúp đỡ.

Cảm ơn các Thầy nhiều.

tốc độ xe đam 50cc thôi,
kết quả 11 em
Mã:
p2,b3,f,d1,p1,x,j3,j2,v3,n1,v

Mã:
Sub SN_GPE_8()
Dim sarr As Variant, kq(), i, j, k, l As Long, dic As Object
   
  sarr = [A3:F61].Value
   Set dic = CreateObject("Scripting.Dictionary")
      
      For i = 1 To UBound(sarr)
        For j = 1 To UBound(sarr, 2)
           If Not dic.exists(sarr(i, j)) Then
               For k = 1 To UBound(sarr)
                    If Application.WorksheetFunction.CountIf([a3:f3].Offset(k - 1), sarr(i, j)) > 1 Then
                        l = l + 1
                        dic.Add sarr(i, j), ""
                        ReDim Preserve kq(1 To l)
                        kq(l) = sarr(i, j)
                    End If
                Next k
            End If
        Next j
    Next i
            
 If k Then [G3] = Join(kq, ",")
 Set dic = Nothing
End Sub
 
Upvote 0
Chuỗi vậy đưa vào thử cho từng dòng vẫn chưa thỏa mãn đk .

tốc độ xe đam 50cc thôi,
kết quả 11 em
Mã:
p2,b3,f,d1,p1,x,j3,j2,v3,n1,v

Chuỗi của bạn còn 23/59 dòng thiếu giá trị....


Mình tìm ra chuỗi như vầy, không chắc là chuỗi ngắn nhất:

e1 n1 c2 z2 d2 l2 o v2 j3 e3 x k3 j1 g t3 v3 u3 d1 r1 q1

Cảm ơn HYen17. Chuỗi trên đưa vào vẫn thiếu 2 dòng chưa có giá trị trong chuỗi.

Dù sao mình cũng rất cảm ơn. Đây là 1 bài toán khó mà mình đang đi tìm lời giải....
Cho mình xin code của bạn nhé.

Vậy kết quả chính xác (theo dữ liệu trong file này) sẽ là gì?

Cảm ơn Thầy đã xem bài viết. Em chưa biết kết quả, em dùng vòng lặp thì quá lâu nên post lên nhờ Thầy và các ACE giúp đỡ. Cảm ơn Thầy
 
Lần chỉnh sửa cuối:
Upvote 0
Chuỗi của bạn còn 23/59 dòng thiếu giá trị....




Cảm ơn HYen17. Chuỗi trên đưa vào vẫn thiếu 2 dòng chưa có giá trị trong chuỗi.

Dù sao mình cũng rất cảm ơn. Đây là 1 bài toán khó mà mình đang đi tìm lời giải....
Cho mình xin code của bạn nhé.



Cảm ơn Thầy đã xem bài viết. Em chưa biết kết quả, em dùng vòng lặp thì quá lâu nên post lên nhờ Thầy và các ACE giúp đỡ. Cảm ơn Thầy

chuổi của bác Hyen chỉ còn thiếu giá trị của dòng đầu tiên
có thể dùng cái hàm này để kiểm tra
Mã:
=SUMPRODUCT(COUNTIF(A3:F3,[COLOR=#0000ff]$J$5:$AC$5[/COLOR]))
với cái range màu xanh là cá ký tự của bác HYen
kéo xuống, thấy cái nào = zero là cái đó thiếu

p/s: sau khi đăng bài tôi cũng phát hiện thiếu, nhưng dò hoài ko biết nó sai ở đâu, thấy logic lắm rùi......hichic
 
Lần chỉnh sửa cuối:
Upvote 0
Mình cũng đang xem lại code của bạn! nhiều chỗ vẫn chưa hiểu lắm! Mình yếu nhất phần Scripting.Dictionary.
Chuỗi của Hyen17 ở dòng 14 cũng = 0 mà.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn HYen17. Chuỗi trên đưa vào vẫn thiếu 2 dòng chưa có giá trị trong chuỗi.
Đây là 1 bài toán khó mà mình đang đi tìm lời giải....
Cho mình xin code của bạn nhé.

Bạn hãy cho biết đó là 2 dòng mang số bao nhiêu?
Cách làm là vầy, trước khi viết code:

Gán cho vùng dữ liệu 1 cái tên (VDL);
Bắt đầu từ cột [H] (chính xác là [H3]) ta dùng hàm COUNTIF() để tính có bao nhiêu trị trong ô [A3] tương ứng trong VDL;
Tại cột [O] ta tính trị cực đại của 6 ô ta vừa tính;
Copy & dán Values cột [O] này
Sửa lại công thức tại cột [H] cho đến cột [M] sao cho chỉ hiện chuỗi tương ứng với trị bên cột [O]

(Lúc này có 3 trường hợp sẩy ra; Trường hợp trong hàng chỉ có 1 ô (38 TH); Trường hợp trong hàng có 2 ô cùng giá trị cực đại là 18 hàng & cuối cùng là trường hợp trùng 3 là 03 trường hợp)

Trong 38 hàng đầu cũng có rất nhiều hàng trùng nhau, ta dùng câu lệnh macro loại các dữ liệu trùng này trong chuỗi MIN;
Duyệt với 18 hàng trùng 2 ta cần tiến hành kiểm xem trong 6 giá trị trong vùng từ cột [A] đến [F] đã có trong chuỗi MIN chưa; có rồi thì thoát; bằng chưa có thì lấy dữ liệu 1 trong 2 ô đó chép thêm vô chuỗi MIN

Làm như vậy tất nhiên vẫn chưa chặt chẽ là chuỗi ngắn nhất, nhưng nó sẽ chứa dữ liệu của tất cả các hàng.

Lý ra dữ liệu bạn nên viết hoa chữ cái; chứ như bạn hiện giờ thì "l" khó nhồm bỏ xừ!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn hãy cho biết đó là 2 dòng mang số bao nhiêu?
Cách làm là vầy, trước khi viết code:

Gán cho vùng dữ liệu 1 cái tên (VDL);
Bắt đầu từ cột [H] (chính xác là [H3]) ta dùng hàm COUNTIF() để tính có bao nhiêu trị trong ô [A3] tương ứng trong VDL;
Tại cột [O] ta tính trị cực đại của 6 ô ta vừa tính;
Copy & dán Values cột [O] này
Sửa lại công thức tại cột [H] cho đến cột [M] sao cho chỉ hiện chuỗi tương ứng với trị bên cột [O]

(Lúc này có 3 trường hợp sẩy ra; Trường hợp trong hàng chỉ có 1 ô (38 TH); Trường hợp trong hàng có 2 ô cùng giá trị cực đại là 18 hàng & cuối cùng là trường hợp trùng 3 là 03 trường hợp)

Trong 38 hàng đầu cũng có rất nhiều hàng trùng nhau, ta dùng câu lệnh macro loại các dữ liệu trùng này trong chuỗi MIN;
Duyệt với 18 hàng trùng 2 ta cần tiến hành kiểm xem trong 6 giá trị trong vùng từ cột [A] đến [F] đã có trong chuỗi MIN chưa; có rồi thì thoát; bằng chưa có thì lấy dữ liệu 1 trong 2 ô đó chép thêm vô chuỗi MIN

Làm như vậy tất nhiên vẫn chưa chặt chẽ là chuỗi ngắn nhất, nhưng nó sẽ chứa dữ liệu của tất cả các hàng.

Lý ra dữ liệu bạn nên viết hoa chữ cái; chứ như bạn hiện giờ thì "l" khó nhồm bỏ xừ!

Cảm ơn Thầy, tất cả là chữ viết thường hết. Em đang thử cách của Thầy.
 
Upvote 0
Em làm theo cách của Thầy và chỉ làm đến được bước 2, còn phần code thì em vẫn chưa hiểu lắm ....
 
Upvote 0
Thầy làm ơn chia sẻ từng bước cách thực hiện được không ạ.

Chuỗi của Thầy là 19: "u1 r1 j1 c2 d2 z2 u3 x k3 g t3 l2 o v2 q1 j3 e3 e1 n1"

Em cảm ơn Thầy
 
Upvote 0
1./ Gán tên 'DuLieu' cho vùng dữ liệu (Xem trong file)
2./ Tại [H3] ta áp công thức =COUNTIF(DuLieu,A3) => KQ là 5
Tính tiếp cho 5 ô bên fải ô CT (công thức) này;
3./ Tại [O3] ta tìm MAX() của 6 ô CT này

4./ Copy xuống các hàng dưới;
5./ Biến cột [O] thành Values ( bằng cách copy & dán Value)
6./ Tại [L3] là ô có trị lớn nhất trong 6 ô CT cùng hàng ta sửa lại CT có dạng
=IF(COUNTIF(DuLieu,E3)=O3,E3,"")
Tất nhiên sau đó ta sửa lại hết công thức cho các ô ở hàng & cột khác
Để kết quả là chuỗi tương ứng với ô bên vùng dữ liệu đạt trị cực đại trong hàng;
Sau đó toàn bộ vùng công thức này cũng tiến hành làm như bước 5./ bên trên

(*) Công thức tại [Q] bạn tự tìm hiểu lấy.

Bước cuối: Xếp theo cột có tiêu để là 'N10' (tăng dần) & 'N8' là giảm dần

Sau đó cho chạy macro;

Các dòng lệnh trong macro rất ư là dễ tiếp thu với bạn mà, fải không?!


Chúc ngon giấc!
 
Upvote 0
1./ Gán tên 'DuLieu' cho vùng dữ liệu (Xem trong file)
2./ Tại [H3] ta áp công thức =COUNTIF(DuLieu,A3) => KQ là 5
Tính tiếp cho 5 ô bên fải ô CT (công thức) này;
3./ Tại [O3] ta tìm MAX() của 6 ô CT này

4./ Copy xuống các hàng dưới;
5./ Biến cột [O] thành Values ( bằng cách copy & dán Value)
6./ Tại [L3] là ô có trị lớn nhất trong 6 ô CT cùng hàng ta sửa lại CT có dạng
=IF(COUNTIF(DuLieu,E3)=O3,E3,"")
Tất nhiên sau đó ta sửa lại hết công thức cho các ô ở hàng & cột khác
Để kết quả là chuỗi tương ứng với ô bên vùng dữ liệu đạt trị cực đại trong hàng;
Sau đó toàn bộ vùng công thức này cũng tiến hành làm như bước 5./ bên trên

(*) Công thức tại [Q] bạn tự tìm hiểu lấy.

Bước cuối: Xếp theo cột có tiêu để là 'N10' (tăng dần) & 'N8' là giảm dần

Sau đó cho chạy macro;

Các dòng lệnh trong macro rất ư là dễ tiếp thu với bạn mà, fải không?!


Chúc ngon giấc!
Thanks So Much... Mình đang xem đá bóng .... ko trả lời được ngay! thông cảm...
 
Upvote 0
Em có một bảng dữ liệu đính kèm.

Em muôn tìm tập hợp ít nhất các giá trị mà trong chuỗi giá trị đó dòng nào trong bảng cũng phải chứa ít nhất 1 giá trị trong tập hợp đó.

Em đã dùng cách gán số liệu cho từng giá trị và ... tạo vòng lặp nhưng nhiều vòng lặp quá khiến chạy rất lâu mà vẫn không khả thi.

Em đưa dữ liệu gốc lên đây. Mong các Thầy giúp đỡ...

Bạn kiểm tra kết quả này xem thế nào r1-c3-d2-j1-n-e3-o-o1-x-x2-v2-v3-s3-n1 (14 phần tử )
Tính toán của tôi thấy là số phần tử nhỏ nhất đạt yêu cầu chỉ có thể bằng 14
------------------
có lẽ là còn khá nhiều nhóm, nhưng đều là 14 p.tử
r1-u1-j1-n-e3-s1-a3-o1-x-l2-v2-c-v3-s3
r1-u1-j1-n-e3-s1-a3-o1-x-f2-l2-v2-c-v3
r1-u1-d2-l-n-u3-z2-d1-f3-n2-b2-g-v3-s3
b3-u1-l-n-u3-l3-z2-h2-f3-y1-n2-b2-g-v3
r1-u1-d2-j1-t1-e3-a3-o1-x-j-f2-v2-c-v3
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn kiểm tra kết quả này xem thế nào r1-c3-d2-j1-n-e3-o-o1-x-x2-v2-v3-s3-n1 (14 phần tử )
Tính toán của tôi thấy là số phần tử nhỏ nhất đạt yêu cầu chỉ có thể bằng 14
------------------
có lẽ là còn khá nhiều nhóm, nhưng đều là 14 p.tử
r1-u1-j1-n-e3-s1-a3-o1-x-l2-v2-c-v3-s3
r1-u1-j1-n-e3-s1-a3-o1-x-f2-l2-v2-c-v3
r1-u1-d2-l-n-u3-z2-d1-f3-n2-b2-g-v3-s3
b3-u1-l-n-u3-l3-z2-h2-f3-y1-n2-b2-g-v3
r1-u1-d2-j1-t1-e3-a3-o1-x-j-f2-v2-c-v3


Mình thực hiện theo cách của HYen17 dữ liệu là 20. Cho mình xin PP của bạn nhé...
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom