Αντικείμενα λεξικού VBA

Πίνακας περιεχομένων

Χρήση λεξικού VBA

Ένα λεξικό VBA λειτουργεί με παρόμοιο τρόπο με ένα αντικείμενο συλλογής, αλλά έχει περισσότερες ιδιότητες και μεθόδους και προσφέρει μεγαλύτερη ευελιξία

Το λεξικό αποθηκεύει τα δεδομένα στη μνήμη και μπορεί εύκολα να χειριστεί. Δεν απαιτείται αυτόματος υπολογισμός, δημιουργία αντιγράφων ασφαλείας φόντου και ανανέωση οθόνης, επομένως ο κώδικάς σας θα εκτελείται πολύ πιο γρήγορα.

Το αντικείμενο του λεξικού λειτουργεί με παρόμοιο τρόπο με ένα κανονικό λεξικό που θα χρησιμοποιούσατε αν θέλετε να μάθετε την έννοια μιας λέξης. Κάθε καταχώριση στο αντικείμενο του λεξικού έχει μια τιμή "κλειδί" και μια τιμή "στοιχείου". Χρησιμοποιείτε το «κλειδί» την τιμή κλειδιού για να αναζητήσετε την τιμή στοιχείου στο αντικείμενο του λεξικού, με παρόμοιο τρόπο που θα χρησιμοποιούσατε ένα συμβατικό λεξικό.

Λόγω του τρόπου λειτουργίας του αντικειμένου του λεξικού, οι βασικές τιμές πρέπει να είναι όλες μοναδικές, με τον ίδιο τρόπο όπως σε ένα συμβατικό λεξικό. Φανταστείτε αν ανοίξατε το συμβατικό λεξικό σας για να αναζητήσετε τη σημασία μιας λέξης και βρήκατε τη λέξη που αναγράφεται περισσότερες από μία φορές με δύο εντελώς διαφορετικούς ορισμούς. Θα μπερδευόσουν πολύ!

Οι βασικές τιμές είναι συνήθως κείμενο ή αριθμοί ή και τα δύο. Οι χρήστες συχνά είναι πιο εύκολο να θυμούνται τα ονόματα των κλειδιών ως κείμενο και όχι μόνο ως αριθμούς.

Σε σύγκριση με ένα αντικείμενο συλλογής, το αντικείμενο συλλογής διαβάζεται μόνο. Έχει μόνο δύο μεθόδους (Add and Remove) και δύο ιδιότητες (Count and Item). Μόλις ένα στοιχείο έχει προστεθεί σε ένα αντικείμενο συλλογής, μπορεί μόνο να αφαιρεθεί, αλλά όχι να επεξεργαστεί, κάτι που είναι δύσκολη εάν η τιμή ενός στοιχείου πρέπει να αλλάξει.

Ένα αντικείμενο λεξικού θα αλλάξει σε μέγεθος αυτόματα για να ταιριάζει στον αριθμό των στοιχείων μέσα σε αυτό. Δεν χρειάζεται να ορίζεται σε μέγεθος, όπως ένας συμβατικός πίνακας

Το αντικείμενο του λεξικού είναι μονοδιάστατο και ο τύπος δεδομένων είναι «Παραλλαγή», οπότε οποιοσδήποτε τύπος δεδομένων μπορεί να εισαχθεί σε αυτό π.χ. αριθμητικό, κείμενο, ημερομηνία

Το λεξικό VBA δεν είναι εγγενές στο Excel και πρέπει να έχει πρόσβαση είτε με έγκαιρη είτε με καθυστερημένη σύνδεση κατά τον ορισμό του αντικειμένου του λεξικού

123 Sub EarlyBindingExample ()Dim MyDictionary As New Scripting. DictionaryΤέλος υπο
1234 Sub LateBindingExample ()Dim MyDictionary As ObjectSet MyDictionary = CreateObject ("Scripting.Dictionary")Τέλος υπο

Εάν χρησιμοποιείτε την έγκαιρη δέσμευση, πρέπει να προσθέσετε μια αναφορά στη βιβλιοθήκη ‘Microsoft Scripting Runtime’

Το κάνετε αυτό επιλέγοντας «Εργαλεία | Αναφορές »στη γραμμή μενού του παραθύρου Visual Basic Editor (VBE) και ένα αναδυόμενο παράθυρο θα εμφανιστεί με μια λίστα με τις διαθέσιμες βιβλιοθήκες.

