Học Dictionary qua các ví dụ đơn giản!

Liên hệ QC

chuot0106

Thành viên gắn bó
Tham gia
20/1/13
Bài viết
2,567
Được thích
1,670
Thực sự thì mình cũng chưa biết tên topic như vậy có hợp lí không(Nếu chưa hợp lí mong BQT sửa giúp), mình nêu mục đích của topic này luôn.
Bởi vì trên GPE đã có topic về vấn đề này rồi tuy nhiên các topic đó cũng chưa đi sâu lắm về "Dic" bản thân mình rất khó tiếp thu(cá nhân mình thôi). bởi vậy mình xin phép BQT được lập Topic mới này giành cho những người mới chập chững nghiên cứu về "Dic" như mình với mục đích chính như sau:
+ Mong các bạn có kinh nghiệm về "Dic" vào chia sẻ kinh nghiệm của bả n thân về việc học "Dic".
+ Các bạn có kinh nghiệm về "Dic" đưa ra các bài tập từ cơ bản đến đến nâng cao để các thành viên mới thực hành.
+ Các thành viên mới có thể đưa ra các câu hỏi cũng như bài tập liên quan để các thành viên có kinh nghiệm giúp đỡ.

Tất cả các mục đích này dựa trên tinh thần chia sẻ, giao lưu, học hỏi.
Rất mong nhận được sự chia sẻ của các bạn!
 
Mình tham gia giải bài tập nhằm mục đích học tập. Công việc mới cần thống kê báo cáo nên phải học excel để làm.
Câu lệnh item(kkk) lấy giá trị của item ứng với key là kkk. Nếu bạn muốn lấy thứ tự có thể gán dic.keys hoặc dic.items vào mảng
Vd Dim kkks(), giatri()
kkks=dic.keys
giatri=dic.items
 
Upvote 0
Quả thật, với topic này mình đã gặt hái được 1 số thành công nho nhỏ, cụ thể bản thân đã tự làm được 1 số bài tập mà mình đã tự ra đề, làm được 1 bài tập của thầy ptm0412 trong topic "Tổng quan về scripting..." của tác giả Kyo mà không nhìn đáp án. Chỉ đói chiếu với đáp án sau khi làm xong và kết quả ra chính xác luôn! Chính vì vậy hôm nay mình mạnh dạn đưa ra 1 câu hỏi nữa(không phải câu đố). Mình không biết câu hỏi này xếp vào mức độ nào nữa, mong các bạn mới học cũng như các thầy tham gia để những người mới như em được học hỏi!

Câu hỏi 4. Trong bảng dữ liệu có nhiều dòng trùng nhau, yêu cầu chỉ dữ lại trong bảng đó 1 dòng thôi, những dòng trùng thì bị xóa hết.
+ TH1: Dữ lại bảng gốc, lọc kết quả ra 1 bảng mới(ở cùng sheet)
+ Trường hợp 2(khó hơn):Kết quả lọc nằm luôn trên bảng dưc liệu gốc.

P/S: Trường hợp 1 có thể bỏ qua, vì rất dễ. Các bạn làm trường hợp 2 thôi nhé!
 

File đính kèm

  • Cauhoi4_Dic.xls
    15.5 KB · Đọc: 36
Lần chỉnh sửa cuối:
Upvote 0
Quả thật, với topic này mình đã gặt hái được 1 số thành công nho nhỏ, cụ thể bản thân đã tự làm được 1 số bài tập mà mình đã tự ra đề, làm được 1 bài tập của thầy ptm0412 trong topic "Tổng quan về scripting..." của tác giả Kyo mà không nhìn đáp án. Chỉ đói chiếu với đáp án sau khi làm xong và kết quả ra chính xác luôn! Chính vì vậy hôm nay mình mạnh dạn đưa ra 1 câu hỏi nữa(không phải câu đố). Mình không biết câu hỏi này xếp vào mức độ nào nữa, mong các bạn mới học cũng như các thầy tham gia để những người mới như em được học hỏi!

Câu hỏi 4. Trong bảng dữ liệu có nhiều dòng trùng nhau, yêu cầu chỉ dữ lại trong bảng đó 1 dòng thôi, những dòng trùng thì bị xóa hết.
+ TH1: Dữ lại bảng gốc, lọc kết quả ra 1 bảng mới(ở cùng sheet)
+ Trường hợp 2(khó hơn):Kết quả lọc nằm luôn trên bảng dưc liệu gốc.

