Bộ phân biệt chữ hoa chữ thường trong python

“Kiệt tác vĩ đại nhất trong văn học chỉ là một cuốn từ điển sai trật tự. ” – Jean Cocteau

 

nội dung

  • 1 Hướng dẫn nhanh về Từ điển VBA
  • 2 Từ điển VBA là gì?
  • 3 Tải xuống mã nguồn
  • 4 Hội thảo trên web về từ điển
  • 5 Từ điển trong thế giới thực
  • 6 Ví dụ đơn giản về cách sử dụng Từ điển VBA
  • 7 Tạo từ điển
    • 7. 1 Ràng buộc sớm và muộn
  • 8 Thêm Mục vào Từ điển
  • 9 Gán giá trị
  • 10 Kiểm tra xem khóa có tồn tại hay không
  • 11 Lưu trữ nhiều giá trị trong một khóa
  • 12 Các chức năng hữu ích khác
  • 13 Khóa và phân biệt chữ hoa chữ thường
    • 13. 1 Những điều cần lưu ý
  • 14 Đọc qua Từ điển
  • 15 Sắp xếp từ điển
    • 15. 1 Sắp xếp theo khóa
    • 15. 2 Sắp xếp theo giá trị
  • 16 Khắc phục sự cố Từ điển
    • 16. 1 Thiếu tham chiếu
    • 16. 2 Tồn tại không hoạt động
    • 16. 3 Lỗi biến đối tượng
    • 16. 4 Mẹo hữu ích để khắc phục sự cố từ điển
  • 17 Sao chép từ điển vào một mảng
  • 18 Viết từ điển vào trang tính
  • 19 Ví dụ từ điển hữu ích
    • 19. 1 Ví dụ 1 – Tính tổng các giá trị đơn lẻ
    • 19. 2 Ví dụ 2 – Xử lý nhiều giá trị
    • 19. 3 Ví dụ 3 – Tính tổng nhiều giá trị
  • 20 Khi Nào Nên Sử Dụng Từ Điển
  • 21 Điều gì tiếp theo?

Hướng dẫn nhanh về Từ điển VBA

Chức năngVí dụ Tham chiếu ràng buộc sớm“Microsoft Scripting Runtime”
(Thêm bằng cách sử dụng Công cụ->Tham khảo từ menu VB)Khai báo (liên kết sớm)
Làm mờ< . Từ điển dict As Scripting.Dictionary Tạo (liên kết sớm) Đặt dict = Mới Scripting.Dictionary Khai báo (ràng buộc muộn) Làm mờ dict Là đối tượngCreate(late binding)Set dict = CreateObject("Scripting.Dictionary" ) Thêm mục (khóa phải chưa tồn tại) dict. Thêm Khóa, Giá trị
e. g. mệnh lệnh. Thêm "Táo" , 50 Thay đổi giá trị tại khóa. Tự động thêm nếu key không tồn tại. dict( Khóa ) = Giá trị
e.g. dict("Oranges" ) = 60 Nhận giá trị từ từ điển bằng cách sử dụng khóa Value = dict(Key)
e.g. appleCount = dict("Apples" ) Kiểm tra xem có tồn tại khóa không dict. Tồn tại( Khóa )
e. g. Nếu ra lệnh. Tồn tại( "Táo" ) Sau đó Xóa mục dict.Remove Khóa
e. g. mệnh lệnh. Xóa "Táo" Xóa tất cả các mục dict. RemoveAll Đi qua tất cả các mục (cho mỗi vòng lặp) Phím Dim Là Biến thể . Phím
For Each key In dict.Keys
    Gỡ lỗi. Print key, dict(key)
Key tiếp theo Đi qua tất cả các mục (chỉ dành cho vòng lặp - liên kết sớm) Dim i As Long
For i = 0 To dict.Count - 1
   Gỡ lỗi. In dict. Phím(i),    dict. Items(i)