Κάντε κύλιση προς τα κάτω στο ‘Microsoft Scripting Runtime’ και σημειώστε το πλαίσιο δίπλα του. Κάντε κλικ στο κουμπί OK και αυτή η βιβλιοθήκη είναι πλέον μέρος του έργου σας VBA και μπορεί να γίνει αναφορά χρησιμοποιώντας έγκαιρη σύνδεση. Όλα τα παραδείγματα κώδικα σε αυτό το άρθρο θα χρησιμοποιούν έγκαιρη σύνδεση.

Ο κώδικάς σας θα εκτελείται πολύ πιο γρήγορα με την έγκαιρη δέσμευση, επειδή είναι όλα συγκεντρωμένα από πριν. Με καθυστερημένη δέσμευση, το αντικείμενο πρέπει να μεταγλωττιστεί καθώς εκτελείται ο κώδικας

Η βιβλιοθήκη Scripting Runtime διαθέτει «Intellisense». Καθώς γράφετε τον κωδικό σας, θα εμφανίζονται λίστες με διαθέσιμες μεθόδους και ιδιότητες, οι οποίες βοηθούν στην αποφυγή λαθών στην ορθογραφία, τα οποία θα προκαλέσουν σφάλματα στο πρόγραμμά σας

Επίσης, αν πατήσετε το F2 στο VBE και επιλέξετε τη βιβλιοθήκη ‘Scripting’, θα δείτε όλες τις διαθέσιμες μεθόδους και ιδιότητες και τις παραμέτρους που απαιτούνται για κάθε

Διανομή της εφαρμογής Excel που περιέχει λεξικό

Όπως ήδη επισημάνθηκε, η βιβλιοθήκη Scripting Runtime δεν αποτελεί μέρος του Excel VBA, οπότε αν διανείμετε την εφαρμογή σας σε άλλους χρήστες, πρέπει να έχουν πρόσβαση στη βιβλιοθήκη Scripting Runtime στον υπολογιστή τους. Εάν δεν έχουν, τότε θα προκύψει σφάλμα.

Είναι καλή ιδέα να συμπεριλάβετε κάποιον κώδικα VBA για να ελέγξετε εάν υπάρχει αυτή η βιβλιοθήκη όταν φορτώνεται η εφαρμογή Excel. Μπορείτε να χρησιμοποιήσετε την εντολή "Dir" για να το κάνετε αυτό στην εκδήλωση "Άνοιγμα βιβλίου εργασίας"

Η τοποθεσία του αρχείου είναι C: \ Windows \ SysWOW64 \ scrrun.dll

Πεδίο εφαρμογής ενός αντικειμένου λεξικού

Το αντικείμενο Λεξικού είναι διαθέσιμο μόνο ενώ είναι ανοιχτό το βιβλίο εργασίας του Excel. Δεν αποθηκεύεται όταν αποθηκεύεται το βιβλίο εργασίας.

Εάν το λεξικό σας είναι διαθέσιμο σε όλες τις ρουτίνες της ενότητας σας, πρέπει να το δηλώσετε (Dim) στην ενότητα Δήλωση στο επάνω μέρος της ενότητας

Το ορίζετε ως καθολικό αντικείμενο εάν θέλετε το λεξικό σας να χρησιμοποιείται σε ολόκληρο τον κώδικά σας.

1 Global MyDictionary As New Dictionary

Συμπλήρωση και ανάγνωση από το λεξικό σας

Αρχικά, πρέπει να δημιουργήσετε ένα λεξικό, να το συμπληρώσετε με κάποια δεδομένα και στη συνέχεια να το επαναλάβετε για να αποδείξετε ότι τα δεδομένα υπάρχουν

1234567891011 Sub PopulateReadDictionary ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "MyItem1", 10MyDictionary.Προσθήκη "MyItem2", 20MyDictionary.Προσθήκη "MyItem3", 30Για n = 0 στο MyDictionary.Count - 1MsgBox MyDictionary.Keys (n) & "" & MyDictionary. Στοιχεία (n)Επόμενο nΤέλος υπο

Αυτός ο κώδικας δημιουργεί ένα νέο αντικείμενο λεξικού που ονομάζεται «MyDictionary» και στη συνέχεια το συμπληρώνει με τρία στοιχεία. Η μέθοδος Προσθήκη έχει δύο παραμέτρους - Key και Item, και απαιτούνται και οι δύο