P/S: Trường hợp 1 có thể bỏ qua, vì rất dễ. Các bạn làm trường hợp 2 thôi nhé!

cho mình hỏi thêm , Kết quả lọc nằm trên bảng dữ liệu gốc nghĩa là :
** Xóa bảng dữ liệu cũ đi, chèn bảng kết quả mới không chứa dữ liệu trùng nhau ?
**Hay là tô màu (hight light) những dòng dữ liệu trùng nhau :
 
Upvote 0
Câu hỏi 4. Trong bảng dữ liệu có nhiều dòng trùng nhau, yêu cầu chỉ dữ lại trong bảng đó 1 dòng thôi, những dòng trùng thì bị xóa hết.
+ TH1: Dữ lại bảng gốc, lọc kết quả ra 1 bảng mới(ở cùng sheet)
+ Trường hợp 2(khó hơn):Kết quả lọc nằm luôn trên bảng dưc liệu gốc.

P/S: Trường hợp 1 có thể bỏ qua, vì rất dễ. Các bạn làm trường hợp 2 thôi nhé!

Từ chỗ đỏ đỏ suy ra ý bạn là "bảng mới" và "bảng gốc" là ám chỉ vùng đặt kết quả và vùng dữ liệu nguồn. Tức ở phần 1 thì kết quả đập xuống 1 vùng khác <> vùng dữ liệu còn ở phần 2 thì kết quả đập xuống vùng của bảng gốc. Vậy thì cứ tính kết quả đi - bạn nói là rất dễ thì đã làm được rồi. Trước khi đập kết quả xuống sheet thì XÓA dữ liệu của vùng gốc đi. Cũng rất dễ đúng không?
---------------
Dic hay gì chăng nữa nó chỉ là CÔNG CỤ để thực hiện một "việc" nào đó. Muốn làm được bài Toán bất kỳ thì bước 0 là bước phải viết ra được trên giấy nháp (hoặc trong đầu) các bước cần thực hiện để đi tới kết quả. NGgười ta gọi đó là thuật toán. Không làm được bước 0 thì không làm được bài Toán. Sau khi có được các bước cần làm hay nói nôm na là các việc thì mới là bước chọn CÔNG CỤ để thực hiện việc. Cũng cùng 1 việc có thể dùng những CÔNG CỤ khác nhau. Có khác thì chỉ ở chỗ công cụ này trong trường hợp này ưu thế hơn công cụ kia. Để giết con gà thì công cụ dao gọt hoa quả ưu thế hơn, thuận tiện hơn dao mổ trâu. Nhưng khi cần mổ bò thì dao mổ trâu lại ưu thế hơn dao gọt hoa quả.
Dic chỉ có vài thuộc tính, phương thức. Để biết được những thuộc tính đó có ý nghĩa gì, các phương thức cụ thể làm gì thì chỉ cần đọc help. Để đi từ biết tới hiểu thì cần mục sở thị, tức test vài code. Toàn bộ các việc trên cứ cho là lấy mất 1 ngày. Cái khó và cái học mãi theo năm tháng là luyện tư duy cần thiết để có thể "đẻ" ra một thuật toán.
 
Lần chỉnh sửa cuối:
Upvote 0
cho mình hỏi thêm , Kết quả lọc nằm trên bảng dữ liệu gốc nghĩa là :
** Xóa bảng dữ liệu cũ đi, chèn bảng kết quả mới không chứa dữ liệu trùng nhau ?
**Hay là tô màu (hight light) những dòng dữ liệu trùng nhau :
Tức là xóa các dòng trùng đi, dòng tiêu đề vẫn giữ nguyên.
 
Upvote 0
Từ chỗ đỏ đỏ suy ra ý bạn là "bảng mới" và "bảng gốc" là ám chỉ vùng đặt kết quả và vùng dữ liệu nguồn. Tức ở phần 1 thì kết quả đập xuống 1 vùng khác <> vùng dữ liệu còn ở phần 2 thì kết quả đập xuống vùng của bảng gốc. Vậy thì cứ tính kết quả đi - bạn nói là rất dễ thì đã làm được rồi. Trước khi đập kết quả xuống sheet thì XÓA dữ liệu của vùng gốc đi. Cũng rất dễ đúng không?
Đúng là quá tuyệt vời. Đúng là chỉ cần có ý tưởng là ok. Em cảm ơn thầy!
 