Tiếp theo i Đi qua tất cả các mục (cho vòng lặp - ràng buộc sớm và muộn) Làm mờ i As Long
For i = 0 To dict.Count - 1
Gỡ lỗi. In lệnh. Phím () (i), chính tả. Items()(i)
Tiếp theo iNhận số lượng mục dict. Đếm Phân biệt chữ hoa chữ thường (từ điển phải trống). chính tả. CompareMode = vbBinaryCompare Đặt khóa không phân biệt chữ hoa chữ thường (từ điển phải trống). chính tả. So sánhChế độ = vbTextSo sánh

 

Từ điển VBA là gì?

Trong VBA, chúng tôi sử dụng Mảng và Bộ sưu tập để lưu trữ các nhóm giá trị. Ví dụ: chúng ta có thể sử dụng chúng để lưu trữ danh sách tên khách hàng, điểm của học sinh hoặc danh sách các giá trị từ một dải ô

Từ điển tương tự như Bộ sưu tập. Sử dụng cả hai loại, chúng ta có thể đặt tên cho một mục khi chúng ta thêm nó. Hãy tưởng tượng chúng ta đang lưu trữ số lượng các loại trái cây khác nhau

Chúng ta có thể sử dụng cả Bộ sưu tập và Từ điển như thế này

' Add to Dictionary
dict.Add Key:="Apple", Item:=5

' Add to Collection
coll.Add Item:=5, Key:="Apple"

 

Bộ phân biệt chữ hoa chữ thường trong python

Ví dụ về các cặp Khóa, Giá trị

Trong cả hai trường hợp, chúng tôi đang lưu trữ giá trị 5 và đặt tên cho nó là “Apple”. Bây giờ chúng ta có thể nhận được giá trị của Apple từ cả hai loại như thế này

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")

Càng xa càng tốt. Tuy nhiên, Bộ sưu tập có hai lỗi lớn

  1. Chúng tôi không thể kiểm tra xem khóa đã tồn tại chưa
  2. Chúng tôi không thể thay đổi giá trị của một mặt hàng hiện có

Vấn đề đầu tiên là khá dễ dàng để giải quyết. Kiểm tra khóa bộ sưu tập tồn tại. Cái thứ hai khó hơn

Từ điển VBA không có những vấn đề này. Bạn có thể kiểm tra xem Khóa có tồn tại hay không và bạn có thể thay đổi Vật phẩm và Khóa

Ví dụ: chúng ta có thể sử dụng đoạn mã sau để kiểm tra xem chúng ta có một mục tên là Apple không

If dict.Exists("Apple") Then 
    dict("Apple") = 78 

 

Đây có thể là những khác biệt rất đơn giản. Tuy nhiên, điều đó có nghĩa là Từ điển rất hữu ích cho một số tác vụ nhất định. Đặc biệt khi chúng ta cần truy xuất giá trị của một mục

 

Tải xuống mã nguồn

 

Hội thảo trên web về từ điển

Nếu bạn là thành viên của VBA Vault, hãy nhấp vào hình ảnh bên dưới để truy cập hội thảo trên web và mã nguồn được liên kết

(Ghi chú. Các thành viên của trang web có quyền truy cập vào kho lưu trữ hội thảo trên web đầy đủ. )

Bộ phân biệt chữ hoa chữ thường trong python

Từ điển trong thuật ngữ thế giới thực

Nếu bạn vẫn chưa rõ về Từ điển thì hãy nghĩ theo cách này. Một từ điển trong thế giới thực có một danh sách các khóa và mục. Chìa khóa là các từ và Mục là định nghĩa

Khi muốn tìm định nghĩa của từ nào bạn vào thẳng từ đó. Bạn không đọc qua mọi mục trong Từ điển

Một ví dụ thực tế thứ hai là danh bạ điện thoại (nhớ chúng không?). Khóa trong danh bạ điện thoại là tên\địa chỉ và Mục là số điện thoại. Một lần nữa, bạn sử dụng tổ hợp tên\địa chỉ để tìm nhanh số điện thoại

Trong Excel, hàm VLookup hoạt động theo cách tương tự như Từ điển. Bạn tra cứu một mục dựa trên một giá trị duy nhất

 

Một ví dụ đơn giản về việc sử dụng từ điển VBA

