Tổng Quan Về Scripting.Dictionary | Giải Pháp Excel

Giải Pháp Excel
  • Trang chủ Có gì mới Hoạt động gần nhất Tác giả
  • Diễn đàn Tìm bài viết mới Tìm theo chuyên mục
  • Video New Video về Excel Video về tin học khác Tin tức về tin học chung
  • Thông tin mới Featured content Tìm bài mới Tài Nguyên Mới Hoạt động gần nhất
  • Tài nguyên Đánh giá mới nhất Tìm tài nguyên
  • Facebook
  • Đóng góp
Đăng nhập Đăng Ký Có gì mới? Tìm kiếm

Tìm kiếm

Mọi nơi Đề tài Diễn đàn này Đề tài này Chỉ tìm trong tiêu đề Note Bởi: Tìm kiếm Tìm nâng cao…
  • Tìm bài viết mới
  • Tìm theo chuyên mục
Menu Đăng nhập Đăng Ký Install the app Install How to install the app on iOS

Follow along with the video below to see how to install our site as a web app on your home screen.

Note: This feature may not be available in some browsers.

  • Khách ơi! GPE thông tin đến bạn ấn phẩm "lập trình VBA trong Excel": - Phần cơ bản - Phần Nâng Cao - VBA trong Excel - Cải thiện và tăng tốc
  • Trang chủ
  • Diễn đàn
  • Lập Trình với Excel
You are using an out of date browser. It may not display this or other websites correctly.You should upgrade or use an alternative browser. Tổng quan về Scripting.Dictionary (1 người xem)
  • Thread starter Thread starter kyo
  • Ngày gửi Ngày gửi 5/2/12
Liên hệ QC

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

Đang trực tuyến: 2 (Thành viên: 0, Khách: 2) Status Không mở trả lời sau này. kyo

kyo