Οι τύποι δεδομένων για το κλειδί και το στοιχείο είναι και οι δύο παραλλαγές, έτσι ώστε να δέχονται κάθε είδους δεδομένα - αριθμητικά, κείμενο, ημερομηνία κ.λπ.

Το πρώτο στοιχείο στο λεξικό θα μπορούσε να προστεθεί ως:

1 MyDictionary.Προσθέστε 10, "MyItem1"

Οι τιμές έχουν αντιστραφεί μεταξύ Key και Item, αλλά αυτό θα εξακολουθούσε να λειτουργεί, αν και το κλειδί αναζήτησης θα γινόταν τώρα 10.

Ωστόσο, είναι σημαντικό να κατανοήσουμε ότι η βασική τιμή είναι η τιμή αναζήτησης στο λεξικό. Λειτουργεί με πολύ παρόμοιο τρόπο με τη λειτουργία VLOOKUP στο Excel. Επειδή όλα τα κλειδιά πρέπει να έχουν μοναδικές τιμές, μπορείτε να καθορίσετε μια τιμή κλειδιού και να επιστρέψετε αμέσως την τιμή του στοιχείου για αυτό το κλειδί.

Λάβετε υπόψη ότι το ευρετήριο λεξικού ξεκινά από το 0, οπότε πρέπει να αφαιρέσετε το 1 από τον αριθμό λεξικού που χρησιμοποιείται στον βρόχο Για… Επόμενο

Μπορείτε επίσης να χρησιμοποιήσετε έναν βρόχο Για … Κάθε βρόχο για να διαβάσετε τις τιμές στο λεξικό:

1234567891011 Sub PopulateReadDictionary ()Dim MyDictionary As New Scripting. Dictionary, I As VariantMyDictionary.Προσθήκη "MyItem1", 10MyDictionary.Προσθήκη "MyItem2", 20MyDictionary.Προσθήκη "MyItem3", 30Για κάθε I In MyDictionary.KeysMsgBox I & "" & MyDictionary (I)Στη συνέχεια εγώΤέλος υπο

Αυτός ο κωδικός θα επαναλαμβάνεται σε κάθε στοιχείο και θα εμφανίζει το κλειδί στοιχείου και την τιμή του στοιχείου

Χρήση του αριθμού ευρετηρίου αντικειμένων

Μπορείτε να χρησιμοποιήσετε τον αριθμό ευρετηρίου ενός κλειδιού ή στοιχείου για να διαβάσετε την τιμή

123456789101112 Sub IndexNumbers ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.CompareMode = Σύγκριση κειμένουMyDictionary.Προσθήκη "Item1", 10MyDictionary.Προσθήκη "Item2", 20MyDictionary.Προσθήκη "Item3", 30MsgBox MyDictionary.Keys (2)MsgBox MyDictionary. Στοιχεία (1)Τέλος υπο

Αυτός ο κωδικός θα επιστρέψει το κλειδί ‘item3’ καθώς ο δείκτης ξεκινά από το 0 και την τιμή του στοιχείου 20

Μπορείτε να ανατρέξετε σε μεμονωμένες τιμές κλειδιού ή στοιχείου στις συλλογές Κλειδιά ή Στοιχεία χρησιμοποιώντας τους αριθμούς ευρετηρίου.

Φιλτράρισμα του Λεξικού

Δεν υπάρχει άμεση μέθοδος για να το κάνετε αυτό, αλλά είναι πολύ απλό να γράψετε κώδικα για να το κάνετε:

1234567891011 Sub FilterDictionary ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "AAItem1", 10MyDictionary.Προσθήκη "BBItem2", 20MyDictionary.Προσθήκη "BBItem3", 30Για κάθε I In Filter (MyDictionary.Keys, "BB")MsgBox MyDictionary.Item (I)Στη συνέχεια εγώΤέλος υπο

Η τιμή του φίλτρου λειτουργεί μόνο από την αρχή της τιμής κλειδιού. Δεν μπορείτε να χρησιμοποιήσετε μπαλαντέρ στο φίλτρο. Αυτός ο κωδικός θα επιστρέψει τις δύο τιμές στοιχείων με ονόματα κλειδιών που αρχίζουν με "BB"

