Χρήση χρονοδιακόπτη σε μακροεντολές VBA του MS Office

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

Χρονοδιακόπτες για τους αρχάριους

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

Ξεκινήστε ένα χρονόμετρο

Ξεκινάτε ένα χρονόμετρο κωδικοποιώντας μια εντολή OnTime. Αυτή η δήλωση εφαρμόζεται σε Word και Excel, αλλά έχει διαφορετική σύνταξη ανάλογα με το ποια είναι η χρήση. Η σύνταξη για το Word είναι:

instagram viewer

έκφραση. OnTime (Πότε, Όνομα, Ανοχή)

Η σύνταξη για το Excel μοιάζει με αυτό:

έκφραση. OnTime (EarliestTime, Διαδικασία, Τελευταίο Χρόνο, Πρόγραμμα)

Και οι δύο έχουν την κοινή και την πρώτη παράμετρο. Η δεύτερη παράμετρος είναι το όνομα μιας άλλης μακροεντολής που τρέχει όταν φτάσει ο χρόνος στην πρώτη παράμετρο. Στην πραγματικότητα, η κωδικοποίηση αυτής της δήλωσης είναι σαν τη δημιουργία μιας υπορουτίνας συμβάντων σε όρους VB6 ή VB.NET. Το συμβάν φτάνει στο χρόνο στην πρώτη παράμετρο. Η υπορουτίνα συμβάντος είναι η δεύτερη παράμετρος.

Αυτό είναι διαφορετικό από τον τρόπο που κωδικοποιείται σε VB6 ή VB.NET. Για ένα πράγμα, η μακροεντολή που κατονομάζεται στη δεύτερη παράμετρο μπορεί να είναι σε οποιονδήποτε κώδικα που είναι προσβάσιμος. Σε ένα έγγραφο του Word, η Microsoft συνιστά να το τοποθετήσετε στο πρότυπο κανονικού εγγράφου. Εάν το βάλετε σε άλλη ενότητα, η Microsoft συνιστά να χρησιμοποιήσετε την πλήρη διαδρομή: Έργο. Μονάδα μέτρησης. Macro.

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

Κωδικοποιήστε τη μακροεντολή χρόνου συμβάντος

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

Public Sub TestOnTime ()
Debug. Εκτύπωση "Ο συναγερμός θα σβήσει σε 10 δευτερόλεπτα!"
Debug. Εκτύπωση ("Πριν από την ώρα OnTime:" & Now)
alertTime = Τώρα + TimeValue ("00:00:10")
Εφαρμογή. OnTime alertTime, "EventMacro"
Debug. Εκτύπωση ("Μετά από OnTime:" & Now)
End Sub
Sub EventMacro ()
Debug. Εκτύπωση ("Εκτέλεση μακροεντολής συμβάντων:" & Now)
End Sub

Αυτό οδηγεί στο ακόλουθο περιεχόμενο στο άμεσο παράθυρο:

Ο συναγερμός θα σβήσει σε 10 δευτερόλεπτα!
Πριν από την OnTime: 12/25/2000 7:41:23 PM
Μετά την OnTime: 12/25/2000 7:41:23 PM
Εκτέλεση μακροεντολής συμβάντων: 2/27/2010 7:41:33 μμ

Επιλογή για άλλες εφαρμογές του Office

Άλλες εφαρμογές του Office δεν εφαρμόζουν OnTime. Για αυτούς, έχετε πολλές επιλογές. Πρώτον, μπορείτε να χρησιμοποιήσετε τη λειτουργία χρονοδιακόπτη, η οποία απλά επιστρέφει τον αριθμό των δευτερολέπτων από τα μεσάνυχτα στον υπολογιστή σας και κάνει τα μαθηματικά σας, ή μπορείτε να χρησιμοποιήσετε τις κλήσεις API των Windows. Η χρήση των κλήσεων API των Windows έχει το πλεονέκτημα ότι είναι πιο ακριβής από τον Χρονοδιακόπτη. Εδώ είναι μια ρουτίνα που προτείνεται από τη Microsoft που κάνει το τέχνασμα:

Ιδιωτική Διακήρυξη Λειτουργία getFrequency Lib "kernel32" _
Ονομάστε το "QueryPerformanceFrequency" (cyFrequency ως νόμισμα) όσο καιρό
Δημόσια Δημόσια Λειτουργία getTickCount Lib "kernel32" _
Το άλμπουμ "QueryPerformanceCounter" (cyTickCount ως νόμισμα) όσο καιρό
Sub TestTimeAPICalls ()
Dim dTime ως διπλό
dTime = MicroTimer
Dim StartTime ως ενιαία
StartTime = Χρονοδιακόπτης
Για i = 1 έως 10000000
Dim j Ως διπλό
j = Sqr (ί)
Επόμενο
Debug. Print ("Ο χρόνος λήψης MicroTimer ήταν:" & MicroTimer - dTime)
End Sub
Λειτουργία MicroTimer () ως διπλό
'
'Επιστρέφει δευτερόλεπτα.
'
Dim cyTicks1 ως νόμισμα
Στατική cyFrequency ως νόμισμα
'
MicroTimer = 0
'Πάρτε συχνότητα.
Αν cyFrequency = 0 τότε getFrequency cyFrequency
'Πάρτε τσιμπούρια.
getTickCount cyTicks1
'Δευτερόλεπτα
Εάν cyFrequency Στη συνέχεια MicroTimer = cyTicks1 / cyFrequency
Λειτουργία τερματισμού

instagram story viewer