Nguyễn Khắc Duy
Thành viên danh dự Tham gia 4/6/06 Bài viết 901 Được thích 2,717 Với những ai yêu thích Excel nói chung và yêu thích VBA nói riêng thì chắc hẳn cũng đã biết qua các khái niệm về mảng, về công thức điều kiện, vòng lặp,..., những thứ rất quen thuộc mà gần như là sử dụng thường xuyên trong từng bài toán lập trình. Tuy nhiên, có lẽ sẽ rất ít người biết về Dictionary, một công cụ đầy sức mạnh xuất hiện trên VBA từ rất lâu rồi. Sẽ có nhiều người thắc mắc khi thấy các “cao thủ” trên GPE trổ tài sử dụng Dic và không hiểu gì vì những điều mới lạ vừa nhìn thấy cũng như rất ít tư liệu tiếng Việt về Dic trên GPE nói riêng và trên Internet nói chung. Do đó, kyo viết lại bài này dựa trên tư liệu tiếng Anh của Experts-exchange và trên GPE với mong muốn đóng góp ít nhiều, giúp cho các thành viên mới có được cái nhìn tổng quan hơn về Dictionary. Lẽ dĩ nhiên sẽ còn rất nhiều thiếu sót trong bài, mong được mọi người góp ý và sửa chữa. I. Dictionary là gì? 1. Định nghĩa Là một phần trong thư viện Microsoft Scripting Runtime (scrrun.dll), Dictonary class là một công cụ đầy sức mạnh và linh hoạt. Nó cho phép người sử dụng tạo một object với số lượng item tùy ý,và mỗi item được nhận dạng dựa trên một key duy nhất. Dic có thể nhận các dữ liệu thuộc các kiểu dữ liệu khác nhau mà thường thấy là kiểu chuỗi (string), số (integer, long,…) hay thậm chí là một sự kết hợp giữa cả hai kiểu dữ liệu. 2. Ưu điểm của Dictionary - Có thể thêm vào số lượng item tùy ý với những kiểu dữ liệu khác nhau. - Các item và key của Dictionary rất dễ truy xuất, sửa chữa và bổ sung. - Dictionary cho phép bạn xóa tất cả các item tồn tại trong Dic mà không cần phải phá hủy chính nó. - Và cuối cùng, các item chỉ có thể được gọi duy nhất bằng cách là thông qua một key mà key đó là bắt buộc và là duy nhất (không thể có 2 key trùng nhau). Điều này tạo thuận lợi cho các bài toán trích lọc danh sách duy nhất và đây cũng chính là ưu điểm lớn nhất của Dictionary. 3. Cách sử dụng Dictionary 1/ Cách khai báo​​Vì Dictionary không phải là một phần của thư viện VBA, do đó, để sử dụng nó, chúng ta cần phải khai báo. Bạn có thể khai báo bằng cả hai cách sau: Cách 1: Để sử dụng cách 1, trước tiên bạn phải vào Tools -> References và lựa chọn Microsoft Scripting Runtime từ trên danh sách để cài đặt -> nhấn OK. 224336​ Sau đó, gõ dòng lệnh: PHP: Sao chép. Dim MyDictionary As Scripting.Dictionary Set MyDictionary = New Scripting.Dictionary Cách 2: Gõ dòng lệnh: PHP: Sao chép. Dim MyDictionary As Object Set MyDictionary = CreateObject("Scripting.Dictionary") Cách 1 sẽ cho tốc độ nhanh hơn cách 2. Tuy nhiên, cách 2 lại thuận tiện hơn cách 1 khi chia sẻ file cho người sử dụng khác, do với máy tính khác nhau sẽ có nhiều người sử dụng các phiên bản khác nhau. Cách 1 chỉ phù hợp khi chính bạn sử dụng, còn cách 2 phù hợp hơn cho việc chia sẻ. 2/ Các phương thức và thuộc tính: ​​a. Các phương thức:​​​- Phương thức Add: Phương thức Add dùng để thêm item vào Dictionary. PHP: Sao chép. MyDictionary.Add Key, Item Item có nhận dữ liệu thuộc bất kì kiểu dữ liệu gì. Key cũng nhận như item nhưng ngoại trừ kiểu dữ liệu mảng (array). Key phải là duy nhất, nếu bạn thêm item với cùng một key, bạn sẽ gặp lỗi. - Phương thức Exists: Phương thức Exists sẽ kiểm tra xem Key có tồn tại hay không? Nếu Key tồn tại, kết quả sẽ là True và không tồn tại thì kết quả sẽ là False. - Phương thức Items: Phương thức Items sẽ trả về giá trị mảng một chiều mà phần tử đầu tiên là phần tử 0 (dù cho bạn có sử dụng Option Base 1). PHP: Sao chép. MyArray = MyDictionary.Items MsgBox Join(MyArray, ";") - Phương thức Keys: Phương thức Keys sẽ trả về giá trị mảng một chiều mà phần tử đầu tiên là phần tử 0 (dù cho bạn có sử dụng Option Base 1). PHP: Sao chép. MyArray = MyDictionary.Keys MsgBox Join(MyArray, ";") - Phương thức Remove: Phương thức Remove sẽ xóa một item thông qua một Key. Nếu Key không tồn tại, bạn sẽ gặp lỗi. PHP: Sao chép. MyDictionary.Remove "SomeKey" - Phương thức RemoveAll: Phương thức RemoveAll sẽ xóa toán bộ những gì có trong Dictionary (nhưng không xóa chính nó). PHP: Sao chép. MyDictionary.RemoveAll b. Các thuộc tính:​​​- Thuộc tính CompareMode: Dictionary có thể phân biệt dạng chữ được hay không phụ thuộc vào thuộc tính CompareMode. Giá trị mặc định của thuộc tính là 0 (vbBinaryCompare) giúp phân biệt chữ hoa chữ thường trong Key, còn giá trị 1 (vbTextCompare) thì không phân biệt. PHP: Sao chép. MyDictionary.CompareMode = vbBinaryCompare ‘phân biệt MyDictionary.CompareMode = vbTextCompare 'không phân biệt Ví dụ dưới đây sẽ không gây ra lỗi, nhưng nếu CompareMode = 1 thì chắc chắn bạn sẽ gặp lỗi vì “gpe” và “GPE” là giống nhau. PHP: Sao chép. With MyDictionary .CompareMode = vbBinaryCompare .Add "gpe", "lower" .Add "GPE", "UPPER" End With - Thuộc tính Count: Thuộc tính Count sẽ trả về giá trị số lượng item có trong Dictionary. Nếu không có item trong Dic, thuộc tính này sẽ trả về giá trị 0. - Thuộc tính Item: Thuộc tính Item giúp truy xuất hoặc thiết lập giá trị cho một Key nào đó. PHP: Sao chép. With MyDictionary .Item("SomeKey") = "gpe" MsgBox "Giá trị của SomeKey là " & .Item("SomeKey") End With Nếu bạn sử dụng thuộc tính Item để đưa một item vào một Key không tồn tại, Dictionary sẽ thêm mới Key không tồn tại đó, đồng thời cũng thêm item vào Key đó luôn. Cũng vậy, nếu bạn truy xuất một item qua một Key không tồn tại, Dictionary sẽ thêm một item rỗng vào chính Key đó. Do đó, sử dụng thuộc tính Item với một Key không tồn tại sẽ không gây ra lỗi. - Thuộc tính Key: Thuộc tính Key được dùng để thay đổi giá trị của một Key có sẵn. Tuy nhiên, giá trị Key mới phải là giá trị duy nhất trong Dictionary cũng như giá trị Key mà bạn muốn thay đổi cũng phải tồn tại trong Dictionary. Nếu một trong hai điều kiện trên không đúng, chắc chắn lỗi sẽ xảy ra. PHP: Sao chép. MyDictionary.Key("SomeKey") = "SomeOtherKey" 3/ Một số lỗi thường gặp​​a. vbBinaryCompare hay vbTextCompare ​​​Mặc định, CompareMode = vbBinaryCompare, tức là “key” ”KEY”. Còn trong trường hợp ngược lại, “key” = “KEY”. Tuy nhiên, cũng chính từ điều này mà đã nảy sinh ra một số rắc rối không cần thiết. Vẫn có nhiều người lẫn lộn giữa vbBinaryCompare và vbTextCompare dẫn đến kết quả không ra như ý muốn. Do đó, bạn cần phải chú ý để thiết lập cho phù hợp. b. Kiểu dữ liệu của Key​​​ PHP: Sao chép. With MyDictionary .Add 1, "number" .Item("1") = "text" End With Dòng số 2, kiểu dữ liệu của Key là dạng số trong khi dòng số 3, kiểu dữ liệu của Key là dạng chuỗi dẫn đến hai Key của ví dụ trên là khác nhau. Muốn cho cả hai Key đó giống nhau cũng như là để gán lại item cho Key, tức chỉ là kiểu chuỗi chẳng hạn, bạn phải sử dụng câu lệnh .Add CStr(1), “number” thay cho dòng số 2 ở bên trên. Sắp xếp theo thời gian sắp xếp theo bầu chọn kyo