Đoạn mã dưới đây đưa ra một ví dụ đơn giản nhưng tao nhã về việc sử dụng Từ điển. Nó làm như sau

  1. Thêm ba loại trái cây và giá trị cho từng loại vào Từ điển
  2. Người dùng được yêu cầu nhập tên của một loại trái cây
  3. Code kiểm tra xem loại quả này có trong Từ điển không
  4. Nếu có thì nó hiển thị tên trái cây và giá trị
  5. Nếu không thì nó thông báo cho người dùng rằng trái cây không tồn tại

 

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub

Đây là một ví dụ đơn giản nhưng nó cho thấy từ điển hữu ích như thế nào. Chúng ta sẽ thấy một ví dụ thực tế sau trong bài viết. Hãy xem những điều cơ bản của việc sử dụng Từ điển

 

Tạo từ điển

Để sử dụng Từ điển, trước tiên bạn cần thêm tài liệu tham khảo

  1. Chọn Tools->References từ menu Visual Basic
  2. Tìm Microsoft Scripting Runtime trong danh sách và đánh dấu vào ô bên cạnh

Ta khai báo một dictionary như sau

Dim dict As New Scripting.Dictionary

hoặc

Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary

Tạo từ điển theo cách này được gọi là “Ràng buộc sớm”. Ngoài ra còn có "Ràng buộc muộn". Hãy xem điều này có nghĩa là gì

 

Ràng buộc sớm và muộn

Để tạo Từ điển bằng liên kết muộn, chúng tôi sử dụng đoạn mã sau. Chúng tôi không cần thêm một tài liệu tham khảo

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

Về mặt kỹ thuật Liên kết sớm có nghĩa là chúng tôi quyết định chính xác những gì chúng tôi đang sử dụng từ trước. Với ràng buộc muộn, quyết định này được đưa ra khi ứng dụng đang chạy. Nói một cách đơn giản, sự khác biệt là

  1. Ràng buộc sớm yêu cầu một tài liệu tham khảo. Ràng buộc muộn không
  2. Liên kết sớm cho phép truy cập vào *Intellisense. Ràng buộc muộn không
  3. Liên kết ban đầu có thể yêu cầu bạn thêm Tham chiếu vào “Thời gian chạy tập lệnh Microsoft” theo cách thủ công đối với một số người dùng

(*Intellisense là tính năng hiển thị cho bạn các quy trình và thuộc tính khả dụng của một mục khi bạn đang nhập. )

Mặc dù Microsoft khuyên bạn nên sử dụng liên kết sớm trong hầu hết các trường hợp nhưng tôi sẽ khác. Một nguyên tắc nhỏ là sử dụng ràng buộc sớm khi phát triển mã để bạn có quyền truy cập vào Intellisense. Sử dụng ràng buộc muộn khi phân phối mã cho người dùng khác để ngăn các lỗi xung đột thư viện khác nhau xảy ra

 

Thêm mục vào từ điển

FunctionParamsExampleAddKey, Item dict. Thêm "Táo" , 50

Chúng ta có thể thêm các mục vào từ điển bằng chức năng Thêm. Các mục cũng có thể được thêm vào bằng cách gán một giá trị mà chúng ta sẽ xem xét trong phần tiếp theo

Trước tiên hãy xem xét chức năng Thêm. Hàm Add có hai tham số. Chìa khóa và vật phẩm. Cả hai phải được cung cấp

dict.Add Key:="Orange", Item:=45
dict.Add "Apple", 66
dict.Add "12/12/2015", "John"
dict.Add 1, 45.56

Trong ví dụ thêm đầu tiên ở trên, chúng tôi sử dụng tên tham số. Bạn không cần phải làm điều này mặc dù nó có thể hữu ích khi bạn bắt đầu

Khóa có thể là bất kỳ loại dữ liệu nào. Mục có thể là bất kỳ kiểu dữ liệu nào, đối tượng, mảng, bộ sưu tập hoặc thậm chí là từ điển. Vì vậy, bạn có thể có một Từ điển Từ điển, Mảng và Bộ sưu tập. Nhưng hầu hết thời gian nó sẽ là một giá trị (ngày, số hoặc văn bản)

