- Εκδηλώσεις Excel VBA - Εισαγωγή
- Διαφορετικοί τύποι εκδηλώσεων Excel VBA
- Πού να τοποθετήσετε τον κώδικα που σχετίζεται με το συμβάν
- Κατανόηση της ακολουθίας συμβάντων
- Κατανόηση του ρόλου των επιχειρημάτων στις εκδηλώσεις VBA
- Εκδηλώσεις επιπέδου βιβλίου εργασίας (εξηγούνται με παραδείγματα)
- Εκδηλώσεις σε επίπεδο φύλλου εργασίας (εξηγούνται με παραδείγματα)
- Excel VBA OnTime Event
- Excel VBA OnKey Event
- Απενεργοποίηση συμβάντων στο VBA
- Αποτέλεσμα των γεγονότων Αναίρεση στοίβας
Όταν δημιουργείτε ή καταγράφετε μια μακροεντολή στο Excel, πρέπει να εκτελέσετε τη μακροεντολή για να εκτελέσετε τα βήματα του κώδικα.
Μερικοί τρόποι εκτέλεσης μιας μακροεντολής περιλαμβάνουν τη χρήση του πλαισίου διαλόγου μακροεντολής, την εκχώρηση της μακροεντολής σε ένα κουμπί, τη χρήση μιας συντόμευσης κ.λπ.
Εκτός από αυτές τις εκτελέσεις μακροεντολών που ξεκινούν από το χρήστη, μπορείτε επίσης να χρησιμοποιήσετε συμβάντα VBA για να εκτελέσετε τη μακροεντολή.
Εκδηλώσεις Excel VBA - Εισαγωγή
Επιτρέψτε μου πρώτα να εξηγήσω τι είναι ένα γεγονός στο VBA.
Ένα συμβάν είναι μια ενέργεια που μπορεί να ενεργοποιήσει την εκτέλεση της καθορισμένης μακροεντολής.
Για παράδειγμα, όταν ανοίγετε ένα νέο βιβλίο εργασίας, είναι ένα συμβάν. Όταν εισάγετε ένα νέο φύλλο εργασίας, είναι ένα συμβάν. Όταν κάνετε διπλό κλικ σε ένα κελί, είναι ένα συμβάν.
Υπάρχουν πολλά τέτοια συμβάντα στο VBA και μπορείτε να δημιουργήσετε κωδικούς για αυτά τα συμβάντα. Αυτό σημαίνει ότι μόλις συμβεί ένα συμβάν και αν έχετε ορίσει έναν κωδικό για αυτό το συμβάν, ο κώδικας αυτός θα εκτελεστεί αμέσως.
Το Excel το κάνει αυτόματα μόλις παρατηρήσει ότι έχει πραγματοποιηθεί ένα συμβάν. Επομένως, χρειάζεται μόνο να γράψετε τον κώδικα και να τον τοποθετήσετε στη σωστή υπορουτίνα συμβάντων (αυτό καλύπτεται αργότερα σε αυτό το άρθρο).
Για παράδειγμα, εάν εισαγάγετε ένα νέο φύλλο εργασίας και θέλετε να έχει πρόθεμα έτους, μπορείτε να γράψετε τον κωδικό για αυτό.
Τώρα, κάθε φορά που κάποιος εισάγει ένα νέο φύλλο εργασίας, αυτός ο κώδικας θα εκτελεστεί αυτόματα και θα προσθέσει το πρόθεμα έτους στο όνομα του φύλλου εργασίας.
Ένα άλλο παράδειγμα θα μπορούσε να είναι ότι θέλετε να αλλάξετε το χρώμα του κελιού όταν κάποιος κάνει διπλό κλικ σε αυτό. Μπορείτε να χρησιμοποιήσετε το συμβάν διπλού κλικ για αυτό.
Ομοίως, μπορείτε να δημιουργήσετε κωδικούς VBA για πολλά τέτοια γεγονότα (όπως θα δούμε αργότερα σε αυτό το άρθρο).
Παρακάτω είναι μια σύντομη απεικόνιση που δείχνει το γεγονός του διπλού κλικ σε δράση. Μόλις κάνω διπλό κλικ στο κελί Α1. Το Excel ανοίγει αμέσως ένα πλαίσιο μηνυμάτων που δείχνει τη διεύθυνση του κελιού.
Το διπλό κλικ είναι ένα συμβάν και η εμφάνιση του πλαισίου μηνυμάτων είναι αυτό που έχω καθορίσει στον κώδικα κάθε φορά που λαμβάνει χώρα το συμβάν διπλού κλικ.
Ενώ το παραπάνω παράδειγμα είναι ένα άχρηστο γεγονός, ελπίζω να σας βοηθήσει να καταλάβετε τι είναι πραγματικά τα γεγονότα.
Διαφορετικοί τύποι εκδηλώσεων Excel VBA
Υπάρχουν διαφορετικά αντικείμενα στο Excel - όπως το ίδιο το Excel (στο οποίο συχνά αναφερόμαστε ως εφαρμογή), βιβλία εργασίας, φύλλα εργασίας, γραφήματα κ.λπ.
Κάθε ένα από αυτά τα αντικείμενα μπορεί να έχει διάφορα γεγονότα που σχετίζονται με αυτό. Για παράδειγμα:
- Εάν δημιουργήσετε ένα νέο βιβλίο εργασίας, είναι ένα συμβάν σε επίπεδο εφαρμογής.
- Εάν προσθέσετε ένα νέο φύλλο εργασίας, είναι ένα συμβάν σε επίπεδο βιβλίου εργασίας.
- Εάν αλλάξετε την τιμή σε ένα κελί σε ένα φύλλο, είναι ένα συμβάν σε επίπεδο φύλλου εργασίας.
Παρακάτω είναι οι διαφορετικοί τύποι συμβάντων που υπάρχουν στο Excel:
- Εκδηλώσεις σε επίπεδο φύλλου εργασίας: Αυτοί είναι οι τύποι συμβάντων που θα ενεργοποιηθούν με βάση τις ενέργειες που έγιναν στο φύλλο εργασίας. Παραδείγματα αυτών των συμβάντων περιλαμβάνουν αλλαγή κελιού στο φύλλο εργασίας, αλλαγή επιλογής, διπλό κλικ σε κελί, δεξί κλικ σε κελί κ.λπ.
- Εκδηλώσεις επιπέδου τετραδίου εργασίας: Αυτά τα γεγονότα θα ενεργοποιηθούν με βάση τις ενέργειες σε επίπεδο βιβλίου εργασίας. Παραδείγματα αυτών των εκδηλώσεων περιλαμβάνουν την προσθήκη ενός νέου φύλλου εργασίας, την αποθήκευση του βιβλίου εργασίας, το άνοιγμα του βιβλίου εργασίας, την εκτύπωση ενός μέρους ή ολόκληρου του βιβλίου εργασίας κ.λπ.
- Εκδηλώσεις σε επίπεδο εφαρμογής: Αυτά είναι τα συμβάντα που συμβαίνουν στην εφαρμογή Excel. Παράδειγμα αυτών θα περιλαμβάνει το κλείσιμο οποιουδήποτε από τα ανοιχτά βιβλία εργασίας ή το άνοιγμα ενός νέου βιβλίου εργασίας.
- Συμβάντα επιπέδου UserForm: Αυτά τα συμβάντα θα ενεργοποιηθούν με βάση τις ενέργειες στο «UserForm». Παραδείγματα αυτών περιλαμβάνουν την προετοιμασία ενός UserForm ή το κλικ σε ένα κουμπί στο UserForm.
- Εκδηλώσεις γραφήματος: Αυτά είναι γεγονότα που σχετίζονται με το φύλλο γραφήματος. Ένα φύλλο γραφήματος είναι διαφορετικό από ένα φύλλο εργασίας (όπου οι περισσότεροι από εμάς έχουμε συνηθίσει να δουλεύουμε στο Excel). Ο σκοπός ενός φύλλου γραφήματος είναι να κρατήσει ένα γράφημα. Παραδείγματα τέτοιων συμβάντων θα περιλαμβάνουν την αλλαγή της σειράς του γραφήματος ή την αλλαγή μεγέθους του γραφήματος.
- OnTime και OnKey Events: Αυτά είναι δύο γεγονότα που δεν ταιριάζουν σε καμία από τις παραπάνω κατηγορίες. Αυτά λοιπόν τα έχω παραθέσει ξεχωριστά. Το συμβάν «OnTime» σάς επιτρέπει να εκτελέσετε έναν κώδικα σε μια συγκεκριμένη ώρα ή αφού παρέλθει μια συγκεκριμένη ώρα. Το συμβάν «OnKey» σας επιτρέπει να εκτελέσετε έναν κώδικα όταν χρησιμοποιείται ένα συγκεκριμένο πάτημα πλήκτρου (ή ένας συνδυασμός πληκτρολογήσεων).
Πού να τοποθετήσετε τον κώδικα που σχετίζεται με το συμβάν
Στην παραπάνω ενότητα, κάλυψα τους διαφορετικούς τύπους εκδηλώσεων.
Με βάση τον τύπο του συμβάντος, πρέπει να βάλετε τον κώδικα στο σχετικό αντικείμενο.
Για παράδειγμα, εάν πρόκειται για συμβάν που σχετίζεται με φύλλο εργασίας, θα πρέπει να μπει στο παράθυρο κώδικα του αντικειμένου φύλλου εργασίας. Εάν σχετίζεται με το βιβλίο εργασίας, θα πρέπει να μεταβεί στο παράθυρο κώδικα για ένα αντικείμενο βιβλίου εργασίας.
Στο VBA, διαφορετικά αντικείμενα - όπως φύλλα εργασίας, βιβλία εργασίας, φύλλα γραφήματος, UserForms, κ.λπ., έχουν τα δικά τους παράθυρα κώδικα. Πρέπει να βάλετε τον κωδικό συμβάντος στο παράθυρο κωδικού του σχετικού αντικειμένου. Για παράδειγμα - εάν πρόκειται για συμβάν σε επίπεδο βιβλίου εργασίας, τότε πρέπει να έχετε τον κωδικό συμβάντος στο παράθυρο κωδικού του βιβλίου εργασίας.Οι ακόλουθες ενότητες καλύπτουν τα μέρη όπου μπορείτε να βάλετε τον κωδικό συμβάντος:
Στο παράθυρο κώδικα φύλλου εργασίας
Όταν ανοίγετε το πρόγραμμα επεξεργασίας VB (χρησιμοποιώντας συντόμευση πληκτρολογίου ALT + F11), θα παρατηρήσετε το αντικείμενο των φύλλων εργασίας στην Εξερεύνηση έργου. Για κάθε φύλλο εργασίας στο βιβλίο εργασίας, θα δείτε ένα αντικείμενο.
Όταν κάνετε διπλό κλικ στο αντικείμενο φύλλου εργασίας στο οποίο θέλετε να τοποθετήσετε τον κώδικα, θα ανοίξει το παράθυρο κώδικα για αυτό το φύλλο εργασίας.
Ενώ μπορείτε να ξεκινήσετε να γράφετε τον κώδικα από το μηδέν, είναι πολύ καλύτερο να επιλέξετε το συμβάν από μια λίστα επιλογών και να αφήσετε το VBA να εισαγάγει αυτόματα τον σχετικό κώδικα για το επιλεγμένο συμβάν.
Για να γίνει αυτό, πρέπει πρώτα να επιλέξετε φύλλο εργασίας από το αναπτυσσόμενο μενού επάνω αριστερά στο παράθυρο κώδικα.
Αφού επιλέξετε φύλλο εργασίας από το αναπτυσσόμενο μενού, λαμβάνετε μια λίστα με όλα τα συμβάντα που σχετίζονται με το φύλλο εργασίας. Μπορείτε να επιλέξετε αυτό που θέλετε να χρησιμοποιήσετε από το αναπτυσσόμενο μενού επάνω δεξιά στο παράθυρο κώδικα.
Μόλις επιλέξετε το συμβάν, θα εισάγει αυτόματα την πρώτη και τελευταία γραμμή του κώδικα για το επιλεγμένο συμβάν. Τώρα μπορείτε να προσθέσετε τον κωδικό σας ανάμεσα στις δύο γραμμές.
Σημείωση: Μόλις επιλέξετε Φύλλο εργασίας από το αναπτυσσόμενο μενού, θα παρατηρήσετε ότι δύο γραμμές κώδικα εμφανίζονται στο παράθυρο κώδικα. Αφού επιλέξετε το συμβάν για το οποίο θέλετε τον κωδικό, μπορείτε να διαγράψετε τις γραμμές που εμφανίστηκαν από προεπιλογή.
Σημειώστε ότι κάθε φύλλο εργασίας έχει ένα δικό του παράθυρο κώδικα. Όταν τοποθετήσετε τον κωδικό για το Sheet1, θα λειτουργήσει μόνο εάν το συμβάν συμβεί στο Sheet1.
Σε αυτό το παράθυρο κωδικού βιβλίου εργασίας
Ακριβώς όπως τα φύλλα εργασίας, εάν έχετε έναν κωδικό συμβάντος σε επίπεδο βιβλίου εργασίας, μπορείτε να τον τοποθετήσετε στο παράθυρο κώδικα ThisWorkbook.
Όταν κάνετε διπλό κλικ στο ThisWorkbook, θα ανοίξει το παράθυρο κώδικα για αυτό.
Πρέπει να επιλέξετε Βιβλίο εργασίας από το αναπτυσσόμενο μενού επάνω αριστερά στο παράθυρο κώδικα.
Αφού επιλέξετε το βιβλίο εργασίας από το αναπτυσσόμενο μενού, λαμβάνετε μια λίστα με όλα τα συμβάντα που σχετίζονται με το βιβλίο εργασίας. Μπορείτε να επιλέξετε αυτό που θέλετε να χρησιμοποιήσετε από το αναπτυσσόμενο μενού επάνω δεξιά στο παράθυρο κώδικα.
Μόλις επιλέξετε το συμβάν, θα εισάγει αυτόματα την πρώτη και τελευταία γραμμή του κώδικα για το επιλεγμένο συμβάν. Τώρα μπορείτε να προσθέσετε τον κωδικό σας ανάμεσα στις δύο γραμμές.
Σημείωση: Μόλις επιλέξετε το Βιβλίο εργασίας από το αναπτυσσόμενο μενού, θα παρατηρήσετε ότι δύο γραμμές κώδικα εμφανίζονται στο παράθυρο κώδικα. Αφού επιλέξετε το συμβάν για το οποίο θέλετε τον κωδικό, μπορείτε να διαγράψετε τις γραμμές που εμφανίστηκαν από προεπιλογή.
Στο παράθυρο κώδικα Userform
Όταν δημιουργείτε UserForms στο Excel, μπορείτε επίσης να χρησιμοποιήσετε συμβάντα UserForm για την εκτέλεση κωδικών βάσει συγκεκριμένων ενεργειών. Για παράδειγμα, μπορείτε να καθορίσετε έναν κωδικό που εκτελείται όταν κάνετε κλικ στο κουμπί.
Ενώ τα αντικείμενα φύλλου και τα αντικείμενα ThisWorkbook είναι ήδη διαθέσιμα όταν ανοίγετε το πρόγραμμα επεξεργασίας VB, το UserForm είναι κάτι που πρέπει να δημιουργήσετε πρώτα.
Για να δημιουργήσετε ένα UserForm, κάντε δεξί κλικ σε οποιοδήποτε από τα αντικείμενα, μεταβείτε στο Insert και κάντε κλικ στο UserForm.
Αυτό θα εισάγει ένα αντικείμενο UserForm στο βιβλίο εργασίας.
Όταν κάνετε διπλό κλικ στο UserForm (ή σε οποιοδήποτε αντικείμενο που προσθέτετε στο UserForm), θα ανοίξει το παράθυρο κώδικα για το UserForm.
Τώρα ακριβώς όπως τα φύλλα εργασίας ή το βιβλίο εργασίας, μπορείτε να επιλέξετε το συμβάν και θα εισαγάγει την πρώτη και την τελευταία γραμμή για αυτό το συμβάν. Στη συνέχεια, μπορείτε να προσθέσετε τον κώδικα στη μέση του.
Στο παράθυρο κωδικού γραφήματος
Στο Excel, μπορείτε επίσης να εισαγάγετε φύλλα γραφήματος (τα οποία είναι διαφορετικά από τα φύλλα εργασίας). Ένα φύλλο γραφημάτων προορίζεται να περιέχει μόνο γραφήματα.
Όταν εισαγάγετε ένα φύλλο γραφήματος, θα μπορείτε να δείτε το αντικείμενο του φύλλου γραφήματος στο πρόγραμμα επεξεργασίας VB.
Μπορείτε να προσθέσετε τον κωδικό συμβάντος στο παράθυρο κωδικού φύλλου γραφήματος όπως ακριβώς κάναμε στο φύλλο εργασίας.
Κάντε διπλό κλικ στο αντικείμενο φύλλου γραφήματος στην Εξερεύνηση έργου. Αυτό θα ανοίξει το παράθυρο κωδικού για το φύλλο γραφήματος.
Τώρα, πρέπει να επιλέξετε Διάγραμμα από το αναπτυσσόμενο μενού επάνω αριστερά στο παράθυρο κώδικα.
Αφού επιλέξετε το γράφημα από το αναπτυσσόμενο μενού, λαμβάνετε μια λίστα με όλα τα συμβάντα που σχετίζονται με το φύλλο γραφήματος. Μπορείτε να επιλέξετε αυτό που θέλετε να χρησιμοποιήσετε από το αναπτυσσόμενο μενού επάνω δεξιά στο παράθυρο κώδικα.
Σημείωση: Μόλις επιλέξετε Διάγραμμα από το αναπτυσσόμενο μενού, θα παρατηρήσετε ότι δύο γραμμές κώδικα εμφανίζονται στο παράθυρο κώδικα. Αφού επιλέξετε το συμβάν για το οποίο θέλετε τον κωδικό, μπορείτε να διαγράψετε τις γραμμές που εμφανίστηκαν από προεπιλογή.
Στην ενότητα τάξης
Οι ενότητες κλάσης πρέπει να εισαχθούν ακριβώς όπως το UserForms.
Μια ενότητα κλάσης μπορεί να περιέχει κώδικα που σχετίζεται με την εφαρμογή - που θα ήταν το ίδιο το Excel και τα ενσωματωμένα γραφήματα.
Θα καλύψω την ενότητα της τάξης ως ξεχωριστό σεμινάριο τις επόμενες εβδομάδες.
Σημειώστε ότι εκτός από τα συμβάντα OnTime και OnKey, κανένα από τα παραπάνω συμβάντα δεν μπορεί να αποθηκευτεί στην κανονική μονάδα VBA.Κατανόηση της ακολουθίας συμβάντων
Όταν ενεργοποιείτε ένα συμβάν, αυτό δεν συμβαίνει μεμονωμένα. Μπορεί επίσης να οδηγήσει σε μια ακολουθία πολλαπλών ενεργοποιήσεων.
Για παράδειγμα, όταν εισάγετε ένα νέο φύλλο εργασίας, συμβαίνουν τα εξής:
- Προστίθεται νέο φύλλο εργασίας
- Το προηγούμενο φύλλο εργασίας απενεργοποιείται
- Το νέο φύλλο εργασίας ενεργοποιείται
Ενώ στις περισσότερες περιπτώσεις, μπορεί να μην χρειάζεται να ανησυχείτε για την ακολουθία, εάν δημιουργείτε περίπλοκους κώδικες που βασίζονται σε γεγονότα, είναι καλύτερα να γνωρίζετε την ακολουθία για να αποφύγετε απροσδόκητα αποτελέσματα.
Κατανόηση του ρόλου των επιχειρημάτων στις εκδηλώσεις VBA
Πριν προχωρήσουμε σε παραδείγματα εκδηλώσεων και τα φοβερά πράγματα που μπορείτε να κάνετε με αυτό, υπάρχει μια σημαντική ιδέα που πρέπει να καλύψω.
Σε εκδηλώσεις VBA, θα υπάρχουν δύο τύποι κωδικών:
- Χωρίς κανένα επιχείρημα
- Με επιχειρήματα
Και σε αυτήν την ενότητα, θέλω να καλύψω γρήγορα το ρόλο των επιχειρημάτων.
Παρακάτω είναι ένας κώδικας που δεν περιέχει κανένα επιχείρημα (η παρένθεση είναι κενή):
Private Sub Workbook_Open () MsgBox "Θυμηθείτε να συμπληρώσετε το φύλλο χρόνου" Τέλος υπο
Με τον παραπάνω κώδικα, όταν ανοίγετε ένα βιβλίο εργασίας, απλώς εμφανίζεται ένα πλαίσιο μηνυμάτων με το μήνυμα - "Θυμηθείτε να συμπληρώσετε το φύλλο χρόνου".
Τώρα ας ρίξουμε μια ματιά σε έναν κώδικα που έχει ένα όρισμα.
Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Sh.Name End Sub
Ο παραπάνω κώδικας χρησιμοποιεί το όρισμα Sh που ορίζεται ως τύπος αντικειμένου. Το όρισμα Sh θα μπορούσε να είναι ένα φύλλο εργασίας ή ένα φύλλο γραφήματος, καθώς το παραπάνω συμβάν ενεργοποιείται όταν προστίθεται ένα νέο φύλλο.
Αντιστοιχίζοντας το νέο φύλλο που προστίθεται στο βιβλίο εργασίας στη μεταβλητή αντικειμένου Sh, το VBA μας επέτρεψε να το χρησιμοποιήσουμε στον κώδικα. Έτσι, για να αναφερθώ στο νέο όνομα φύλλου, μπορώ να χρησιμοποιήσω Sh.Name.
Η έννοια των επιχειρημάτων θα είναι χρήσιμη όταν εξετάσετε παραδείγματα εκδηλώσεων VBA στις επόμενες ενότητες.
Εκδηλώσεις επιπέδου βιβλίου εργασίας (εξηγούνται με παραδείγματα)
Ακολουθούν τα πιο συχνά χρησιμοποιούμενα συμβάντα σε ένα βιβλίο εργασίας.
ΟΝΟΜΑ ΕΚΔΗΛΩΣΗΣ | ΤΙ ΠΡΟΚΑΛΕΙ ΤΟ ΓΕΓΟΝΟΣ |
Θέτω εις ενέργειαν | Όταν είναι ενεργοποιημένο ένα βιβλίο εργασίας |
AfterSave | Όταν ένα βιβλίο εργασίας είναι εγκατεστημένο ως πρόσθετο |
BeforeSave | Όταν αποθηκεύεται ένα βιβλίο εργασίας |
Πριν Κλείσιμο | Όταν ένα βιβλίο εργασίας είναι κλειστό |
BeforePrint | Όταν εκτυπώνεται ένα βιβλίο εργασίας |
Απενεργοποιήστε | Όταν απενεργοποιείται ένα βιβλίο εργασίας |
NewSheet | Όταν προστίθεται ένα νέο φύλλο |
Ανοιξε | Όταν ανοίξει ένα βιβλίο εργασίας |
SheetActivate | Όταν είναι ενεργοποιημένο οποιοδήποτε φύλλο στο βιβλίο εργασίας |
SheetBeforeDelete | Όταν διαγράφεται οποιοδήποτε φύλλο |
SheetBeforeDoubleClick | Όταν κάνετε διπλό κλικ σε οποιοδήποτε φύλλο |
SheetBeforeRightClick | Όταν κάνετε δεξί κλικ σε οποιοδήποτε φύλλο |
SheetCalculate | Όταν οποιοδήποτε φύλλο υπολογίζεται ή επανυπολογίζεται |
SheetDeactivate | Όταν απενεργοποιείται ένα βιβλίο εργασίας |
SheetPivotTableUpdate | Όταν ενημερώνεται ένα βιβλίο εργασίας |
SheetSelectionChange | Όταν αλλάζει ένα βιβλίο εργασίας |
ΠαράθυροΕνεργοποίηση | Όταν είναι ενεργοποιημένο ένα βιβλίο εργασίας |
Παράθυρο Απενεργοποίηση | Όταν απενεργοποιείται ένα βιβλίο εργασίας |
Σημειώστε ότι αυτή δεν είναι μια πλήρης λίστα. Μπορείτε να βρείτε την πλήρη λίστα εδώ.
Θυμηθείτε ότι ο κώδικας για το συμβάν Workbook αποθηκεύεται στο παράθυρο κώδικα αντικειμένων ThisWorkbook.
Τώρα ας ρίξουμε μια ματιά σε μερικές χρήσιμες εκδηλώσεις βιβλίων εργασίας και να δούμε πώς μπορούν να χρησιμοποιηθούν στην καθημερινή σας εργασία.
Βιβλίο εργασίας ανοιχτή εκδήλωση
Ας υποθέσουμε ότι θέλετε να δείξετε στον χρήστη μια φιλική υπενθύμιση για να συμπληρώνει τα φύλλα ώρας του κάθε φορά που ανοίγει ένα συγκεκριμένο βιβλίο εργασίας.
Μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα για να το κάνετε αυτό:
Private Sub Workbook_Open () MsgBox "Θυμηθείτε να συμπληρώσετε το φύλλο χρόνου" Τέλος υπο
Τώρα μόλις ανοίξετε το βιβλίο εργασίας που έχει αυτόν τον κωδικό, θα σας εμφανίσει ένα πλαίσιο μηνυμάτων με το καθορισμένο μήνυμα.
Υπάρχουν μερικά πράγματα που πρέπει να γνωρίζετε όταν εργάζεστε με αυτόν τον κώδικα (ή γενικά τους κωδικούς συμβάντων βιβλίου εργασίας):
- Εάν ένα βιβλίο εργασίας έχει μακροεντολή και θέλετε να το αποθηκεύσετε, πρέπει να το αποθηκεύσετε σε μορφή .XLSM. Διαφορετικά, ο κώδικας μακροεντολής θα χαθεί.
- Στο παραπάνω παράδειγμα, ο κώδικας συμβάντος θα εκτελεστεί μόνο όταν είναι ενεργοποιημένες οι μακροεντολές. Μπορεί να δείτε μια κίτρινη γραμμή που ζητά άδεια για να ενεργοποιήσετε τις μακροεντολές. Μέχρι να ενεργοποιηθεί αυτό, ο κώδικας συμβάντος δεν εκτελείται.
- Ο κώδικας συμβάντος του βιβλίου εργασίας τοποθετείται στο παράθυρο κώδικα του αντικειμένου ThisWorkbook.
Μπορείτε να βελτιώσετε περαιτέρω αυτόν τον κώδικα και να εμφανίσετε το μήνυμα μόνο την Παρασκευή.
Ο παρακάτω κώδικας θα το έκανε αυτό:
Private Sub Workbook_Open () wkday = Weekday (Date) If wkday = 6 Then MsgBox "Remember to Fill the Timesheet" End Sub
Σημειώστε ότι στη συνάρτηση Ημέρα της εβδομάδας, στην Κυριακή αποδίδεται η τιμή 1, η Δευτέρα είναι 2 και ούτω καθεξής.
Ως εκ τούτου, για την Παρασκευή, έχω χρησιμοποιήσει 6.
Το Workbook Open event μπορεί να είναι χρήσιμο σε πολλές περιπτώσεις, όπως:
- Όταν θέλετε να εμφανίσετε ένα μήνυμα καλωσορίσματος στο άτομο όταν ανοίγει ένα βιβλίο εργασίας.
- Όταν θέλετε να εμφανίσετε μια υπενθύμιση όταν ανοίξει το βιβλίο εργασίας.
- Όταν θέλετε να ενεργοποιείτε πάντα ένα συγκεκριμένο φύλλο εργασίας στο βιβλίο εργασίας όταν είναι ανοιχτό.
- Όταν θέλετε να ανοίξετε σχετικά αρχεία μαζί με το βιβλίο εργασίας.
- Όταν θέλετε να καταγράφετε τη σφραγίδα ημερομηνίας και ώρας κάθε φορά που ανοίγετε το βιβλίο εργασίας.
Τετράδιο εργασίας NewSheet Event
Το συμβάν NewSheet ενεργοποιείται όταν εισάγετε ένα νέο φύλλο στο βιβλίο εργασίας.
Ας υποθέσουμε ότι θέλετε να εισαγάγετε την τιμή ημερομηνίας και ώρας στο κελί Α1 του πρόσφατα εισαχθέντος φύλλου. Μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα για να το κάνετε αυτό:
Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub
Ο παραπάνω κώδικας χρησιμοποιεί το «On Error Resume Next» για να χειριστεί περιπτώσεις όπου κάποιος εισάγει ένα φύλλο γραφήματος και όχι ένα φύλλο εργασίας. Δεδομένου ότι το φύλλο γραφήματος δεν έχει κελί A1, θα εμφανίσει σφάλμα εάν δεν χρησιμοποιηθεί το "On Error Resume Next".
Ένα άλλο παράδειγμα θα μπορούσε να είναι όταν θέλετε να εφαρμόσετε κάποια βασική ρύθμιση ή μορφοποίηση σε ένα νέο φύλλο μόλις προστεθεί. Για παράδειγμα, εάν θέλετε να προσθέσετε ένα νέο φύλλο και θέλετε να λαμβάνει αυτόματα έναν σειριακό αριθμό (έως 100), τότε μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα.
Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next With Sh.Range ("A1"). Value = "S. No." .Interior.Color = vbBlue .Font.Color = vb Λευκό τέλος με Για i = 1 έως 100 Sh.Range ("A1"). Offset (i, 0) .Value = i Next i Sh.Range ("A1", Range ("A1"). Τέλος (xlDown)). Borders.LineStyle = xlΣυνέχεια Τέλος Sub
Ο παραπάνω κώδικας κάνει επίσης λίγη μορφοποίηση. Δίνει στο κελί κεφαλίδας ένα μπλε χρώμα και καθιστά τη γραμματοσειρά λευκή. Εφαρμόζει επίσης ένα περίγραμμα σε όλα τα γεμάτα κελιά.
Ο παραπάνω κώδικας είναι ένα παράδειγμα του πώς ένας σύντομος κώδικας VBA μπορεί να σας βοηθήσει να κλέψετε μερικά δευτερόλεπτα κάθε φορά που εισάγετε ένα νέο φύλλο εργασίας (σε περίπτωση που αυτό είναι κάτι που πρέπει να κάνετε κάθε φορά).
Τετράδιο εργασιών BeforeSave Event
Το Event Save πριν ενεργοποιηθεί όταν αποθηκεύετε ένα βιβλίο εργασίας. Σημειώστε ότι το συμβάν ενεργοποιείται πρώτα και στη συνέχεια αποθηκεύεται το βιβλίο εργασίας.
Κατά την αποθήκευση ενός βιβλίου εργασίας Excel, μπορεί να υπάρχουν δύο πιθανά σενάρια:
- Το αποθηκεύετε για πρώτη φορά και θα εμφανιστεί το παράθυρο διαλόγου Αποθήκευση ως.
- Το έχετε ήδη αποθηκεύσει νωρίτερα και απλώς θα αποθηκεύσει και θα αντικαταστήσει τις αλλαγές στην ήδη αποθηκευμένη έκδοση.
Τώρα ας ρίξουμε μια ματιά σε μερικά παραδείγματα όπου μπορείτε να χρησιμοποιήσετε το συμβάν BeforeSave.
Ας υποθέσουμε ότι έχετε ένα νέο βιβλίο εργασίας που αποθηκεύετε για πρώτη φορά και θέλετε να υπενθυμίσετε στο χρήστη να το αποθηκεύσει στη μονάδα δίσκου K, τότε μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα:
Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then MsgBox "Save this File in the K Drive" End Sub
Στον παραπάνω κώδικα, εάν το αρχείο δεν έχει αποθηκευτεί ποτέ, το SaveAsUI είναι True και εμφανίζει το παράθυρο διαλόγου Αποθήκευση ως. Ο παραπάνω κωδικός θα εμφανίσει το μήνυμα πριν εμφανιστεί το παράθυρο διαλόγου Αποθήκευση ως.
Ένα άλλο παράδειγμα θα μπορούσε να είναι η ενημέρωση της ημερομηνίας και της ώρας κατά την αποθήκευση του αρχείου σε ένα συγκεκριμένο κελί.
Ο παρακάτω κώδικας θα εισάγει τη σφραγίδα ημερομηνίας και ώρας στο κελί A1 του Sheet1 κάθε φορά που αποθηκεύεται το αρχείο.
Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) Φύλλα εργασίας ("Sheet1"). Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub
Σημειώστε ότι αυτός ο κώδικας εκτελείται μόλις ο χρήστης αποθηκεύσει το βιβλίο εργασίας. Εάν το βιβλίο εργασίας αποθηκεύεται για πρώτη φορά, θα εμφανίσει ένα παράθυρο διαλόγου Αποθήκευση ως. Αλλά ο κώδικας έχει ήδη εκτελεστεί μέχρι να δείτε το παράθυρο διαλόγου Αποθήκευση ως. Σε αυτό το σημείο, εάν αποφασίσετε να ακυρώσετε και να μην αποθηκεύσετε το βιβλίο εργασίας, η ημερομηνία και η ώρα θα έχουν ήδη εισαχθεί στο κελί.
Τετράδιο εργασίας BeforeClose Event
Πριν συμβεί το Κλείσιμο συμβάν ακριβώς πριν κλείσει το βιβλίο εργασίας.
Ο παρακάτω κώδικας προστατεύει όλα τα φύλλα εργασίας πριν κλείσει το βιβλίο εργασίας.
Private Sub Workbook_BeforeClose (Cancel As Boolean) Dim sh As Worksheet For Every sh In ThisWebbook. Worksheets sh.Προστασία Επόμενου sh End Sub
Θυμηθείτε ότι ο κωδικός συμβάντος ενεργοποιείται μόλις κλείσετε το βιβλίο εργασίας.
Ένα σημαντικό πράγμα που πρέπει να γνωρίζετε για αυτήν την εκδήλωση είναι ότι δεν ενδιαφέρει αν το βιβλίο εργασίας είναι πραγματικά κλειστό ή όχι.
Σε περίπτωση που το βιβλίο εργασίας δεν έχει αποθηκευτεί και εμφανιστεί το μήνυμα που σας ρωτά αν θα αποθηκεύσετε ή όχι το βιβλίο εργασίας και κάνετε κλικ στο κουμπί Ακύρωση, δεν θα αποθηκευτεί το βιβλίο εργασίας σας.Ωστόσο, ο κώδικας συμβάντος θα είχε ήδη εκτελεστεί μέχρι τότε.
Τετράδιο Εργασίας BeforePrint Event
Όταν δίνετε την εντολή εκτύπωσης (ή την εντολή Προεπισκόπηση εκτύπωσης), ενεργοποιείται το συμβάν Πριν την εκτύπωση.
Ο παρακάτω κώδικας θα επανυπολογίσει όλα τα φύλλα εργασίας πριν εκτυπωθεί το βιβλίο εργασίας σας.
Private Sub Workbook_BeforePrint (Cancel As Boolean) Για κάθε ws στα φύλλα εργασίας ws. Υπολογίστε το επόμενο ws Τέλος υπο
Όταν ο χρήστης εκτυπώνει το βιβλίο εργασίας, το συμβάν θα ενεργοποιηθεί είτε εκτυπώνει ολόκληρο το βιβλίο εργασίας είτε μόνο ένα μέρος του.
Ένα άλλο παράδειγμα παρακάτω είναι του κώδικα που θα προσθέσει την ημερομηνία και την ώρα στο υποσέλιδο κατά την εκτύπωση του βιβλίου εργασίας.
Private Sub Workbook_BeforePrint (Cancel As Boolean) Dim ws As Worksheet For Every ws In ThisWorkbook.Worksheets ws.PageSetup.LeftFooter = "Printed On-" & Format (Now, "dd-mmm-yyyy hh: mm") Next ws End Sub
Εκδηλώσεις σε επίπεδο φύλλου εργασίας (εξηγούνται με παραδείγματα)
Οι εκδηλώσεις του φύλλου εργασίας λαμβάνουν χώρα με βάση τις ενεργοποιήσεις στο φύλλο εργασίας.
Ακολουθούν τα πιο συχνά χρησιμοποιούμενα συμβάντα σε ένα φύλλο εργασίας.
Όνομα συμβάντος | Τι πυροδοτεί το γεγονός |
Θέτω εις ενέργειαν | Όταν το φύλλο εργασίας είναι ενεργοποιημένο |
BeforeDelete | Πριν διαγραφεί το φύλλο εργασίας |
BeforeDoubleClick | Πριν κάνετε διπλό κλικ στο φύλλο εργασίας |
BeforeRightClick | Πριν κάνετε δεξιό κλικ στο φύλλο εργασίας |
Υπολογίζω | Πριν υπολογίσετε ή υπολογίσετε εκ νέου το φύλλο εργασίας |
Αλλαγή | Όταν αλλάξουν τα κελιά στο φύλλο εργασίας |
Απενεργοποιήστε | Όταν απενεργοποιηθεί το φύλλο εργασίας |
PivotTableUpdate | Όταν ενημερωθεί ο Συγκεντρωτικός πίνακας στο φύλλο εργασίας |
SelectionChange | Όταν αλλάξει η επιλογή στο φύλλο εργασίας |
Σημειώστε ότι αυτή δεν είναι μια πλήρης λίστα. Μπορείτε να βρείτε την πλήρη λίστα εδώ.
Θυμηθείτε ότι ο κώδικας για το συμβάν φύλλου εργασίας αποθηκεύεται στο παράθυρο κωδικού αντικειμένου φύλλου εργασίας (σε αυτό στο οποίο θέλετε να ενεργοποιηθεί το συμβάν). Μπορεί να υπάρχουν πολλά φύλλα εργασίας σε ένα βιβλίο εργασίας και ο κωδικός σας θα ενεργοποιηθεί μόνο όταν το συμβάν λάβει χώρα στο φύλλο εργασίας στο οποίο έχει τοποθετηθεί.
Τώρα ας ρίξουμε μια ματιά σε μερικά χρήσιμα γεγονότα φύλλου εργασίας και να δούμε πώς αυτά μπορούν να χρησιμοποιηθούν στην καθημερινή σας εργασία.
Φύλλο εργασίας Ενεργοποίηση συμβάντος
Αυτό το συμβάν ενεργοποιείται όταν ενεργοποιείτε ένα φύλλο εργασίας.
Ο παρακάτω κώδικας προστατεύει ένα φύλλο μόλις ενεργοποιηθεί.
Private Sub Worksheet_Activate () ActiveSheet.Unprotect End Sub
Μπορείτε επίσης να χρησιμοποιήσετε αυτό το συμβάν για να βεβαιωθείτε ότι έχει επιλεγεί ένα συγκεκριμένο κελί ή μια περιοχή κελιών (ή μια ονομαστική περιοχή) μόλις ενεργοποιήσετε το φύλλο εργασίας. Ο παρακάτω κώδικας θα επέλεγε το κελί D1 μόλις ενεργοποιήσετε το φύλλο.
Private Sub Worksheet_Activate () ActiveSheet.Range ("D1"). Επιλέξτε End Sub
Συμβάν αλλαγής φύλλου εργασίας
Ένα συμβάν αλλαγής ενεργοποιείται κάθε φορά που κάνετε μια αλλαγή στο φύλλο εργασίας.
Λοιπόν … όχι πάντα.
Υπάρχουν κάποιες αλλαγές που ενεργοποιούν το συμβάν και άλλες όχι. Ακολουθεί μια λίστα με μερικές αλλαγές που δεν θα ενεργοποιήσουν το συμβάν:
- Όταν αλλάζετε τη μορφοποίηση του κελιού (μέγεθος γραμματοσειράς, χρώμα, περίγραμμα κ.λπ.).
- Όταν συγχωνεύετε κελιά. Αυτό είναι εκπληκτικό καθώς μερικές φορές, η συγχώνευση κελιών αφαιρεί επίσης περιεχόμενο από όλα τα κελιά εκτός από το επάνω αριστερό.
- Όταν προσθέτετε, διαγράφετε ή επεξεργάζεστε ένα σχόλιο κελιού.
- Όταν ταξινομείτε μια σειρά κελιών.
- Όταν χρησιμοποιείτε την Αναζήτηση στόχου.
Οι ακόλουθες αλλαγές θα ενεργοποιήσουν το συμβάν (αν και νομίζετε ότι δεν θα έπρεπε):
- Αντιγραφή και επικόλληση μορφοποίησης θα ενεργοποιήσει το συμβάν.
- Η εκκαθάριση μορφοποίησης θα ενεργοποιήσει το συμβάν.
- Η εκτέλεση ορθογραφικού ελέγχου θα ενεργοποιήσει το συμβάν.
Παρακάτω είναι ένας κωδικός που θα εμφανίζει ένα πλαίσιο μηνυμάτων με τη διεύθυνση του κελιού που έχει αλλάξει.
Private Sub Worksheet_Change (ByVal Target As Range) MsgBox "Μόλις αλλάξατε" & Target.Address End Sub
Ενώ πρόκειται για μια άχρηστη μακροεντολή, σας δείχνει πώς να χρησιμοποιήσετε το όρισμα Στόχος για να μάθετε ποια κελιά έχουν αλλάξει.
Τώρα ας δούμε μερικά πιο χρήσιμα παραδείγματα.
Ας υποθέσουμε ότι έχετε μια σειρά κελιών (ας πούμε A1: D10) και θέλετε να εμφανίσετε μια προτροπή και να ρωτήσετε τον χρήστη εάν ήθελε πραγματικά να αλλάξει ένα κελί σε αυτό το εύρος ή όχι, μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα.
Εμφανίζει μια προτροπή με δύο κουμπιά - Ναι και Όχι. Εάν ο χρήστης επιλέξει «Ναι», η αλλαγή πραγματοποιείται, διαφορετικά αντιστρέφεται.
Private Sub Worksheet_Change (ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Στη συνέχεια Ans = MsgBox ("Κάνετε μια αλλαγή στα κελιά στο A1: D10. Είστε βέβαιοι ότι το θέλετε;", vbYesNo) Τερματισμός Αν Αν Ans = vbNo Τότε Application.EnableEvents = Λάθος Εφαρμογή. Αναίρεση εφαρμογής.EnableEvents = True End If End Sub
Στον παραπάνω κώδικα, ελέγχουμε αν το κελί προορισμού βρίσκεται στις πρώτες 4 στήλες και τις πρώτες 10 σειρές. Εάν συμβαίνει αυτό, εμφανίζεται το πλαίσιο μηνυμάτων. Επίσης, εάν ο χρήστης επέλεξε Όχι στο πλαίσιο μηνυμάτων, η αλλαγή αντιστρέφεται (από την εντολή Application.Undo).
Σημειώστε ότι έχω χρησιμοποιήσει Application.EnableEvents = Λάθος πριν από τη γραμμή Application.Undo. Και στη συνέχεια το ανέτρεψα χρησιμοποιώντας το Application.EnableEvent = True στην επόμενη γραμμή.
Αυτό είναι απαραίτητο καθώς όταν συμβαίνει η αναίρεση, ενεργοποιεί επίσης το συμβάν αλλαγής. Εάν δεν ορίσω το EnableEvent σε False, θα συνεχίσει να ενεργοποιεί το συμβάν αλλαγής.
Μπορείτε επίσης να παρακολουθείτε τις αλλαγές σε ένα όνομα περιοχής χρησιμοποιώντας το συμβάν αλλαγής. Για παράδειγμα, εάν έχετε ένα εύρος ονομασίας που ονομάζεται "DataRange" και θέλετε να εμφανίσετε μια προτροπή σε περίπτωση που ο χρήστης κάνει μια αλλαγή σε αυτό το όνομα περιοχής, μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα:
Private Sub Worksheet_Change (ByVal Target As Range) Dim DRange As Range Set DRange = Range ("DataRange") If Not Intersect (Target, DRange) Is Nothing then MsgBox "You just made a change to the Data Range" End If End Sub
Ο παραπάνω κώδικας ελέγχει εάν το κελί/περιοχή όπου πραγματοποιήσατε τις αλλαγές έχει κοινά κελιά στο εύρος δεδομένων. Αν το κάνει, εμφανίζει το πλαίσιο μηνυμάτων.
Επιλογή Επιλογής βιβλίου εργασίας Αλλαγή συμβάντος
Το συμβάν αλλαγής επιλογής ενεργοποιείται κάθε φορά που υπάρχει αλλαγή επιλογής στο φύλλο εργασίας.
Ο παρακάτω κωδικός θα επανυπολογίσει το φύλλο μόλις αλλάξετε την επιλογή.
Εφαρμογή Private Sub Worksheet_SelectionChange (ByVal Target As Range). Υπολογίστε τελικό υπο
Ένα άλλο παράδειγμα αυτού του συμβάντος είναι όταν θέλετε να επισημάνετε την ενεργή γραμμή και στήλη του επιλεγμένου κελιού.
Κάτι όπως φαίνεται παρακάτω:
Ο παρακάτω κώδικας μπορεί να το κάνει αυτό:
Private Sub Worksheet_SelectionChange (ByVal Target As Range) Cells.Interior.ColorIndex = xlΚανένα με ActiveCell .EntireRow.Interior.Color = RGB (248, 203, 173) .IntireColumn.Interior.Color = RGB (180, 198, 231) Τέλος Τέλος υπο
Ο κώδικας αφαιρεί πρώτα το χρώμα φόντου από όλα τα κελιά και στη συνέχεια εφαρμόζει αυτό που αναφέρεται στον κώδικα στην ενεργή γραμμή και στήλη.
Και αυτό είναι το πρόβλημα με αυτόν τον κώδικα. Ότι αφαιρεί το χρώμα από όλα τα κελιά.
Εάν θέλετε να επισημάνετε την ενεργή γραμμή/στήλη διατηρώντας το χρώμα σε άλλα κελιά άθικτο, χρησιμοποιήστε την τεχνική που εμφανίζεται σε αυτό το σεμινάριο.
Βιβλίο εργασίας DoubleClick Event
Αυτό είναι ένα από τα αγαπημένα μου γεγονότα φύλλου εργασίας και θα δείτε πολλά σεμινάρια όπου το έχω χρησιμοποιήσει (όπως αυτό ή αυτό).
Αυτό το συμβάν ενεργοποιείται όταν κάνετε διπλό κλικ σε ένα κελί.
Επιτρέψτε μου να σας δείξω πόσο υπέροχο είναι αυτό.
Με τον παρακάτω κώδικα, μπορείτε να κάνετε διπλό κλικ σε ένα κελί και να εφαρμόσει ένα χρώμα φόντου, να αλλάξει το χρώμα της γραμματοσειράς και να κάνει το κείμενο στο κελί έντονο.
Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean) Cancel = True With Target .Interior.Color = vbBlue .Font.Color = vbWhite .Font.Bold = True End With End Sub
Αυτό μπορεί να είναι χρήσιμο όταν περνάτε από μια λίστα κελιών και θέλετε να επισημάνετε μερικά επιλεγμένα. Ενώ μπορείτε να χρησιμοποιήσετε το πλήκτρο F4 για να επαναλάβετε το τελευταίο βήμα, θα μπορούσε να εφαρμοστεί μόνο ένα είδος μορφοποίησης. Με αυτό το συμβάν διπλού κλικ, μπορείτε να εφαρμόσετε και τα τρία με ένα διπλό κλικ.
Σημειώστε ότι στον παραπάνω κώδικα, έχω κάνει την τιμή Cancel = True.
Αυτό γίνεται έτσι ώστε να απενεργοποιηθεί η προεπιλεγμένη ενέργεια του διπλού κλικ - δηλαδή να μπείτε στη λειτουργία επεξεργασίας. Με Cancel = True, το Excel δεν θα σας οδηγήσει στη λειτουργία Επεξεργασία όταν κάνετε διπλό κλικ στο κελί.
Εδώ είναι ένα άλλο παράδειγμα.
Εάν διαθέτετε μια λίστα υποχρεώσεων στο Excel, μπορείτε να χρησιμοποιήσετε ένα συμβάν διπλού κλικ για να εφαρμόσετε τη μορφή διαχωρισμού για να επισημάνετε την εργασία ως ολοκληρωμένη.
Κάτι όπως φαίνεται παρακάτω:
Εδώ είναι ο κώδικας που θα το κάνει αυτό:
Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean) Cancel = True CurrFormat = Target.Font.Strikethrough If CurrFormat Then Target.Font.Strikethrough = False Else Target.Font.Strikethrough = True End If End Sub
Σημειώστε ότι σε αυτόν τον κώδικα, έχω κάνει διπλό κλικ ως συμβάν εναλλαγής. Όταν κάνετε διπλό κλικ σε ένα κελί, ελέγχει εάν η μορφή διαχωρισμού έχει ήδη εφαρμοστεί. Εάν ήταν, διπλό κλικ αφαιρεί τη μορφή διαχωρισμού και αν δεν ήταν, τότε εφαρμόζεται η μορφή διαχωρισμού.
Excel VBA OnTime Event
Τα γεγονότα που έχουμε δει μέχρι τώρα σε αυτό το άρθρο σχετίζονται με ένα από τα αντικείμενα του Excel, είτε πρόκειται για το βιβλίο εργασίας, το φύλλο εργασίας, το φύλλο γραφήματος ή τα UserForms κ.λπ.
Το συμβάν OnTime είναι διαφορετικό από άλλα συμβάντα καθώς μπορεί να αποθηκευτεί στην κανονική λειτουργική μονάδα VBA (ενώ τα άλλα επρόκειτο να τοποθετηθούν στο παράθυρο κώδικα αντικειμένων όπως το ThisWorkbook ή Worksheets ή UserForms).
Μέσα στην κανονική μονάδα VBA, χρησιμοποιείται ως μέθοδος του αντικειμένου εφαρμογής.
Ο λόγος που αυτό θεωρείται συμβάν είναι ότι μπορεί να ενεργοποιηθεί με βάση το χρόνο που καθορίζετε. Για παράδειγμα, εάν θέλω το φύλλο να επανυπολογίζεται κάθε 5 λεπτά, μπορώ να χρησιμοποιήσω το συμβάν OnTime γι 'αυτό.
Or, εάν θέλω να εμφανίσω ένα μήνυμα/υπενθύμιση σε μια συγκεκριμένη ώρα της ημέρας, μπορώ να χρησιμοποιήσω το συμβάν OnTime.
Παρακάτω είναι ένας κωδικός που θα εμφανίζει ένα μήνυμα στις 2 μ.μ. κάθε μέρα.
Sub MessageTime () Application.OnTime TimeValue ("14:00:00"), "ShowMessage" End Sub Show ShowMessage () MsgBox "It's Lunch Time" End Sub
Θυμηθείτε ότι πρέπει να τοποθετήσετε αυτόν τον κωδικό στην κανονική μονάδα VBA,
Επίσης, ενώ το συμβάν OnTime θα ενεργοποιηθεί την καθορισμένη ώρα, πρέπει να εκτελέσετε τη μακροεντολή χειροκίνητα ανά πάσα στιγμή. Μόλις εκτελέσετε τη μακροεντολή, θα περιμένει έως τις 2 μ.μ. και στη συνέχεια θα καλέσετε τη μακροεντολή "ShowMessage".
Στη συνέχεια, η μακροεντολή ShowMessage θα εμφανίσει το μήνυμα.
Το συμβάν OnTime περιλαμβάνει τέσσερα επιχειρήματα:
Application.OnTime (Πρώιμη ώρα, Διαδικασία, LatestTime, Πρόγραμμα)
- Πρώιμη ώρα: Ο χρόνος που θέλετε να εκτελέσετε τη διαδικασία.
- Διαδικασία: Το όνομα της διαδικασίας που πρέπει να εκτελεστεί.
- LatestTime (προαιρετικό): Σε περίπτωση που εκτελείται άλλος κώδικας και δεν είναι δυνατή η εκτέλεση του καθορισμένου κωδικού σας την καθορισμένη ώρα, μπορείτε να καθορίσετε το LatestTime για το οποίο θα πρέπει να περιμένει. Για παράδειγμα, θα μπορούσε να είναι το EarliestTime + 45 (που σημαίνει ότι θα περιμένει 45 δευτερόλεπτα για να ολοκληρωθεί η άλλη διαδικασία). Εάν ακόμη και μετά από 45 δευτερόλεπτα η διαδικασία δεν είναι σε θέση να εκτελεστεί, εγκαταλείπεται. Εάν δεν το καθορίσετε, το Excel θα περιμένει μέχρι να εκτελεστεί ο κώδικας και, στη συνέχεια, θα τον εκτελέσει.
- Πρόγραμμα (προαιρετικό): Εάν οριστεί σε True, προγραμματίζει νέα διαδικασία ώρας. Αν είναι False, τότε ακυρώνει την προηγούμενη διαδικασία. Από προεπιλογή, αυτό είναι True.
Στο παραπάνω παράδειγμα, χρησιμοποιήσαμε μόνο τα δύο πρώτα ορίσματα.
Ας δούμε ένα άλλο παράδειγμα.
Ο παρακάτω κώδικας ανανεώνει το φύλλο εργασίας κάθε 5 λεπτά.
Dim NextRefresh as Sub Sub RefreshSheet () ThisWorkbook.Worksheets ("Sheet1"). Υπολογίστε NextRefresh = Now + TimeValue ("00:05:00") Application.OnTime NextRefresh, "RefreshSheet" End Sub StopRefresh () On Error Resume Next Application.OnTime NextRefresh, "RefreshSheet",, False End Sub
Ο παραπάνω κώδικας ανανεώνει το φύλλο εργασίας κάθε 5 λεπτά.
Χρησιμοποιεί τη λειτουργία Now για να καθορίσει την τρέχουσα ώρα και στη συνέχεια προσθέτει 5 λεπτά στην τρέχουσα ώρα.
Η εκδήλωση OnTime θα συνεχίσει να εκτελείται μέχρι να την σταματήσετε. Εάν κλείσετε το βιβλίο εργασίας και η εφαρμογή Excel εξακολουθεί να εκτελείται (άλλα βιβλία εργασίας είναι ανοιχτά), το βιβλίο εργασίας που έχει το συμβάν OnTime σε αυτό θα ανοίξει ξανά.
Αυτό αντιμετωπίζεται καλύτερα με τη συγκεκριμένη διακοπή του συμβάντος OnTime.
Στον παραπάνω κώδικα, έχω τον κωδικό StopRefresh, αλλά πρέπει να τον εκτελέσετε για να σταματήσετε το συμβάν OnTime. Μπορείτε να το κάνετε αυτό χειροκίνητα, να το αντιστοιχίσετε σε ένα κουμπί και να το κάνετε πατώντας το κουμπί ή να το καλέσετε από το συμβάν Κλείσιμο βιβλίου εργασίας.
Private Sub Workbook_BeforeClose (Cancel As Boolean) Call Call StopRefresh End Sub
Ο παραπάνω κωδικός συμβάντος "BeforeClose" μπαίνει στο παράθυρο κώδικα ThisWorkbook.
Excel VBA OnKey Event
Όταν εργάζεστε με το Excel, παρακολουθεί συνεχώς τα πλήκτρα που χρησιμοποιείτε. Αυτό μας επιτρέπει να χρησιμοποιούμε τα πλήκτρα ως έναυσμα για ένα συμβάν.
Με το συμβάν OnKey, μπορείτε να καθορίσετε ένα πάτημα πλήκτρου (ή συνδυασμό πληκτρολογήσεων) και τον κώδικα που πρέπει να εκτελεστεί όταν χρησιμοποιείται αυτό το πάτημα πλήκτρου. Όταν πατήσετε αυτά τα πλήκτρα, θα εκτελέσει τον κώδικα για αυτό.
Ακριβώς όπως το συμβάν OnTime, πρέπει να έχετε έναν τρόπο να ακυρώσετε το συμβάν OnKey. Επίσης, όταν ορίζετε το συμβάν OnKey για ένα συγκεκριμένο πάτημα πλήκτρου, γίνεται διαθέσιμο σε όλα τα ανοιχτά βιβλία εργασίας.
Πριν σας δείξω ένα παράδειγμα χρήσης του συμβάντος OnKey, επιτρέψτε μου πρώτα να μοιραστώ τους βασικούς κωδικούς που είναι διαθέσιμοι σε εσάς στο VBA.
ΚΛΕΙΔΙ | ΚΩΔΙΚΑΣ |
Backspace | {BACKSPACE} ή {BS} |
Διακοπή | {ΔΙΑΚΟΠΗ} |
κεφαλαία | {ΚΕΦΑΛΑΙΑ} |
Διαγράφω | {DELETE} ή {DEL} |
Κάτω βελάκι | {ΚΑΤΩ} |
Τέλος | {ΤΕΛΟΣ} |
Εισαγω | ~ |
Εισαγάγετε (στο αριθμητικό πληκτρολόγιο) | {ΕΙΣΑΓΩ} |
Διαφυγή | {ESCAPE} ή {ESC} |
Σπίτι | {ΣΠΙΤΙ} |
Ins | {ΕΙΣΑΓΕΤΕ} |
Αριστερό βέλος | {ΑΡΙΣΤΕΡΑ} |
NumLock | {NUMLOCK} |
PageDown | {PGDN} |
Σελίδα προς τα πάνω | {PGUP} |
Δεξί βέλος | {ΣΩΣΤΑ} |
Κλείδωμα κύλισης | {SCROLLOCK} |
Αυτί | {ΑΥΤΙ} |
Επάνω βέλος | {ΠΑΝΩ} |
F1 έως F15 | {F1} έως {F15} |
Όταν πρέπει να χρησιμοποιήσετε οποιοδήποτε onkey συμβάν, πρέπει να χρησιμοποιήσετε τον κωδικό για αυτό.
Ο παραπάνω πίνακας περιέχει τους κωδικούς για μεμονωμένα πλήκτρα.
Μπορείτε επίσης να τα συνδυάσετε με τους ακόλουθους κωδικούς:
- Μετατόπιση: + (Σημάδι συν)
- Ελεγχος: ^ (Αγκύλη)
- Alt: % (Ποσοστό)
Για παράδειγμα, για Alt F4, πρέπει να χρησιμοποιήσετε τον κωδικό: "%{F4}” - όπου το % είναι για το κλειδί ALT και το {F4} είναι για το κλειδί F4.
Τώρα ας ρίξουμε μια ματιά σε ένα παράδειγμα (θυμηθείτε ότι ο κωδικός για τα συμβάντα OnKey τοποθετούνται στην κανονική μονάδα VBA).
Όταν πατάτε το κλειδί PageUp ή PageDown, πηδά 29 σειρές πάνω/κάτω από το ενεργό κελί (τουλάχιστον αυτό κάνει στον φορητό υπολογιστή μου).
Εάν θέλετε να πηδήξει μόνο 5 σειρές τη φορά, μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα:
Sub PageUpDOwnKeys () Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub Sub PageUpMod () On Error Resume Next ActiveCell.Offset (-5, 0). Ενεργοποιήστε το τέλος Sub Sub PageDownMod () On Error Resume Next ActiveCell.Offset (5, 0). Ενεργοποίηση τερματισμού υπο
Όταν εκτελείτε το πρώτο μέρος του κώδικα, θα εκτελέσει τα συμβάντα OnKey. Μόλις εκτελεστεί αυτό, η χρήση του PageUp και του κλειδιού PageDown θα έκανε τον κέρσορα να πηδήξει μόνο 5 σειρές τη φορά.
Λάβετε υπόψη ότι χρησιμοποιήσαμε το «On Error Resume Next» για να βεβαιωθείτε ότι τα λάθη αγνοούνται. Αυτά τα σφάλματα μπορεί να προκύψουν όταν πατάτε το πλήκτρο PageUp ακόμη και όταν βρίσκεστε στην κορυφή του φύλλου εργασίας. Δεδομένου ότι δεν υπάρχουν άλλες γραμμές για μετάβαση, ο κώδικας θα εμφανίσει σφάλμα. Αλλά επειδή έχουμε χρησιμοποιήσει το «On Error Resume Next», θα αγνοηθεί.
Για να βεβαιωθείτε ότι αυτά τα συμβάντα OnKey είναι διαθέσιμα, πρέπει να εκτελέσετε το πρώτο μέρος του κώδικα. Σε περίπτωση που θέλετε να είναι διαθέσιμο μόλις ανοίξετε το βιβλίο εργασίας, μπορείτε να το τοποθετήσετε στο παράθυρο κωδικού ThisWorkbook.
Private Sub Workbook_Open () Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub
Ο παρακάτω κώδικας θα επιστρέψει τα κλειδιά στην κανονική λειτουργικότητά τους.
Sub Cancel_PageUpDownKeysMod () Application.OnKey "{PgUp}" Application.OnKey "{PgDn}" End Sub
Όταν δεν καθορίσετε το δεύτερο όρισμα στη μέθοδο OnKey, θα επιστρέψει το πάτημα πλήκτρου στην κανονική του λειτουργικότητα.
Σε περίπτωση που θέλετε να ακυρώσετε τη λειτουργικότητα ενός πληκτρολογίου, έτσι ώστε το Excel να μην κάνει τίποτα όταν χρησιμοποιείται αυτό το πάτημα, πρέπει να χρησιμοποιήσετε μια κενή συμβολοσειρά ως δεύτερο όρισμα.
Στον παρακάτω κώδικα, το Excel δεν θα έκανε τίποτα όταν χρησιμοποιούμε τα κλειδιά PageUp ή PageDown.
Sub Ignore_PageUpDownKeys () Application.OnKey "{PgUp}", "" Application.OnKey "{PgDn}", "" End Sub
Απενεργοποίηση συμβάντων στο VBA
Μερικές φορές μπορεί να χρειαστεί να απενεργοποιήσετε συμβάντα για να λειτουργήσει σωστά ο κωδικός σας.
Για παράδειγμα, ας υποθέσουμε ότι έχω ένα εύρος (A1: D10) και θέλω να εμφανίζω ένα μήνυμα κάθε φορά που αλλάζει ένα κελί σε αυτό το εύρος. Έτσι εμφανίζω ένα πλαίσιο μηνυμάτων και ρωτάω τον χρήστη αν είναι σίγουρος ότι θέλει να κάνει την αλλαγή. Εάν η απάντηση είναι Ναι, η αλλαγή πραγματοποιείται και εάν η απάντηση είναι Όχι, τότε η VBA θα την αναιρέσει.
Μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα:
Private Sub Worksheet_Change (ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Στη συνέχεια Ans = MsgBox ("Κάνετε μια αλλαγή στα κελιά στο A1: D10. Είστε βέβαιοι ότι το θέλετε;", vb Ναι Όχι) Λήξη Αν Αν Απάντηση = vbNo Τότε Εφαρμογή. Αναίρεση Τέλος Αν Τέλος Υπο
Το πρόβλημα με αυτόν τον κωδικό είναι ότι όταν ο χρήστης επιλέξει Όχι στο πλαίσιο μηνυμάτων, η ενέργεια αντιστρέφεται (όπως έχω χρησιμοποιήσει το Application.Undo).
Όταν συμβεί η αναίρεση και η τιμή επιστρέψει στην αρχική, το συμβάν αλλαγής VBA ενεργοποιείται ξανά και εμφανίζεται ξανά στο χρήστη το ίδιο πλαίσιο μηνυμάτων.
Αυτό σημαίνει ότι μπορείτε να συνεχίσετε να κάνετε κλικ στο ΟΧΙ στο πλαίσιο μηνυμάτων και θα συνεχίσει να εμφανίζεται. Αυτό συμβαίνει καθώς έχετε κολλήσει στον άπειρο βρόχο σε αυτήν την περίπτωση.
Για να αποφύγετε τέτοιες περιπτώσεις, πρέπει να απενεργοποιήσετε συμβάντα έτσι ώστε να μην ενεργοποιηθεί το συμβάν αλλαγής (ή οποιοδήποτε άλλο συμβάν).
Ο ακόλουθος κώδικας θα λειτουργούσε καλά σε αυτήν την περίπτωση:
Private Sub Worksheet_Change (ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Στη συνέχεια Ans = MsgBox ("Κάνετε μια αλλαγή στα κελιά στο A1: D10. Είστε βέβαιοι ότι το θέλετε;", vbYesNo) Τερματισμός Αν Αν Ans = vbNo Τότε Application.EnableEvents = Λάθος Εφαρμογή. Αναίρεση εφαρμογής.EnableEvents = True End If End Sub
Στον παραπάνω κώδικα, ακριβώς πάνω από τη γραμμή εφαρμογής. Αναίρεση, έχουμε χρησιμοποιήσει - Application.EnableEvents = False.
Η ρύθμιση του EnableEvents σε False δεν θα ενεργοποιήσει κανένα συμβάν (στα τρέχοντα ή σε ανοιχτά βιβλία εργασίας).
Μόλις ολοκληρώσουμε τη λειτουργία αναίρεσης, μπορούμε να επιστρέψουμε την ιδιότητα EnableEvents σε True.
Λάβετε υπόψη ότι η απενεργοποίηση συμβάντων επηρεάζει όλα τα βιβλία εργασίας που ανοίγουν αυτήν τη στιγμή (ή ανοίγουν ενώ το EnableEvents έχει οριστεί σε False). Για παράδειγμα, ως μέρος του κώδικα, εάν ανοίξετε ένα νέο βιβλίο εργασίας, τότε το συμβάν Άνοιγμα βιβλίου εργασίας δεν θα λειτουργήσει.
Αποτέλεσμα των γεγονότων Αναίρεση στοίβας
Επιτρέψτε μου πρώτα να σας πω τι είναι το Undo Stack.
Όταν εργάζεστε στο Excel, παρακολουθεί συνεχώς τις ενέργειές σας. Όταν κάνετε λάθος, μπορείτε πάντα να χρησιμοποιήσετε το Control + Z για να επιστρέψετε στο προηγούμενο βήμα (δηλαδή, αναιρέστε την τρέχουσα ενέργεια σας).
Εάν πατήσετε το Control + Z δύο φορές, θα σας πάει δύο βήματα πίσω. Αυτά τα βήματα που έχετε πραγματοποιήσει αποθηκεύονται ως μέρος της στοίβας Αναίρεση.
Οποιοδήποτε συμβάν που αλλάζει το φύλλο εργασίας καταστρέφει αυτήν την αναίρεση στοίβας.Αυτό σημαίνει ότι αν έχω κάνει 5 πράγματα πριν ενεργοποιήσω ένα συμβάν, δεν θα μπορώ να χρησιμοποιήσω το Control + Z για να επιστρέψω στα προηγούμενα βήματα. Η ενεργοποίηση του γεγονότος μου κατέστρεψε αυτήν τη στοίβα.
Στον παρακάτω κώδικα, χρησιμοποιώ το VBA για να εισάγω τη χρονική σήμανση στο κελί A1 κάθε φορά που υπάρχει αλλαγή στο φύλλο εργασίας.
Private Sub Worksheet_Change (ByVal Target As Range) Application.EnableEvents = False Range ("A1"). Value = Format (Now, "dd-mmm-yyyy hh: mm: ss") Application.EnableEvents = True End Sub
Δεδομένου ότι κάνω μια αλλαγή στο φύλλο εργασίας, αυτό θα καταστρέψει την αναίρεση στοίβας.
Επίσης, σημειώστε ότι αυτό δεν περιορίζεται μόνο σε εκδηλώσεις.
Εάν έχετε έναν κωδικό που είναι αποθηκευμένος σε κανονική λειτουργική μονάδα VBA και κάνετε μια αλλαγή στο φύλλο εργασίας, θα καταστρέφει επίσης την αναίρεση στοίβας στο Excel.
Για παράδειγμα, ο παρακάτω κώδικας απλώς εισάγει το κείμενο "Γεια" στο κελί Α1, αλλά ακόμη και η εκτέλεση αυτού θα καταστρέψει την αναίρεση στοίβας.
Υπόγειο εύρος () A range ("A1"). Value = "Hello" End Sub
Μπορεί επίσης να σας αρέσουν τα ακόλουθα μαθήματα Excel VBA:
- Εργασία με κελιά και εύρη στο Excel VBA.
- Εργασία με φύλλα εργασίας στο Excel VBA.
- Εργασία με βιβλία εργασίας στο Excel VBA.
- Excel VBA Loops - Ο απόλυτος οδηγός.
- Χρήση IF then Else Statment στο Excel VBA.
- Για επόμενο βρόχο στο Excel.
- Δημιουργία λειτουργιών που καθορίζονται από το χρήστη στο Excel VBA.
- Πώς να δημιουργήσετε και να χρησιμοποιήσετε πρόσθετα στο Excel.
- Δημιουργήστε και επαναχρησιμοποιήστε μακροεντολές αποθηκεύοντας στο Personal Macro Workbook.