kyo

Nguyễn Khắc Duy
Thành viên danh dự Tham gia 4/6/06 Bài viết 901 Được thích 2,717 4/ Ví dụ tham khảo ​​Trích từ bài tập của chú Mỹ (ptm0412) trong chuyên đề bài tập VBA. Đây là một dạng khá thông dụng dùng để sử dụng Dic vì mục đích của nó chính là trích lọc ra giá trị duy nhất, tức giá trị “Nhân viên” dùng để biết được nhân viên đó đem lại doanh thu là bao nhiêu. 224339 Bài giải 224341 ​ PHP: Sao chép. Sub Cau1() Dim Dic1 As Object, iRow As Long, i As Long Dim Arr() As Variant, TmpArr As Variant With Sheets("Cau1") .Range("E4:H10").ClearContents Set Dic1 = CreateObject("Scripting.Dictionary") TmpArr = Sheet1.Range("b2:g21").Value ReDim Arr(1 To UBound(TmpArr, 1), 1 To 6) For iRow = 1 To UBound(TmpArr, 1) If Not IsEmpty(TmpArr(iRow, 2)) And Not Dic1.exists(TmpArr(iRow, 2)) Then i = i + 1 Dic1.Add TmpArr(iRow, 2), i Arr(i, 1) = TmpArr(iRow, 1) Arr(i, 2) = TmpArr(iRow, 2) If TmpArr(iRow, 3) <> "" Then Arr(i, 3) = TmpArr(iRow, 6) Else Arr(i, 4) = TmpArr(iRow, 6) End If Else If TmpArr(iRow, 3) <> "" Then Arr(Dic1.Item(TmpArr(iRow, 2)), 3) = Arr(Dic1.Item(TmpArr(iRow, 2)), 3) + TmpArr(iRow, 6) Else Arr(Dic1.Item(TmpArr(iRow, 2)), 4) = Arr(Dic1.Item(TmpArr(iRow, 2)), 4) + TmpArr(iRow, 6) End If End If Next iRow .Range("e4").Resize(i, 4).Value = Arr End With End Sub II. Một số ứng dụng trên GPE 1. Tạo dãy số ngẫu nhiên không trùng (tác giả ndu96081631) Cú pháp hàm: =UniqueRandom(số nhỏ, số lớn, bao nhiêu số cần tạo). Có 2 cách sử dụng, hoặc là dùng trực tiếp trên cell, hoặc là sử dụng VBA. Bạn có thể tham khảo thêm tại đường link: http://www.giaiphapexcel.com/forum/showthread.php?27286-Tạo-dãy-số-ngẫu-nhiên-không-trùng 224342​ PHP: Sao chép. Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long) 'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9 On Error Resume Next If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1 With CreateObject("Scripting.Dictionary") Do .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, "" Loop Until .Count = Amount UniqueRandomNum = WorksheetFunction.Transpose(.Keys) End With End Function 2. Lọc dữ liệu duy nhất Ví dụ ở trên là một minh chứng cho ứng dụng này, bạn có thể đọc ví dụ trên để hiểu rõ hơn, hoặc bạn cũng có thể search trên GPE để tham khảo thêm về cách lọc dữ liệu với độ phức tạp cao hơn. Chẳng hạn dưới đây là một số đường link: http://www.giaiphapexcel.com/forum/showthread.php?37895-Lấy-DM-duy-nhất-theo-2-cột-Scripting-Dictionary!​http://www.giaiphapexcel.com/forum/showthread.php?39121-dò-tìm-mã-đơn-hàng-và-mã-hàng-duy-nhất​http://www.giaiphapexcel.com/forum/showthread.php?42791-Nhờ-hướng-dẫn-sử-dụng-Dictionary-Object​http://www.giaiphapexcel.com/forum/showthread.php?53572-Thắc-mắc-về-hàm-UDF-UniqueList​​​3. Ứng dụng game “Quay số trúng thưởng” (tác giả minhthien321) 224343 224344​ Các bạn có thể download file cũng như nghiên cứu các câu lệnh tại đường link này: http://www.giaiphapexcel.com/forum/showthread.php?51196-Tặng-các-bạn-file-QUAY-SỐ-TRÚNG-THƯỞNG-nhân-dịp-SN-GiaiphapExcel-Com-lần-5 4. Loại bỏ kí tự trùng (tác giả ndu96081631) Cú pháp hàm: =StrUnique(chuỗi). Có 2 cách sử dụng, hoặc là dùng trực tiếp trên cell, hoặc là sử dụng VBA. Bạn có thể tham khảo thêm tại đường link: http://www.giaiphapexcel.com/forum/showthread.php?33739-Cách-loại-bỏ-những-kí-tự-trùng-nhau 224345​ PHP: Sao chép. Function StrUnique(Text As String) As String Dim i As Long, Temp On Error Resume Next If InStr(Text, ",") Then Temp = Split(Text, ",") With CreateObject("Scripting.Dictionary") For i = 0 To UBound(Temp) .Add Temp(i), "" Next i StrUnique = Join(.Keys, ",") End With Else StrUnique = Left(Text, 1) For i = 1 To Len(Text) If InStr(StrUnique, Mid(Text, i, 1)) = 0 Then StrUnique = StrUnique & Mid(Text, i, 1) Next i End If End Function Trên đây chỉ là một số ứng dụng của Dictionary (lẽ dĩ nhiên ứng dụng đó phải có yếu tố giá trị duy nhất). Thực sự thì Dictionary vẫn còn rất nhiều ứng dụng trên nhiều lĩnh vực, tất cả đều phụ thuộc vào nhu cầu cũng như khả năng sáng tạo của chính bạn. “Hãy tìm mọi cách để sử dụng item. Không chỉ ghi item đồng thời với key mà còn đọc item để sử dụng cho nhiều mục đích khác nhau. Ngoài ra, có thể sửa item để sử dụng cho lần sau, để sử dụng nhiều lần.” Và chính lời khuyên trên của chú Mỹ - “lão chết tiệt” ptm0412 cũng đã kết thúc bài viết tổng quan về Dictionary. Hy vọng bài viết tổng quan về Dictionary này sẽ giúp bạn có thêm cái nhìn tổng quan hơn cũng như giúp bạn có thêm “vũ khí” và làm ra được nhiều chương trình ứng dụng phù hợp với chính mình. Upvote 0 ptm0412