Nếu chúng ta thêm một Key đã tồn tại trong Từ điển thì chúng ta sẽ gặp lỗi

Bộ phân biệt chữ hoa chữ thường trong python

Đoạn mã sau sẽ đưa ra lỗi này

________số 8

 

Gán một giá trị

OperationFormatExampleAssignDictionary(Key) = Item dict( "Oranges" ) = 60

Chúng ta có thể thay đổi giá trị của khóa bằng đoạn mã sau

dict("Orange") = 75

Gán một giá trị cho Khóa theo cách này có một tính năng bổ sung. Nếu Khóa không tồn tại, nó sẽ tự động thêm Khóa và Mục vào từ điển. Điều này sẽ hữu ích khi bạn có một danh sách các mục được sắp xếp và chỉ muốn mục nhập cuối cùng cho từng mục

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
0

 

Đừng quên rằng bạn có thể tải xuống tất cả mã VBA được sử dụng trong bài đăng này từ đầu hoặc cuối bài đăng

Kiểm tra xem khóa có tồn tại không

FunctionParametersExampleExistsKey If dict. Tồn tại( "Táo" ) Sau đó

Chúng ta có thể sử dụng chức năng Exists để kiểm tra xem một khóa có tồn tại trong từ điển hay không

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
1

 

Lưu trữ nhiều giá trị trong một khóa

Hãy xem dữ liệu mẫu dưới đây. Chúng tôi muốn lưu trữ Số tiền và Mặt hàng cho từng ID khách hàng

Bộ phân biệt chữ hoa chữ thường trong python

Từ điển chỉ lưu trữ một giá trị, vậy chúng ta có thể làm gì?

Chúng tôi có thể sử dụng một mảng hoặc bộ sưu tập làm giá trị nhưng điều này là không cần thiết. Cách tốt nhất để làm điều đó là sử dụng Mô-đun lớp

Đoạn mã sau đây cho thấy làm thế nào chúng ta có thể làm điều này

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
2

 

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
3

 
Bạn có thể thấy rằng bằng cách sử dụng Mô-đun lớp, chúng ta có thể lưu trữ bao nhiêu trường tùy thích. Ví dụ 2 và 3 ở cuối bài đăng cho biết cách sử dụng mô-đun lớp với Từ điển

 

Các chức năng hữu ích khác

FunctionParametersExampleCountN/A dict. Đếm RemoveKey dict. Xóa "Táo" RemoveAllN/A dict. Xóa tất cả

Ba chức năng trong bảng trên làm như sau

  1. Đếm – trả về số mục trong Từ điển
  2. Xóa – xóa một khóa đã cho khỏi Từ điển
  3. RemoveAll – xóa tất cả các mục khỏi Từ điển

Sub sau đây cho thấy một ví dụ về cách bạn sẽ sử dụng các chức năng này

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
4

Hãy nhớ rằng bạn có thể tải xuống tất cả các ví dụ mã từ bài đăng. Chỉ cần vào phần tải xuống ở trên cùng

 

Độ nhạy phím và chữ hoa chữ thường

Một số hàm chuỗi trong VBA có vbCompareMethod. Điều này được sử dụng cho các chức năng so sánh các chuỗi. Nó được sử dụng để xác định xem trường hợp của các chữ cái có quan trọng không

 

Bộ phân biệt chữ hoa chữ thường trong python

© BigStockPhoto. com

Từ điển sử dụng một phương pháp tương tự. Thuộc tính CompareMode của Từ điển được sử dụng để xác định xem trường hợp của khóa có quan trọng không. Các cài đặt là

vbTextSo sánh. Chữ hoa và chữ thường được coi là giống nhau

vbBinarySo sánh. Chữ hoa và chữ thường được coi là khác nhau. Đây là mặc định

Với Từ điển, chúng tôi có thể sử dụng các cài đặt này để xác định xem trường hợp của khóa có quan trọng không

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
5

Lần này chúng tôi sử dụng vbTextCompare có nghĩa là trường hợp không quan trọng

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
6