Upvote 0
Quả thật, với topic này mình đã gặt hái được 1 số thành công nho nhỏ, cụ thể bản thân đã tự làm được 1 số bài tập mà mình đã tự ra đề, làm được 1 bài tập của thầy ptm0412 trong topic "Tổng quan về scripting..." của tác giả Kyo mà không nhìn đáp án. Chỉ đói chiếu với đáp án sau khi làm xong và kết quả ra chính xác luôn! Chính vì vậy hôm nay mình mạnh dạn đưa ra 1 câu hỏi nữa(không phải câu đố). Mình không biết câu hỏi này xếp vào mức độ nào nữa, mong các bạn mới học cũng như các thầy tham gia để những người mới như em được học hỏi!

Câu hỏi 4. Trong bảng dữ liệu có nhiều dòng trùng nhau, yêu cầu chỉ dữ lại trong bảng đó 1 dòng thôi, những dòng trùng thì bị xóa hết.
+ TH1: Dữ lại bảng gốc, lọc kết quả ra 1 bảng mới(ở cùng sheet)
+ Trường hợp 2(khó hơn):Kết quả lọc nằm luôn trên bảng dưc liệu gốc.

P/S: Trường hợp 1 có thể bỏ qua, vì rất dễ. Các bạn làm trường hợp 2 thôi nhé!
Nếu bạn muốn vọc code VBA thì bạn nên "thử" với bài này sẽ hay hơn.
http://www.giaiphapexcel.com/forum/...trị-(dạng-chữ)-giống-nhau&p=583439#post583439
Dùng VBA cho tất cả các cột kết quả trong sheet SUMMARY luôn đi.
 
Upvote 0
Kiểm ta kiến thức về Dictionary
Cột A (từ A2) - Tên các thành phố, cột B (từ B2) - tên người. Cột C (từ C2) - kết quả. Nếu Azyz = Ha noi và Bxyz = "he" thì có nghĩa là anh/ chị "he" đã có lần đi du lịch Ha noi.
Hãy liệt kê (từ C2) những thành phố chưa từng đến bởi các vị (các bởi không phân biệt Nam béo hay Nam lác. Cứ Nam là coi là 1) có tên nhập vào C1.
Ví dụ với dữ liệu giả lập
Hà nội, Nga
Hà nội, Tuấn
Huế, Nga
Đà nẵng, Bình
Hà nội, Bình
Huế, Tuấn
Hải Phòng, Bình

C1 = Nga --> C2 = Đà nẵng, C3 = Hải Phòng
Các bạn cùng tham gia bài tập của thầy Siwtom đi.
 
Upvote 0
Chỉ xóa các dòng trùng trong bảng dữ liệu (không ảnh hưởng đến các cột ngoài vùng dữ liệu) và nếu dữ liệu không có ô nào rỗng (blank) thì có thể dùng code này:
[gpecode=vb]
Sub XoaDong()
Dim Rng As Range, i As Long, Dic As Object, k As Long
Set Rng = Sheet1.Range("A2:F21")
Set Dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
For i = 1 To Rng.Rows.Count
If Not Dic.Exists(Rng(i, 2).Value) Then
k = k + 1
Dic.Add Rng(i, 2).Value, k
Rng(i, 1) = k
Else
Rng(i, 1).Resize(, 6) = Empty
End If
Next i
If k < Rng.Rows.Count Then
Rng.SpecialCells(4).Delete Shift:=xlUp
End If
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
[/gpecode]
Còn nếu xóa nguyên dòng thì thì chạy vòng lặp từng Cells cột B và EntireRow.Delete.
 

File đính kèm

  • Cauhoi4_Dic.xls
    37.5 KB · Đọc: 36
Lần chỉnh sửa cuối:
Upvote 0
Dạ, đúng là em chưa lường trước được vấn đề này! Vậy bài toán này em nghĩ nó lại khó nên nhiều rồi!