ptm0412

Bad Excel Member
Thành viên BQT Administrator Tham gia 4/11/07 Bài viết 14,865 Được thích 37,604 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Consultant
kyo đã viết: Nếu bạn sử dụng thuộc tính Item để đưa một item vào một Key không tồn tại, Dictionary sẽ thêm mới Key không tồn tại đó, đồng thời cũng thêm item vào Key đó luôn. Cũng vậy, nếu bạn truy xuất một item qua một Key không tồn tại, Dictionary sẽ thêm một item rỗng vào chính Key đó. Do đó, sử dụng thuộc tính Item với một Key không tồn tại sẽ không gây ra lỗi. Nhấp chuột vào đây để mở rộng...
Code để kiểm tra tính xác thực của câu trên: PHP: Sao chép. Sub test() Dim MyDict As Object, VarTest Set MyDict = CreateObject("Scripting.Dictionary") With MyDict .Item("GPE") = "Excellent" '(Gán Item cho 1 key chưa tồn tại)' VarTest = .Item("Cheettit") '(Truy xuất Item của 1 key không tồn tại)' MsgBox .Count Sheet1.[A1].Resize(.Count, 1) = Application.Transpose(.keys) Sheet1.[B1].Resize(.Count, 1) = Application.Transpose(.items) End With End Sub Kết quả: - Mặc dù không có câu lệnh Add nào để tạo key, nhưng MsgBox .Count cho kết quả là 2 - Key thứ nhất là "GPE", Item của nó là "Excellent" - Key thứ 2 là "Cheettit" và Item của nó là rỗng. | A​ | B​ | 1​ |GPE|Excellent| 2​ |Cheettit| | Chỉnh sửa lần cuối bởi điều hành viên: 19/5/13 Upvote 0 ptm0412