Ghi chú. Từ điển phải trống khi bạn sử dụng thuộc tính CompareMode nếu không bạn sẽ gặp lỗi. "Cuộc gọi thủ tục không hợp lệ hoặc đối số"

 

Những điều cần chú ý

vbBinaryCompare (trường hợp quan trọng) là mặc định và điều này có thể dẫn đến các lỗi nhỏ. Ví dụ: hãy tưởng tượng bạn có dữ liệu sau trong các ô từ A1 đến B2

Cam, 5
cam, 12

Đoạn mã sau sẽ tạo hai khóa - bật cho “Orange” và một cho “orange”. Điều này là tinh tế vì sự khác biệt duy nhất là trường hợp của chữ cái đầu tiên

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
7

Nếu bạn sử dụng vbTextCompare cho cùng một dữ liệu, bạn sẽ gặp lỗi khi cố gắng thêm khóa thứ hai vì nó coi “Orange” và “orange” giống nhau

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
8

Nếu bạn sử dụng phương thức gán thì nó không tính đến Chế độ so sánh. Vì vậy, đoạn mã sau sẽ vẫn thêm hai khóa mặc dù So sánhMode được đặt thành vbTextCompare

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
9

 

Đọc qua từ điển

Chúng ta có thể đọc qua tất cả các mục trong Từ điển. Chúng ta có thể đi qua các phím bằng cách sử dụng vòng lặp For Each. Sau đó, chúng tôi sử dụng khóa hiện tại để truy cập một mục

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
0

Chúng tôi cũng có thể lặp qua các phím mặc dù điều này chỉ hoạt động với Liên kết sớm (Cập nhật tháng 2 năm 2020. Trong Office 365, tính năng này hiện hoạt động với cả hai phiên bản)

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
1

Phương pháp này hoạt động với cả ràng buộc sớm và muộn

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
2

 

Sắp xếp từ điển

Đôi khi bạn có thể muốn sắp xếp Từ điển theo khóa hoặc theo giá trị

Từ điển không có chức năng sắp xếp nên bạn phải tự tạo. Tôi đã viết hai hàm sắp xếp – một để sắp xếp theo khóa và một để sắp xếp theo giá trị

 

Sắp xếp theo phím

Để sắp xếp từ điển theo khóa bạn có thể sử dụng hàm SortDictionaryByKey bên dưới

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
3

Đoạn mã dưới đây, chỉ cho bạn cách sử dụng Sort Dictionary By Key

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
4

 

Sắp xếp theo giá trị

Để sắp xếp từ điển theo các giá trị, bạn có thể sử dụng hàm SortDictionaryByValue bên dưới

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
5

Đoạn mã dưới đây chỉ cho bạn cách sử dụng SortDictionaryByValue

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
6

 

Khắc phục sự cố từ điển

Phần này bao gồm các lỗi phổ biến mà bạn có thể gặp phải khi sử dụng Từ điển

Thiếu tài liệu tham khảo

Sự cố. Bạn nhận được thông báo lỗi “Loại do người dùng xác định không được xác định”
Điều này thường xảy ra khi bạn tạo Từ điển nhưng quên thêm tham chiếu.

Dim dict As New Scripting.Dictionary

Nghị quyết. Chọn Tools->Reference từ menu Visual Basic. Đánh dấu vào ô bên cạnh “Microsoft Scripting Runtime”

Xem phần. Tạo từ điển

 

Tồn tại không hoạt động

Sự cố. Bạn đã thêm một khóa vào Từ điển nhưng khi bạn sử dụng chức năng Exists, nó trả về false
Đây thường là sự cố với Phân biệt chữ hoa chữ thường (xem bên trên).
Đoạn mã sau thêm “Apple” làm khóa. Khi chúng tôi kiểm tra “apple”, nó sẽ trả về false. Điều này là do nó tính đến trường hợp của các chữ cái.

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
8

Bạn có thể đặt thuộc tính CompareMode thành vbTextCompare và điều này sẽ bỏ qua trường hợp

If dict.Exists("Apple") Then 
    dict("Apple") = 78 