Αυτό θα σας δώσει ένα υποσύνολο του λεξικού με βάση την τιμή του φίλτρου σας, το οποίο μπορείτε στη συνέχεια να μεταφέρετε σε άλλο λεξικό ή σε ένα φύλλο εργασίας. Με προσεκτικό προγραμματισμό ονομάτων κλειδιών, διασφαλίζοντας ότι υπάρχει ένα ουσιαστικό πρόθεμα σε καθένα, θα μπορείτε εύκολα να χωρίσετε το λεξικό σε διάφορα συστατικά μέρη.

Αλλαγή τιμής στοιχείου κλειδιού

Το αντικείμενο του λεξικού έχει ένα μεγάλο πλεονέκτημα έναντι μιας συλλογής στο ότι η τιμή του στοιχείου μπορεί να αλλάξει π.χ.

1 MyDictionary ("MyItem4") = "40"

Στη συλλογή, θα πρέπει να διαγράψετε αυτήν την καταχώρηση και στη συνέχεια να την δημιουργήσετε ξανά.

Εδώ είναι ένα παράδειγμα κώδικα:

12345678910111213 Sub PopulateReadDictionary ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "MyItem1", 10MyDictionary.Προσθήκη "MyItem2", 20MyDictionary.Προσθήκη "MyItem3", 30MyDictionary ("MyItem2") = "25"MyDictionary ("MyItem4") = "40"Για n = 0 στο MyDictionary.Count - 1MsgBox MyDictionary.Keys (n) & "" & MyDictionary. Στοιχεία (n)Επόμενο nΤέλος υπο

Ο παραπάνω κώδικας ορίζει τρία στοιχεία στο λεξικό και στη συνέχεια αλλάζει την τιμή του «MyItem2» από 20 σε 25.

Αλλάζει επίσης την τιμή του «MyItem4» σε 40. Σημειώστε ότι στις δηλώσεις προσθήκης του κώδικα δεν προστέθηκε «MyItem4». Όταν αλλάζετε την τιμή ενός κλειδιού που δεν υπάρχει, δημιουργείται αυτόματα. Αυτό είναι εξαιρετικά βολικό, καθώς δεν ενεργοποιείται κανένα σφάλμα, αλλά σημαίνει ότι πρέπει να είστε προσεκτικοί με τα ονόματα των κλειδιών σας. Ένα ακούσιο ορθογραφικό λάθος στο όνομα κλειδιού θα σήμαινε ότι δημιουργείται ένα νέο κλειδί και το αρχικό όνομα κλειδιού θα εξακολουθεί να έχει την παλιά τιμή.

Αυτό θα μπορούσε εύκολα να οδηγήσει σε προβλήματα ακεραιότητας στο αντικείμενο του λεξικού.

Δοκιμάστε αν υπάρχει κλειδί

Μπορείτε να ελέγξετε εάν υπάρχει μια τιμή κλειδιού μέσα στο λεξικό

123456789 Sub CheckExistsDictionary ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "MyItem1", 10MyDictionary.Προσθήκη "MyItem2", 20MyDictionary.Προσθήκη "MyItem3", 30MsgBox MyDictionary.Exists ("MyItem8")Τέλος υπο

Ο κώδικας προσθέτει τρία στοιχεία σε ένα νέο αντικείμενο λεξικού και στη συνέχεια δοκιμάζει για ένα κλειδί («MyItem8») που δεν υπάρχει στο λεξικό. Αυτό επιστρέφει False, αλλά αν χρησιμοποιηθεί ένα από τα υπάρχοντα κλειδιά, θα επιστρέψει True

Οι μπαλαντέρ δεν γίνονται δεκτές. Το κείμενο αναζήτησης είναι επίσης κεφαλαίο από προεπιλογή, αλλά αυτό μπορεί να αλλάξει (δείτε αργότερα στο άρθρο)

Χρήση πολλαπλών τιμών σε ένα λεξικό

Σε αντίθεση με έναν πίνακα, το αντικείμενο του λεξικού είναι μονοδιάστατο. Αυτό μπορεί να οδηγήσει σε προβλήματα εάν έχετε αρκετές τιμές που θέλετε να τοποθετήσετε ως κλειδί.

Ένας τρόπος είναι να συνδέσετε κάθε τιμή στοιχείου χρησιμοποιώντας έναν χαρακτήρα οριοθέτησης μεταξύ κάθε τιμής π.χ. ‘|’