ptm0412

Bad Excel Member
Thành viên BQT Administrator Tham gia 4/11/07 Bài viết 14,865 Được thích 37,604 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Consultant
kyo đã viết: “Hãy tìm mọi cách để sử dụng item. Không chỉ ghi item đồng thời với key mà còn đọc item để sử dụng cho nhiều mục đích khác nhau. Ngoài ra, có thể sửa item để sử dụng cho lần sau, để sử dụng nhiều lần.” Và chính lời khuyên trên của chú Mỹ - “lão chết tiệt” ptm0412 cũng đã kết thúc bài viết tổng quan về Dictionary. Hy vọng bài viết tổng quan về Dictionary này sẽ giúp bạn có thêm cái nhìn tổng quan hơn cũng như giúp bạn có thêm “vũ khí” và làm ra được nhiều chương trình ứng dụng phù hợp với chính mình. Nhấp chuột vào đây để mở rộng...
Đây là 1 thí dụ về việc tận dụng Item của Dictionary, sử dụng và sửa để sử dụng nhiều lần: Trích: Hôm nay ta không chỉ ghi Item, đọc Item để xài, mà còn sửa Item để xài lại, sử dụng Item để đếm bao nhiêu lần xuất hiện của mỗi mã trùng. Nhưng thay vì đếm bắt đầu từ 1, ta đếm từ 65 để dùng nó cho hàm Chr(), vì Chr(65) = "A". PHP: Sao chép. Sub FinalCode() Dim SArr, RArr Dim i As Long, n As Long, EndR As Long Application.ScreenUpdating = False t = Timer EndR = [D65000].End(xlUp).Row SArr = Range("D2:D" & EndR).Value ReDim RArr(1 To EndR - 1, 1 To 1) With CreateObject("Scripting.dictionary") For i = 1 To EndR - 1 If Not .Exists(SArr(i, 1)) Then .Add SArr(i, 1), 65 Else .Item(SArr(i, 1)) = .Item(SArr(i, 1)) + 1 End If n = .Item(SArr(i, 1)) RArr(i, 1) = (SArr(i, 1)) & Chr(n) Next End With Range("E2:E" & EndR) = RArr Application.ScreenUpdating = True [F1] = Timer - t test End Sub Xem tại đây: http://www.giaiphapexcel.com/forum/...-Việt-để-làm-mã-nhân-viên&p=370270#post370270 Upvote 0 ptm0412

ptm0412