9

Nghị quyết. Đặt So sánhMode thành vbTextCompare để bỏ qua trường hợp hoặc đảm bảo dữ liệu của bạn có trường hợp chính xác

Xem phần. Độ nhạy phím và chữ hoa chữ thường

 

Lỗi biến đối tượng

Vấn đề. Bạn nhận được thông báo lỗi “Biến đối tượng hoặc Chưa đặt biến khối” khi bạn cố gắng sử dụng Từ điển

Điều thường xảy ra khi bạn quên sử dụng Mới trước khi sử dụng Từ điển. Ví dụ: đoạn mã sau sẽ gây ra lỗi này

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
0

Nghị quyết. Sử dụng từ khóa Mới khi tạo Từ điển

Dim dict As New Scripting.Dictionary

Hoặc

Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary

Xem phần. Tạo từ điển

 

Mẹo hữu ích để khắc phục sự cố từ điển

Nếu bạn đang điều tra một vấn đề với Từ điển, có thể hữu ích khi xem nội dung

Sử dụng phần phụ sau để In từng Khóa và Mục vào Cửa sổ ngay lập tức (Ctrl + G)

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
3

Bạn có thể sử dụng nó như thế này

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
4

Nếu bạn đang xem qua mã, bạn cũng có thể thêm dict. Đếm vào Cửa sổ xem để xem có bao nhiêu mục hiện có trong Từ điển. Nhấp chuột phải vào bất kỳ đâu trong cửa sổ mã và chọn Thêm đồng hồ. Nhập chính tả. Đếm vào hộp văn bản và nhấp vào Ok

Bạn cũng có thể sử dụng Từ điển làm Đồng hồ. Thêm Dict vào cửa sổ Watch. Nếu bạn bấm vào dấu cộng, bạn sẽ thấy nội dung của Từ điển. Điều này có thể hữu ích nhưng nó chỉ hiển thị khóa chứ không hiển thị mục

Ghi chú. Bạn chỉ có thể xem Đồng hồ khi mã đang chạy

Hãy nhớ rằng bạn có thể tải xuống tất cả các ví dụ mã từ bài đăng. Chỉ cần vào phần tải xuống ở trên cùng

 

Sao chép từ điển vào một mảng

Như chúng ta biết từ điển được tạo thành từ các cặp Khóa và Giá trị. Từ điển có thuộc tính Keys là một mảng gồm tất cả các khóa và thuộc tính Items là một mảng của tất cả các mục (i. e. giá trị)

Bộ phân biệt chữ hoa chữ thường trong python

Vì cả hai thuộc tính này đều là mảng, chúng ta có thể viết chúng trực tiếp vào trang tính như chúng ta sẽ thấy trong phần tiếp theo

Nếu chúng ta muốn sao chép mảng Khóa hoặc Mục sang một mảng mới thì chúng ta có thể thực hiện việc đó rất dễ dàng như thế này

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
5

Ví dụ sau sao chép các mảng Khóa và Mục sang mảng mới. Sau đó, nội dung của các mảng mới được in ra Cửa sổ ngay lập tức

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
6

Khi bạn chạy mã, bạn sẽ nhận được đầu ra sau

Bộ phân biệt chữ hoa chữ thường trong python

Lưu ý rằng bạn chỉ có thể sao chép mảng Mục khi nó chứa các kiểu dữ liệu cơ bản như chuỗi, dài, ngày, gấp đôi, v.v. Nếu các mục là đối tượng thì bạn không thể sao chép chúng vào một mảng. Thay vào đó, bạn sẽ cần đọc qua từ điển bằng vòng lặp

 

Viết từ điển vào bảng tính

Chúng ta có thể viết các khóa Từ điển hoặc các mục vào trang tính trong một dòng mã

Khi bạn viết ra các phím hoặc mục, chúng sẽ được ghi thành một hàng. Nếu bạn muốn ghi chúng vào một cột, bạn có thể sử dụng WorksheetFunction. chức năng chuyển đổi

Mã bên dưới hiển thị các ví dụ về cách viết Từ điển vào trang tính

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
7

 

