VBA DoEvents

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

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

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

Παράδειγμα VBA DoEvents

Εξετάστε τον ακόλουθο κώδικα:

1234567891011 Public Sub Test ()Dim i As LongΓια i = 1 έως 20000Εύρος ("A1"). Τιμή = iΕπόμενο iΤέλος υπο

Όταν δοκιμάζετε αυτόν τον κώδικα, θα σημειώσετε ότι δεν είναι δυνατή η αλληλεπίδραση με το παράθυρο του Excel. Ωστόσο, επειδή δεν είναι πολύ απαιτητικό για τον επεξεργαστή, η μακροεντολή μπορεί να διακοπεί πατώντας ESC ή CTRL+BREAK.

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

Τώρα προσθέστε μια γραμμή με το DoEvents κάτω από την εκχώρηση εύρους:

123 Εύρος ("A1"). Τιμή = iDoEvents

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

Κίνδυνοι DoEvents

Ρίξτε μια δεύτερη ματιά, όμως. Πέρα από το να επιτρέψετε την εστίαση στο Excel, μπορείτε πραγματικά να κάνετε κλικ μέσα στα κελιά και ακόμη και να αλλάξετε καρτέλες ενώ η μακροεντολή εκτελείται (δοκιμάστε το - θα δείτε μια αστεία συμπεριφορά). Αυτό δείχνει έναν από τους κινδύνους του DoEvents - μπορεί να προκαλέσει ακούσιες συνέπειες εάν η μακροεντολή σας δεν κωδικοποιηθεί προσεκτικά.

Ένας άλλος κίνδυνος είναι ότι το DoEvents μπορεί να χρησιμεύσει ως παράθυρο για την εκτέλεση άλλων μακροεντολών στο εσωτερικό του. Δοκιμάστε αυτό: τοποθετήστε ένα κουμπί ActiveX CommandBet στο φύλλο εργασίας, κάντε διπλό κλικ σε αυτό και προσθέστε τον ακόλουθο κώδικα στο συμβάν CommandButton1_Click ():

1234567 Dim c As RangeΓια κάθε c In Range ("B3: E8")γ. Αξία = γ. Αξία + 1Επόμενο γ

Απενεργοποιήστε τη λειτουργία σχεδίασης στο Excel και, στη συνέχεια, εκτελέστε τη μακροεντολή Test () που προσθέσατε νωρίτερα. Ενώ εκτελείται η μακροεντολή δοκιμής, μπορείτε να κάνετε κλικ στο κουμπί CommandBook στο φύλλο εργασίας και η σχετική μακροεντολή της θα εκτελεστεί μόλις το DoEvents δώσει ένα διάλειμμα στη μακροεντολή Test ().

Ο κίνδυνος εδώ είναι εάν η μακροεντολή CommandButton άλλαξε τα δεδομένα στα οποία εργαζόταν η μακροεντολή Test ή ενεργοποίησε ξανά τη μακροεντολή Test (). Μπορείτε να καταλήξετε σε εξαιρετικά ακατάστατα αποτελέσματα αν δεν είστε προσεκτικοί.

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

1 Εάν i Mod 1000 = 0 Τότε DoEvents

Αυτό μειώνει εμφανώς την απόκριση του Excel, αλλά ο αντίκτυπος στην απόδοση θα μειωθεί.

Πότε να χρησιμοποιήσετε το DoEvents

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

Ένας άλλος λόγος για να συμπεριλάβετε το DoEvents είναι να επιτρέψετε τα σχόλια των χρηστών. Για παράδειγμα, μια μακροεντολή μπορεί να ενημερώσει τις ετικέτες ενός UserForm με δείκτες προόδου. Χωρίς DoEvents, το Excel ενδέχεται να μην λαμβάνει μηνύματα για να βάψει ξανά το UserForm, δίνοντας στον χρήστη την εντύπωση ότι η μακροεντολή έχει σταματήσει να λειτουργεί - ειδικά αν μεταβείτε σε άλλο πρόγραμμα και στη συνέχεια προσπαθήσετε να επιστρέψετε στο Excel. Ωστόσο, με το DoEvents, το UserForm θα συνεχίσει να βάφεται ξανά και θα εμφανίζονται ενημερώσεις για την πρόοδο της μακροεντολής.

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

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

wave wave wave wave wave