Bad Excel Member
Thành viên BQT Administrator Tham gia 4/11/07 Bài viết 14,865 Được thích 37,604 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Consultant
kyo đã viết: Item có thể nhận dữ liệu thuộc bất kì kiểu dữ liệu gì. Key cũng có thể nhận kiểu dữ liệu như item nhưng ngoại trừ kiểu dữ liệu mảng (array). Nhấp chuột vào đây để mở rộng...
Nghĩa là Item có thể nhận giá trị mảng. Lấy 1 bài trên GPE đã sử dụng Dictionary, http://www.giaiphapexcel.com/forum/showthread.php?59477-Lọc-dữ-liệu-theo-nhóm-bằng-VBA&p=368852#post368852, thử làm lại nhưng gán giá trị mảng cho Item: Bài toán là liệt kê các lệnh điều động xe theo thứ tự từ trái qua phải cho mỗi xe. Giả định mỗi xe có nhiều chuyến, mỗi chuyến chỉ có 1 lệnh. File trong bài viết đó dùng 1 mảng kết quả để lấy kết quả từ dữ liệu nguồn căn cứ vào danh sách duy nhất lọc bằng Dictionary. Bây giờ ta bỏ mảng kết quả, chỉ dùng Dictionary với Item là mảng. Tốc độ có thể chậm hơn, nhưng là thử nghiệm để khẳng định bài viết của Kyo. PHP: Sao chép. Sub DicItemAsArray() Dim SArr, RArr, TmpArr, Dic1, MaxCols As Long Dim i As Long, s As Long, EndR As Long, n As Long, Tmp As Long t = Timer Set Dic1 = CreateObject("Scripting.Dictionary") With Dic1 EndR = Sheet2.[b65000].End(xlUp).Row SArr = Sheet2.Range("A2:C" & EndR).Value For i = 1 To EndR - 1 If Not .Exists(SArr(i, 2)) Then 'Nếu chưa tồn tại số xe' s = s + 1 .Add SArr(i, 2), Array(SArr(i, 1)) 'Gán số xe vào Dictionary với Item là 1 mảng 1 phần tử' MaxCols = 1 Else 'Nếu đã có số xe' TmpArr = .Item(SArr(i, 2)) Tmp = UBound(.Item(SArr(i, 2))) ReDim Preserve TmpArr(Tmp + 1) 'Tăng kích thước mảng của Item lên 1' TmpArr(Tmp + 1) = SArr(i, 1) 'Gán thêm 1 phần tử vào mảng Item' .Item(SArr(i, 2)) = TmpArr If MaxCols < Tmp + 1 Then MaxCols = Tmp + 1 End If Next Sheet1.[A4].Resize(s, 1) = Application.Transpose(.keys) 'Gán keys của Dictionary xuống sheet' RArr = Sheet1.[A4].Resize(s, 1).Value 'Gán từng mảng Item xuống sheet ngang với key tương ứng' For i = 1 To .Count Sheet1.Range("B" & i + 3).Resize(1, UBound(.Item(RArr(i, 1))) + 1) = .Item(RArr(i, 1)) Next End With Sheet1.[A1] = Timer - t Sheet1.[A2] = MaxCols End Sub Trong file kèm theo có cả 2 cách để so sánh. Cách cũ nhanh gấp 4 lần, nhưng cách mới chỉ để thử nghiệm Item là 1 giá trị mảng.

File đính kèm

  • DicItemArray.rar DicItemArray.rar 162.5 KB · Đọc: 862
Lần chỉnh sửa cuối: 5/2/12 Upvote 0 ptm0412

ptm0412

Bad Excel Member
Thành viên BQT Administrator Tham gia 4/11/07 Bài viết 14,865 Được thích 37,604 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Consultant Thí dụ 2 về tạo Dictionary với Item là mảng Cũng file trên nhưng làm ngược từ kết quả ra dữ liệu ban đầu: PHP: Sao chép. Sub ItemArray2() Dim EndR As Long, nR As Long, iCount As Long Dim Dic1, RArr, SArr t = Timer Set Dic1 = CreateObject("Scripting.Dictionary") With Sheet1 EndR = .[A65000].End(xlUp).Row For i = 4 To EndR Dic1.Add .Cells(i, 1).Value, .Cells(i, 2).Resize(1, 25).Value Next SArr = .[A4].Resize(Dic1.Count, 1).Value End With ReDim RArr(1 To Dic1.Count * 25, 1 To 2) For i = 1 To Dic1.Count For j = 1 To 25 If Dic1.Item(SArr(i, 1))(1, j) <> "" Then nR = nR + 1 RArr(nR, 1) = SArr(i, 1) RArr(nR, 2) = Dic1.Item(RArr(nR, 1))(1, j) Else Exit For End If Next Next Sheet3.[A3].Resize(nR, 2) = RArr Sheet3.[B1] = Timer - t End Sub Tốc độ so với cách khác (chỉ dùng mảng thông thường) cũng có chậm hơn.

File đính kèm

  • DicItemArray2.rar DicItemArray2.rar 244.3 KB · Đọc: 603
Upvote 0 A

anhphuong