Ví dụ từ điển hữu ích

Cách dễ nhất để thấy lợi ích của Từ điển là xem một số ví dụ thực tế về việc sử dụng Từ điển. Vì vậy, trong phần này chúng ta sẽ xem xét một số ví dụ. Bạn có thể nhận sổ làm việc và mã cho những ví dụ này bằng cách nhập email của bạn bên dưới

 

Ví dụ 1 – Tính tổng các giá trị đơn lẻ

Hãy cùng xem một ví dụ thực tế về việc sử dụng từ điển. Dữ liệu của chúng tôi cho ví dụ này là các trận Chung kết World Cup từ năm 2014

Bộ phân biệt chữ hoa chữ thường trong python

Nhiệm vụ của chúng ta ở đây là lấy số bàn thắng ghi được của mỗi đội

Điều đầu tiên chúng ta cần làm là đọc tất cả dữ liệu. Đoạn mã sau đọc qua tất cả các trận đấu và in tên của hai đội tham gia

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
8

Những gì chúng tôi muốn làm bây giờ là lưu trữ từng đội và các mục tiêu họ ghi được. Khi chúng tôi gặp một đội lần đầu tiên, chúng tôi thêm tên làm Khóa và số mục tiêu làm Mục

 

Bộ phân biệt chữ hoa chữ thường trong python

Kỷ niệm một mục tiêu. © BigStockPhoto. com

Nếu đội đã được thêm vào thì chúng tôi sẽ thêm các bàn thắng họ ghi được trong trận đấu hiện tại vào tổng số bàn thắng của họ

Chúng tôi có thể sử dụng dòng sau để thêm mục tiêu cho nhóm hiện tại

' https://excelmacromastery.com/
Sub CheckFruit()

    ' Select Tools->References from the Visual Basic menu.
    ' Check box beside "Microsoft Scripting Runtime" in the list.
    Dim dict As New Scripting.Dictionary
    
    ' Add to fruit to Dictionary
    dict.Add key:="Apple", Item:=51
    dict.Add key:="Peach", Item:=34
    dict.Add key:="Plum", Item:=43

    Dim sFruit As String
    ' Ask user to enter fruit
    sFruit = InputBox("Please enter the name of a fruit")

    If dict.Exists(sFruit) Then
        MsgBox sFruit & " exists and has value " & dict(sFruit)
    Else
        MsgBox sFruit & " does not exist."
    End If
    
    Set dict = Nothing
    
End Sub
9

dòng này rất mạnh

Nếu các đội tồn tại trong Từ điển, các mục tiêu hiện tại sẽ được thêm vào tổng số hiện tại cho đội đó

Nếu nhóm không tồn tại trong Từ điển thì nó sẽ tự động thêm nhóm vào Từ điển và đặt giá trị cho các mục tiêu

Ví dụ: hãy tưởng tượng Từ điển có một mục

Khóa, Giá trị
Braxin, 5

sau đó

Dim dict As New Scripting.Dictionary
0

sẽ cập nhật từ điển để bây giờ nó trông như thế này

Khóa, Giá trị
Braxin, 8

Dòng

Dim dict As New Scripting.Dictionary
1

sẽ cập nhật từ điển để bây giờ nó trông như thế này

Khóa, Giá trị
Braxin, 8
Pháp, 3

 

Điều này tiết kiệm cho chúng tôi phải viết mã như thế này

Dim dict As New Scripting.Dictionary
2

Chúng tôi viết ra các giá trị từ Từ điển vào trang tính như sau

Dim dict As New Scripting.Dictionary
3

 
Rõ ràng là chúng tôi muốn điểm số được sắp xếp. Nó là dễ dàng hơn nhiều để đọc theo cách này. Không có cách nào dễ dàng để sắp xếp Từ điển. Cách thực hiện là sao chép tất cả các mục vào một mảng. Sắp xếp mảng và sao chép các mục trở lại Từ điển.

Những gì chúng ta có thể làm là sắp xếp dữ liệu sau khi nó được ghi vào trang tính. Chúng ta có thể sử dụng đoạn mã sau để làm điều này