thử vận may với code này xem thế nào !
Mã:
Sub delete_Duplicate()
    Dim tmpArr, tmp, strRange$
    Dim i&
    On Error Resume Next
        tmpArr = Range("A2:F21")
        With CreateObject("scripting.dictionary")
            .CompareMode = 1
            For i = 1 To UBound(tmpArr, 1)
                tmp = tmpArr(i, 3)
                If Len(tmp) Then
                    If Not .exists(tmp) Then
                    .Add tmp
                    Else
                        strRange = strRange & "A" & i + 1 & ":F" & i + 1 & ","
                    End If
                End If
            Next
        End With
        Range(Left(strRange, Len(strRange) - 1)).Delete xlShiftUp
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
thử vận may với code này xem thế nào !
Mã:
Sub delete_Duplicate()
    Dim tmpArr, tmp, strRange$
    Dim i&
    On Error Resume Next
        tmpArr = Range("A2:F21")
        With CreateObject("scripting.dictionary")
            .CompareMode = 1
            For i = 1 To UBound(tmpArr, 1)
                tmp = tmpArr(i, 3)
                If Len(tmp) Then
                    If Not .exists(tmp) Then
                    .Add tmp
                    Else
                        strRange = strRange & "A" & i + 1 & ":F" & i + 1 & ","
                    End If
                End If
            Next
        End With
        Range(Left(strRange, Len(strRange) - 1)).Delete xlShiftUp
End Sub
Quá tuyệt vời! Tuyệt vời hơn là vẫn giữ được cả công thức!
 
Upvote 0
Chỉ xóa các dòng trùng trong bảng dữ liệu (không ảnh hưởng đến các cột ngoài vùng dữ liệu) và nếu dữ liệu không có ô nào rỗng (blank) thì có thể dùng code này:
[gpecode=vb]
Sub XoaDong()
Dim Rng As Range, i As Long, Dic As Object, k As Long
Set Rng = Sheet1.Range("A2:F21")
Set Dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
For i = 1 To Rng.Rows.Count
If Not Dic.Exists(Rng(i, 2).Value) Then
k = k + 1
Dic.Add Rng(i, 2).Value, k
Rng(i, 1) = k
Else
Rng(i, 1).Resize(, 6) = Empty
End If
Next i
If k < Rng.Rows.Count Then
Rng.SpecialCells(4).Delete Shift:=xlUp
End If
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Còn nếu xóa nguyên dòng thì thì chạy vòng lặp từng Cells cột B và EntireRow.Delete.
code của leonguyenz cũng tuyệt vời, học thêm được rất nhiều điều từ anh về "Dic". Cảm ơn anh!
 
Upvote 0
Sao các bạn không kết hợp Dic và mảng nhỉ?
 
Upvote 0
Chỉ xóa các dòng trùng trong bảng dữ liệu (không ảnh hưởng đến các cột ngoài vùng dữ liệu) và nếu dữ liệu không có ô nào rỗng (blank) thì có thể dùng code này:
[gpecode=vb]
Sub XoaDong()
Dim Rng As Range, i As Long, Dic As Object, k As Long
Set Rng = Sheet1.Range("A2:F21")
Set Dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
For i = 1 To Rng.Rows.Count
If Not Dic.Exists(Rng(i, 2).Value) Then
k = k + 1
Dic.Add Rng(i, 2).Value, k
Rng(i, 1) = k
Else
Rng(i, 1).Resize(, 6) = Empty
End If
Next i
If k < Rng.Rows.Count Then
Rng.SpecialCells(4).Delete Shift:=xlUp
End If
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
[/gpecode]
Còn nếu xóa nguyên dòng thì thì chạy vòng lặp từng Cells cột B và EntireRow.Delete.

Bài toán này anh viết chỉ có 2 dòng code thôi, cần chi mà dùng đao to búa lớn thế.
 
Upvote 0
Quá tuyệt vời! Tuyệt vời hơn là vẫn giữ được cả công thức!
???
chia sẻ với bạn cách học Dic của mình :
nếu yêu cầu bài toán có yếu tố trùng lặp ,hay duy nhất thì ta nên nghĩ đến dictionary , việc sử dụng dictionary thông thường theo trình tự sau :
+ xác đinh yếu tố duy nhất,hay tạo ra yếu tố duy nhất không trùng lặp
+ Sử dụng công cụ scripting.dictionary ta sẽ biết được : số lượng + vị trí +.... của yếu tố duy nhất hay trùng lặp
+ Dựa vào các kết quả mà Dic cung cấp để xây dựng thuật toán ,hướng giải quyết yêu cầu ban đầu
 
Upvote 0
Web KT
Back
Top Bottom