12345678910111213141516171819202122232425262728293031323334 Sub MultipleValues ​​()«Δημιουργία αντικειμένου λεξικού και μεταβλητώνDim MyDictionary As New Scripting. Dictionary, V1 As Integer, V2 As StringDim V3 ως ημερομηνία, Temp ως συμβολοσειρά, N ως ακέραιος"Συμπληρώστε 3 μεταβλητές για να επιδείξετε πολλαπλές τιμέςV1 = 5V2 = "Παράδειγμα πολλαπλών τιμών"V3 = "22-Ιουλ-2020""Προσθέστε τη συνδεδεμένη τιμή στο λεξικό χρησιμοποιώντας το" | " οριοθετητήςMyDictionary.Add "MyMultipleItem", V1 & "|" & V2 & "|" & V3 & "|"«Αποτυπώστε τη συνοπτική τιμή λεξικού από το λεξικό σε μια μεταβλητήTemp = MyDictionary ("MyMultipleItem")«Επαναλάβετε τη συνδυασμένη συμβολοσειρά για να διαχωρίσετε τις μεμονωμένες αξίεςΚάνω«Βρείτε τη θέση ενός οριοθέτηN = InStr (Temp, "|")«Εάν δεν υπάρχουν πλέον οριοθέτες, ο βρόχος εξόδου DoΑν N = 0 Τότε Έξοδος Do'Εμφάνιση κειμένου σε σχέση με τη θέση του οριοθέτη που βρέθηκεMsgBox Αριστερά (Temp, N - 1)"Περικοπή της συνδεδεμένης συμβολοσειράς στον επόμενο χαρακτήρα μετά την εύρεση του οριοθέτηTemp = Mid (Temp, N + 1)ΒρόχοςΤέλος υπο

Ένας άλλος τρόπος για να αντιμετωπίσετε αυτό το πρόβλημα είναι να σχεδιάσετε το δικό σας σύστημα υπο-δέσμης ενεργειών για ονόματα κλειδιών. Δεν υπάρχει λόγος να μην χρησιμοποιείτε αγκύλες και αριθμούς σε ονόματα κλειδιών

1234567891011 Sub MultipleValues ​​()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "Multiple (1)", 5MyDictionary.Add "Multiple (2)", "Παράδειγμα πολλαπλών τιμών"MyDictionary.Add "Multiple (3)", "22-Jul-2020"Για Ν = 1 έως 3MsgBox MyDictionary ("Πολλαπλά (" & N & ")")Επόμενο ΝΤέλος υπο

Αυτός ο κώδικας προσθέτει τρία κλειδιά στο λεξικό, αλλά κάθε όνομα κλειδιού περιέχει έναν αριθμό δευτερεύοντος σεναρίου σε αγκύλες. Στη συνέχεια, μπορείτε να ανατρέξετε στο όνομα κλειδιού, αλλά χρησιμοποιώντας τον αριθμό δευτερεύοντος σεναρίου που είναι συνδεδεμένος. Αυτό μοιάζει πολύ με τη χρήση αντικειμένου πίνακα

Διαγραφή στοιχείων

Μπορείτε να αφαιρέσετε μεμονωμένα στοιχεία με αναφορά στην τιμή κλειδιού

1 MyDictionary.Remove ("MyItem2")

Λάβετε υπόψη ότι επειδή τα ονόματα κλειδιών είναι μοναδικά, αυτό καταργεί μόνο αυτό το συγκεκριμένο κλειδί και τιμή στοιχείου

Μπορείτε επίσης να διαγράψετε εντελώς το λεξικό

1 MyDictionary.RemoveAll

Ακολουθεί ένα παράδειγμα χρήσης του "Remove" στο VBA:

12345678910111213141516 Sub RemoveValues ​​()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "Item1", 10MyDictionary.Προσθήκη "Item2", 20MyDictionary.Προσθήκη "Item3", 30MyDictionary.Remove ("Item2")Για N = 0 Στο MyDictionary.Count - 1MsgBox MyDictionary.Keys (N) & "" & MyDictionary. Στοιχεία (N)Επόμενο ΝMyDictionary.RemoveAllMsgBox MyDictionary.CountΤέλος υπο

Ο κώδικας προσθέτει τρία στοιχεία στο λεξικό και στη συνέχεια καταργεί το "Item2". Στη συνέχεια, επαναλαμβάνεται μέσω του λεξικού για να αποδείξει ότι το "Item2" δεν υπάρχει πλέον

Τέλος, ο κώδικας αφαιρεί όλα τα στοιχεία στο λεξικό και εμφανίζει την καταμέτρηση του λεξικού, η οποία είναι πλέον μηδενική.

Αλλαγή ευαισθησίας πεζών για αναζητήσεις