Dim dict As New Scripting.Dictionary
4

 
Phụ đề GetTotals cuối cùng của chúng tôi trông như thế này.

Dim dict As New Scripting.Dictionary
5

Khi bạn chạy mã này, bạn sẽ nhận được kết quả sau

Bộ phân biệt chữ hoa chữ thường trong python

Các đội được sắp xếp theo số bàn thắng ghi được

 

Ví dụ 2 – Xử lý nhiều giá trị

Chúng tôi sẽ sử dụng dữ liệu từ phần Nhiều giá trị ở trên

Bộ phân biệt chữ hoa chữ thường trong python

Hãy tưởng tượng dữ liệu này bắt đầu từ ô A1. Sau đó, chúng ta có thể sử dụng mã dưới đây để đọc từ điển

Mã bao gồm hai phụ để hiển thị dữ liệu

  1. WriteToImmediate in nội dung của từ điển ra Cửa sổ ngay lập tức
  2. WriteToWorksheet ghi nội dung của từ điển vào trang tính có tên là Đầu ra

Để chạy ví dụ này

  1. Tạo một trang tính có tên là Khách hàng
  2. Thêm dữ liệu trên vào trang tính bắt đầu từ ô A1
  3. Tạo một trang tính có tên là Đầu ra và để trống
  4. Chuyển đến Trình chỉnh sửa Visual Basic (Alt + F11)
  5. Chọn Tools->Reference và sau đó kiểm tra “Microsoft Scripting Runtime” từ danh sách
  6. Tạo một mô-đun lớp mới và thêm đoạn mã đầu tiên từ bên dưới
  7. Tạo một mô-đun tiêu chuẩn mới và thêm đoạn mã thứ hai từ bên dưới
  8. Nhấn F5 để chạy và chọn Main từ menu
  9. Kiểm tra Cửa sổ ngay lập tức (Ctrl + G) và trang tính Đầu ra để xem kết quả

 

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
2

 

Dim dict As New Scripting.Dictionary
7

 

Ví dụ 3 – Tính tổng nhiều giá trị

Trong ví dụ này, chúng tôi sẽ thực hiện một cập nhật nhỏ cho Ví dụ 2. Trong ví dụ đó, chỉ có một mục nhập cho mỗi khách hàng trong dữ liệu

Lần này sẽ có nhiều mục nhập cho một số khách hàng và chúng tôi muốn tính tổng số tiền và tổng số mặt hàng cho từng khách hàng

Xem tập dữ liệu được cập nhật bên dưới

Bộ phân biệt chữ hoa chữ thường trong python

Ghi chú. Nếu bạn chạy mã “Ví dụ 2” trên dữ liệu có nhiều bản sao của ID khách hàng, nó sẽ báo lỗi “Khóa đã tồn tại”

' Get value from Dictionary
Total = dict("Apple")

' Get value from Collection
Total = coll("Apple")
2

 

Dim dict As New Scripting.Dictionary
9

 

Khi nào nên sử dụng từ điển

Vậy khi nào thì bạn nên sử dụng VBA Dictionary?

  1. Bạn có một danh sách các mặt hàng độc đáo e. g. quốc gia, số hóa đơn, tên và địa chỉ khách hàng, id dự án, tên sản phẩm, v.v.
  2. Bạn cần truy xuất giá trị của một mục duy nhất

 

Bộ phân biệt chữ hoa chữ thường trong python

Khóa/Giá trị của Quốc gia và Diện tích đất theo Km2

 

Cái gì tiếp theo?

Hướng dẫn VBA miễn phí Nếu bạn là người mới sử dụng VBA hoặc bạn muốn nâng cao các kỹ năng VBA hiện tại của mình thì tại sao không thử Hướng dẫn VBA cơ bản

đào tạo liên quan. Nhận toàn quyền truy cập vào các hội thảo trực tuyến về đào tạo VBA của Excel và tất cả các hướng dẫn

(GHI CHÚ. Lập kế hoạch để xây dựng hoặc quản lý một ứng dụng VBA? . )