Thân Thương
Tham gia 12/3/07 Bài viết 514 Được thích 2,604 Lâu rồi không ghé diễn đàn vì nhiều lý do, chủ yếu là do công việc. Hôm nay vào đây tình cờ đọc được bài viêt nảy của kyo thấy rất hay. Xin được tham gia mấy ví dụ cho bài viết này. Các bạn có thể tham khảo bài viết của tác giả matthewspatrick tại ​http://www.experts-exchange.com/Sof...A_3391-Using-the-Dictionary-Class-in-VBA.html

File đính kèm

  • Example-1.xls Example-1.xls 32.5 KB · Đọc: 777
  • Example-3.xls Example-3.xls 50 KB · Đọc: 445
  • Example-2.xls Example-2.xls 31.5 KB · Đọc: 448
  • Example-4.xls Example-4.xls 37.5 KB · Đọc: 486
Upvote 0 Status Không mở trả lời sau này.

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

N Tạo COM Add-In bằng Visual C++ (1 người xem)
    • Thích
  • nguyendang95
  • 6/7/25
  • Excel và các ngôn ngữ lập trình khác
Trả lời 18 Đọc 2K 40 phút trước nguyendang95 N M Bảo mật code VBA autocad!
  • Michael Bit
  • Hôm qua, lúc 08:44
  • Hỏi đáp những vấn đề khác
Trả lời 12 Đọc 248 Hôm nay lúc 19:17 Michael Bit M H Lọc giá trị duy nhất theo cụm (1 người xem)
  • hoaiantrinh
  • Hôm nay lúc 14:58
  • Hàm và công thức Excel
Trả lời 0 Đọc 39 Hôm nay lúc 14:58 hoaiantrinh H GPE-Trợ Lý CHÚC MỪNG NĂM MỚI BÍNH NGỌ 2026
    • Cảm ơn
    • Yêu thích
    • Thích
  • GPE-Trợ Lý
  • Hôm nay lúc 10:45
  • Thông tin về diễn đàn
Trả lời 0 Đọc 53 Hôm nay lúc 10:45 GPE-Trợ Lý GPE-Trợ Lý L Thu Chi Gia Đình
    • Cười
  • lehang0812
  • Thứ năm lúc 17:12
  • TPHCM
Trả lời 5 Đọc 213 Hôm nay lúc 10:19 nguoiconxunui N SA_DQ Copilot bình luận các ván cờ vua từng ngày. (1 người xem)
    • Thích
  • SA_DQ
  • 3/11/25
  • Chia sẻ
Trả lời 64 Đọc 2K Hôm nay lúc 04:30 SA_DQ SA_DQ HeSanbi
  • Đã giải quyết
FitRowXL v1.3 - Giãn dòng tự động và bổ trợ in ấn Excel (*01/2026 mới) (1 người xem)
    • Thích
    • Yêu thích
  • HeSanbi
  • 18/4/21
  • Lập Trình với Excel
Trả lời 77 Đọc 30K Hôm qua, lúc 19:00 chothadiem chothadiem HeSanbi
  • Đã giải quyết
LocalizeXL v1.73 - Làm nổi bật ô đang chọn và cuộn trang tự động (phiên bản 2026)
    • Thích
    • Yêu thích
    • Cảm ơn
  • HeSanbi
  • 5/3/21
  • Lập Trình với Excel
Trả lời 85 Đọc 18K Chủ nhật lúc 21:43 chothadiem chothadiem Nguyễn Duy Tuân
  • Dán lên cao
Phiên bản mới Add-in A-Tools AI v10 (2024) (2 người xem)
    • Thích
  • Nguyễn Duy Tuân
  • 13/9/24
  • BLUESOFTS: A-Excel, A-Tools
Trả lời 62 Đọc 12K Thứ bảy lúc 18:10 Nguyễn Duy Tuân Nguyễn Duy Tuân E Giúp Đặt tên lại (Rename) cho hàng loạt các file PDF theo cùng 1 quy tắc
  • Excel my love_1
  • 15/4/23
  • Tin học mở rộng
Trả lời 4 Đọc 4K Thứ sáu lúc 15:20 luongha.ktqd L ongke0711
  • Question Question