Εάν κάνετε αναζήτηση για ένα κλειδί, είναι από προεπιλογή ευαίσθητο σε πεζά. Ωστόσο, μπορείτε να χρησιμοποιήσετε την ιδιότητα "CompareMode" για να το αλλάξετε.

Λάβετε υπόψη ότι αυτό πρέπει να γίνει αμέσως στον κώδικα αφού δημιουργήσετε το αντικείμενο του λεξικού, αλλά πριν προσθέσετε οποιαδήποτε δεδομένα στο λεξικό. Μόλις οριστεί η λειτουργία σύγκρισης, δεν μπορεί να αλλάξει μέσα σε αυτό το λεξικό.

12345678910 Sub ChangeCaseSensitivity ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.CompareMode = Σύγκριση κειμένουMyDictionary.Προσθήκη "Item1", 10MyDictionary.Προσθήκη "Item2", 20MyDictionary.Προσθήκη "Item3", 30MsgBox MyDictionary.Exists ("item2")Τέλος υπο

Σε αυτό το παράδειγμα, η λειτουργία σύγκρισης έχει οριστεί σε "TextCompare", πράγμα που σημαίνει ότι δεν έχει διάκριση πεζών -κεφαλαίων. Η δήλωση «Υπάρχει» στο τέλος του παραδείγματος θα επιστρέψει True, παρά το γεγονός ότι το κείμενο αναζήτησης είναι όλα πεζά.

Στο Excel υπάρχουν μόνο δύο τιμές που μπορούν να χρησιμοποιηθούν για τη λειτουργία σύγκρισης. Η δυαδική σύγκριση έχει διάκριση πεζών -κεφαλαίων και η σύγκριση κειμένου είναι μη διάκριση πεζών -κεφαλαίων

Εάν έχετε ορίσει τη λειτουργία σύγκρισης σε Δυαδική σύγκριση, πρέπει να είστε προσεκτικοί στην ονομασία των κλειδιών σας. Εάν ορίσετε ένα όνομα για να έχει ένα κεφαλαίο γράμμα ως πρώτο χαρακτήρα, τότε όταν αλλάζετε την τιμή, πρέπει να βεβαιωθείτε ότι εξακολουθείτε να κάνετε τον πρώτο χαρακτήρα κεφαλαίο. Αν ξεκινήσετε με πεζό χαρακτήρα, αυτό θα ερμηνευτεί ως νέο κλειδί και θα μπορούσε εύκολα να προκαλέσει σύγχυση και σφάλματα στο λεξικό σας

Θυμηθείτε ότι εάν αλλάξετε μια τιμή για ένα κλειδί και το όνομα κλειδιού δεν υπάρχει λόγω της χρήσης δυαδικής σύγκρισης, ένα νέο κλειδί και τιμή θα προστεθούν στο λεξικό.

Εάν χρησιμοποιείτε Αντίθεση κειμένου αντ 'αυτού, τότε τυχόν αλλαγές τιμής θα μεταβούν στο κλειδί ανεξάρτητα από περίπτωση. Εάν προσπαθήσετε να προσθέσετε το ίδιο στοιχείο αλλά με διαφορετικό χαρακτήρα πεζών, θα λάβετε ένα σφάλμα επειδή υπάρχει ήδη.

Ταξινόμηση του Λεξικού

Όπως και με το αντικείμενο συλλογής, δεν παρέχεται μέθοδος για να μπορείτε να ταξινομήσετε το λεξικό, είτε χρησιμοποιώντας κλειδιά είτε τιμές στοιχείων.

Ωστόσο, δεδομένου ότι ο κώδικας VBA βρίσκεται σε ένα βιβλίο εργασίας του Excel, τα δεδομένα του λεξικού μπορούν να μεταφερθούν στο Excel σε μορφή πίνακα και, στη συνέχεια, η δυνατότητα ταξινόμησης Excel μπορεί να εφαρμοστεί σε αυτό. Το λεξικό μπορεί στη συνέχεια να διαγραφεί χρησιμοποιώντας το "RemoveAll" και τις ταξινομημένες τιμές που προστίθενται από το φύλλο εργασίας.

Αυτός ο κώδικας θα ταξινομήσει τόσο τα κλειδιά όσο και τις τιμές των στοιχείων

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 Sub SortMyDictionary ()Dim MyDictionary As New DictionaryDim Counter Όσο καιρό«Δημιουργία λεξικού με στοιχεία τυχαίας παραγγελίαςMyDictionary.Προσθήκη "Item5", 5MyDictionary.Προσθήκη "Item2", 15MyDictionary.Προσθήκη "Item4", 11MyDictionary.Προσθήκη "Item1", 2MyDictionary.Προσθήκη "Item3", 19«Αποτυπώστε αριθμό στοιχείων στο λεξικό για μελλοντική χρήσηΜετρητής = MyDictionary.Count«Επανάληψη μέσω λεξικού αντιγράφοντας κάθε κλειδί και στοιχείο σε ένα διαδοχικό κελί στο" Sheet1 "(στήλη A)Για N = 0 Στο MyDictionary.Count - 1Φύλλα ("Φύλλο1"). Κελιά (Ν + 1, 1) = MyDictionary.Keys (Β)Φύλλα ("Φύλλο1"). Κελιά (Ν + 1, 2) = MyDictionary. Στοιχεία (Β)Επόμενο Ν«Ενεργοποιήστε το Sheet1 και χρησιμοποιήστε τη ρουτίνα ταξινόμησης Excel για να ταξινομήσετε τα δεδομένα σε αύξουσα σειράΦύλλα ("Φύλλο1"). ΕνεργοποιήστεΕύρος ("A1: B" & MyDictionary.Count). ΕπιλέξτεActiveWorkbook.Worksheets ("Sheet1"). Sort.SortFields.ClearActiveWorkbook.Worksheets ("Sheet1"). Sort.SortFields.Add2 Key: = Range (_"A1: A5"), SortOn: = xlSortOnValues, Order: = xlΑύξουσα, DataOption: = _xlSortNormalΜε ActiveWorkbook.Worksheets ("Sheet1"). Ταξινόμηση.SetRange Range ("A1: A5").Header = xlGuess.MatchCase = Λάθος. Προσανατολισμός = xlTopToBottom.SortMethod = xlPinYin.ΙσχύουνΤέλος με«Διαγράψτε όλα τα στοιχεία από το λεξικόMyDictionary.RemoveAll"Αντιγράψτε τις τιμές κελιού πίσω στο κενό αντικείμενο λεξικού χρησιμοποιώντας την αποθηκευμένη τιμή (Counter) για τον βρόχο"Για N = 1 Για να μετρήσετεMyDictionary. Προσθήκη φύλλων ("Φύλλο 1"). Κελιά (Ν, 1). Αξία, Φύλλα ("Φύλλο 1"). Κελιά (Ν, 2). ΑξίαΕπόμενο Ν«Επαναλάβετε το λεξικό για να αποδείξετε τη σειρά με την οποία βρίσκονται τώρα τα αντικείμεναΓια N = 0 Στο MyDictionary.Count - 1MsgBox MyDictionary.Keys (N) & "" & MyDictionary. Στοιχεία (N)Επόμενο Ν«Διαγράψτε το φύλλο εργασίας (Φύλλο 1) - εάν είναι απαραίτητο, διαγράψτε το επίσηςΦύλλα ("Sheet1"). Range (Cells (1, 1), Cells (Counter, 2)). ClearΤέλος υπο

Αυτός ο κώδικας δημιουργεί ένα λεξικό με πέντε προστιθέμενες τιμές τυχαίας παραγγελίας. Καταγράφει τον αριθμό των στοιχείων σε μια μεταβλητή και στη συνέχεια επαναλαμβάνεται μέσω του λεξικού, μεταφέροντας τις τιμές κλειδιού και στοιχείου σε ξεχωριστές στήλες σε ένα φύλλο εργασίας.

Στη συνέχεια, ταξινομεί το εύρος λήψης, χρησιμοποιώντας τη στήλη Α ως πεδίο ταξινόμησης. Το λεξικό διαγράφεται πλήρως χρησιμοποιώντας τη μέθοδο "RemoveAll" και ο κώδικας στη συνέχεια επαναλαμβάνεται μέσω των τιμών κελιών στο φύλλο εργασίας προσθέτοντάς τα ξανά στο λεξικό.

Τέλος, ο κώδικας επαναλαμβάνεται μέσω του λεξικού, εμφανίζοντας τις τιμές κλειδιού και στοιχείου που συνδέονται για να αποδείξουν ότι η ταξινόμηση έχει λειτουργήσει.

Αλλάζοντας τις παραμέτρους στον κώδικα ταξινόμησης, τα δεδομένα θα μπορούσαν να ταξινομηθούν κατά τιμές στοιχείων.