Tải hóa đơn điện tử (https://hoadondientu.gdt.gov.vn/) Excel Vba
    • Thích
    • Yêu thích
    • Cảm ơn
  • ongke0711
  • 6/10/24
  • Lập Trình với Excel
5 6 7 Trả lời 622 Đọc 92K Thứ năm lúc 16:11 LOGANWover L Quang_Hải
  • Question Question
Chia sẻ một thuật toán đơn giản để trộn cells
    • Thích
    • Yêu thích
  • Quang_Hải
  • Thứ tư lúc 10:14
  • Lập Trình với Excel
Trả lời 12 Đọc 383 Thứ năm lúc 11:13 Quang_Hải Quang_Hải HeSanbi TaxCode v4.33 - Tra cứu mã số thuế từ tổng cục thuế, masothue và thuvienphapluat
    • Thích
    • Yêu thích
  • HeSanbi
  • 27/11/25
  • Các Add-ins cho excel
Trả lời 19 Đọc 3K Thứ năm lúc 08:54 HeSanbi HeSanbi HeSanbi
  • Question Question
Tạo Add-in, tệp Excel, Word, Access tự động cập nhật phiên bản mới từ Cloud cho chính nó
    • Thích
    • Yêu thích
  • HeSanbi
  • 2/2/26
  • Lập Trình với Excel
Trả lời 1 Đọc 246 Thứ tư lúc 17:03 HeSanbi HeSanbi TranThanhPhong Hàm EXACT
    • Thích
  • TranThanhPhong
  • 30/4/14
  • Dự án: Công thức & Hàm 97-2019
Trả lời 3 Đọc 9K 3/2/26 ptm0412 ptm0412 giaiphap Add-Ins cho Excel 2007 -2016 32bit và 64bit (2 người xem)
    • Thích
    • Yêu thích
    • Ngạc nhiên
  • giaiphap
  • 8/8/15
  • Các Add-ins cho excel
4 5 6 Trả lời 518 Đọc 226K 3/2/26 Gà Công Nghệ Gà Công Nghệ V Một Excel add-in vibe coding
    • Thích
  • vietdang170
  • 28/1/26
  • Các Add-ins cho excel
Trả lời 18 Đọc 750 3/2/26 vietdang170 V H Xin giúp đặt điều kiện trong Conditional Formating (1 người xem)
  • hoanglocphat
  • 2/2/26
  • Hỏi đáp những vấn đề khác
Trả lời 6 Đọc 217 3/2/26 Gà Con yêu VBA Gà Con yêu VBA mrjun80 Xin giúp hàm excel để tìm 1 số trong số có 2 chữ số
  • mrjun80
  • 31/1/26
  • Hàm và công thức Excel
Trả lời 4 Đọc 216 1/2/26 Gà Con yêu VBA Gà Con yêu VBA N Vấn đề về hiệu năng khi thực hiện ghép chuỗi trong VBA với tần suất lớn
    • Thích
    • Cảm ơn
  • nguyendang95
  • 23/1/26
  • Excel và các ngôn ngữ lập trình khác
Trả lời 36 Đọc 1K 31/1/26 ptm0412 ptm0412 Xem thêm… Chia sẻ: Facebook X Bluesky LinkedIn Reddit Pinterest Tumblr WhatsApp Email Chia sẻ Link

Thành viên có số lượng bài viết cao nhất tháng

  • HeSanbi 14
  • chothadiem 11
  • Michael Bit 6
  • Gà Công Nghệ 5
  • YêuCN 4
  • Officexinh 4
  • vietdang170 4
  • pycckuu410 3
  • HieuCD 3
  • chiendich 3
  • hoanglocphat 3
  • VietHoangPhan 2
  • DeTong 2
  • Gà Con yêu VBA 2
  • Quang_Hải 2
  • linhdao2909 1
  • HUONGHCKT 1
  • vuvannguyen1972 1
  • nguyendang95 1
  • ptm0412 1

Thành viên có điểm tương tác cao nhất tháng

  • HeSanbi 19
  • Quang_Hải 7
  • vietdang170 5
  • Gà Con yêu VBA 4
  • GPE-Trợ Lý 4
  • pycckuu410 3
  • HieuCD 3
  • chiendich 3
  • DeTong 3
  • Phuocam 3
  • YêuCN 2
  • Officexinh 2
  • HUONGHCKT 2
  • Michael Bit 1

Thời gian đếm ngược.

000 Ngày 00 Giờ 00 phút 00 giây Thân mời tham dự sự kiện sinh nhật GPE 2025
  • Trang chủ
  • Diễn đàn
  • Lập Trình với Excel
  • Website này sử dụng cookies. Tiếp tục sử dụng trang này, đồng nghĩa với việc bạn chấp nhận website sử dụng cookies. Chấp nhận Tìm hiểu thêm.…
Back Top Bottom

Từ khóa » Cách Dùng Dictionary Trong Vba Excel