Αντιγραφή λίστας κλειδιών σε φύλλο εργασίας

Μπορείτε να αντιγράψετε μια λίστα με όλες τις βασικές τιμές σε ένα φύλλο εργασίας χρησιμοποιώντας τον ακόλουθο κώδικα:

12345678910 Sub CopyKeyList ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.CompareMode = Σύγκριση κειμένουMyDictionary.Προσθήκη "Item1", 10MyDictionary.Προσθήκη "Item2", 20MyDictionary.Προσθήκη "Item3", 30Φύλλα ("Sheet1"). Range ("A1"). Value = Join (MyDictionary.Keys, vbLf)Τέλος υπο

Αυτό θα παράγει το αποτέλεσμα στο φύλλο εργασίας σας:

Μπορείτε να αντιγράψετε ένα ολόκληρο λεξικό σε ένα φύλλο εργασίας χρησιμοποιώντας αυτόν τον κωδικό:

12345678910 Sub CopyIntoWorksheet ()Dim MyDictionary As New Scripting. DictionaryMyDictionary.Προσθήκη "Item1", 10MyDictionary.Προσθήκη "Item2", 20MyDictionary.Προσθήκη "Item3", 30Εύρος ("A1"). Αλλαγή μεγέθους (MyDictionary.Count, 1) = WorksheetFunction.Transpose (MyDictionary.Keys)Εύρος ("B1"). Αλλαγή μεγέθους (MyDictionary.Count, 1) = WorksheetFunction.Transpose (MyDictionary.Items)Τέλος υπο

Το φύλλο εργασίας σας θα μοιάζει με αυτό:

Σύγκριση λεξικού με συλλογή

Το Λεξικό είναι πιο γρήγορο από μια συλλογή.

Μια Συλλογή βρίσκεται ήδη στο VBA. Ένα λεξικό χρειάζεται μια αναφορά στο Λεξικό δέσμης ενεργειών της Microsoft για να προστεθεί ή ένα αντικείμενο που δημιουργήθηκε με καθυστερημένη σύνδεση

Ένα στοιχείο συλλογής μπορεί να γραφτεί μόνο μία φορά και να διαβαστεί πολλές φορές. Σε ένα Λεξικό, η τιμή του στοιχείου μπορεί να αλλάξει. Με μια Συλλογή, το στοιχείο πρέπει να αφαιρεθεί και, στη συνέχεια, το αλλαγμένο στοιχείο να προστεθεί ξανά.

Η Συλλογή λειτουργεί σε τιμές ευρετηρίου, οι οποίες μπορεί να είναι δύσκολο να υπολογιστούν ποια τιμή ευρετηρίου ανήκει πού. Το Λεξικό λειτουργεί σε μοναδικές βασικές τιμές που χρησιμοποιούνται για τον εντοπισμό ενός στοιχείου

Η ανάκτηση ενός μόνο στοιχείου είναι πιο αργή σε μια μεγάλη συλλογή από ό, τι σε ένα Λεξικό

Σε μια Συλλογή, τα κλειδιά χρησιμοποιούνται μόνο για την αναζήτηση δεδομένων και δεν είναι ανακτήσιμα. Σε ένα λεξικό, τα κλειδιά μπορούν να ελεγχθούν για ύπαρξη και μπορούν να χρησιμοποιηθούν για την εύρεση ενός συγκεκριμένου στοιχείου.

Οι συλλογές έχουν διάκριση πεζών-κεφαλαίων και αυτό δεν μπορεί να αλλάξει. Σε ένα Λεξικό, η λειτουργία σύγκρισης μπορεί να ρυθμιστεί ώστε να δίνει ευαισθησία πεζών ή μη πεζών

Σε μια Συλλογή, οι βασικές τιμές πρέπει να είναι συμβολοσειρές. Σε ένα Λεξικό μπορεί να είναι οποιοσδήποτε τύπος δεδομένων π.χ. αριθμητική, ημερομηνία κλπ

Η αφαίρεση όλων των στοιχείων σε μια Συλλογή συνεπάγεται τον επαναπροσδιορισμό του αντικειμένου Συλλογής. Το Λεξικό έχει τη μέθοδο "RemoveAll" για αυτό.

Θα βοηθήσει στην ανάπτυξη του τόπου, μοιράζονται τη σελίδα με τους φίλους σας

wave wave wave wave wave