VBA: Βελτιώστε την ταχύτητα και άλλες βέλτιστες πρακτικές

Αυτό το σεμινάριο θα συζητήσει πώς να επιταχύνετε τις μακροεντολές VBA και άλλες βέλτιστες πρακτικές VBA.

Ρυθμίσεις για επιτάχυνση του κώδικα VBA

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

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

Απενεργοποιήστε την ενημέρωση οθόνης

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

Για να απενεργοποιήσετε την Ενημέρωση οθόνης:

1 Application.ScreenUpdating = Λάθος

Στο τέλος της μακροεντολής σας, θα πρέπει να ενεργοποιήσετε ξανά την Ενημέρωση οθόνης:

1 Application.ScreenUpdating = True

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

Ορίστε τους υπολογισμούς σε μη αυτόματο

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

Για να ορίσετε τους υπολογισμούς σε χειροκίνητα:

1 Application.Calculation = xlManual

Για να υπολογίσετε ξανά με μη αυτόματο τρόπο ολόκληρο το βιβλίο εργασίας:

1 Υπολογίζω

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

Για να επαναφέρετε τους αυτόματους υπολογισμούς (στο τέλος της διαδικασίας σας):

1 Εφαρμογή. Υπολογισμός = xlΑυτόματο

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

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

Απενεργοποίηση συμβάντων

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

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

Για να απενεργοποιήσετε τα συμβάντα:

1 Application.EnableEvents = Λάθος

Για να ενεργοποιήσετε ξανά τα συμβάντα:

1 Application.EnableEvents = True

Απενεργοποίηση PageBreaks

Η απενεργοποίηση των PageBreaks μπορεί να βοηθήσει σε ορισμένες περιπτώσεις:

  • Έχετε ορίσει προηγουμένως μια ιδιότητα PageSetup για το σχετικό φύλλο εργασίας και Η διαδικασία VBA τροποποιεί τις ιδιότητες πολλών γραμμών ή στηλών
  • Ή Η διαδικασία VBA σας αναγκάζει το Excel να υπολογίζει αλλαγές σελίδας (εμφανίζει προεπισκόπηση εκτύπωσης ή τροποποιεί τυχόν ιδιότητες του PageSetup).

Για να απενεργοποιήσετε τις PageBreaks:

1 ActiveSheet.DisplayPageBreaks = Λάθος

Για να ενεργοποιήσετε ξανά το PageBreaks:

1 ActiveSheet.DisplayPageBreaks = True

Βέλτιστες πρακτικές για τη βελτίωση της ταχύτητας VBA

Αποφύγετε την ενεργοποίηση και την επιλογή

Όταν εγγράφετε μια μακροεντολή, θα δείτε πολλές μεθόδους ενεργοποίησης και επιλογής:

12345678 Sub Slow_Example ()Φύλλα ("Φύλλο2"). ΕπιλέξτεΕύρος ("D9"). ΕπιλέξτεActiveCell.FormulaR1C1 = "παράδειγμα"Εύρος ("D12"). ΕπιλέξτεActiveCell.FormulaR1C1 = "επίδειξη"Εύρος ("D13"). ΕπιλέξτεΤέλος υπο

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

Βελτιωμένο Παράδειγμα:

1234 Υπο Fast_Example ()Φύλλα ("Φύλλο2"). Εύρος ("D9"). FormulaR1C1 = "παράδειγμα"Φύλλα ("Sheet2"). Range ("D12"). FormulaR1C1 = "demo"Τέλος υπο

Αποφύγετε την αντιγραφή και επικόλληση

Η αντιγραφή απαιτεί σημαντική μνήμη. Δυστυχώς, δεν μπορείτε να πείτε στο VBA να καθαρίσει την εσωτερική μνήμη. Αντ 'αυτού, το Excel θα καθαρίσει την εσωτερική του μνήμη σε (φαινομενικά) συγκεκριμένα διαστήματα. Έτσι, εάν εκτελείτε πολλές λειτουργίες αντιγραφής και επικόλλησης, διατρέχετε τον κίνδυνο να σπρώξετε πολύ μνήμη, γεγονός που μπορεί να επιβραδύνει δραστικά τον κώδικά σας ή ακόμα και να καταστρέψει το Excel.

Αντί για αντιγραφή και επικόλληση, σκεφτείτε να ορίσετε τις ιδιότητες τιμής των κελιών.

123456789 Sub CopyPaste ()'ΒραδύτερηΕύρος ("a1: a1000"). Εύρος αντιγραφής ("b1: b1000")'ΓρηγορότεραΕύρος ("b1: b1000"). Τιμή = Εύρος ("a1: a1000"). ΤιμήΤέλος υπο

Χρησιμοποιήστε τους βρόχους Για κάθε αντί για Βρόχους

Κατά την περιήγηση σε αντικείμενα, ο βρόχος For Every είναι ταχύτερος από τον βρόχο For. Παράδειγμα:

Αυτό για βρόχο:

123456 Υποβρόχος 1 ()dim i as RangeΓια i = 1 έως 100Κελιά (i, 1). Αξία = 1Επόμενο iΤέλος υπο
Είναι πιο αργό από αυτό για κάθε βρόχο:
123456 Υποβρόχος 2 ()Dim cell As RangeΓια κάθε κελί εντός εμβέλειας ("a1: a100")κελί. Αξία = 1Επόμενο κελίΤέλος υπο

Δήλωση μεταβλητών / Χρήση επιλογής ρητή

Το VBA δεν απαιτεί να δηλώσετε τις μεταβλητές σας, εκτός εάν προσθέσετε Option Explicit στο επάνω μέρος της μονάδας σας:
1 Επιλογή ρητή
Η προσθήκη ρητής επιλογής είναι μια βέλτιστη πρακτική κωδικοποίησης καθώς μειώνει την πιθανότητα σφαλμάτων. Σας αναγκάζει επίσης να δηλώσετε τις μεταβλητές σας, γεγονός που αυξάνει ελαφρώς την ταχύτητα του κωδικού σας (τα οφέλη είναι πιο αισθητά όσο περισσότερο χρησιμοποιείται μια μεταβλητή).Πώς το Option Explicit αποτρέπει σφάλματα;Το μεγαλύτερο όφελος για το Option Explicit είναι ότι θα σας βοηθήσει να εντοπίσετε ορθογραφικά λάθη ονόματος μεταβλητής. Για παράδειγμα, στο ακόλουθο παράδειγμα έχουμε ορίσει μια μεταβλητή που ονομάζεται «var1», αλλά αργότερα αναφέρουμε τη μεταβλητή που ονομάζεται «varl». Η μεταβλητή "varl" δεν έχει οριστεί, επομένως είναι κενή, προκαλώντας απροσδόκητα αποτελέσματα.
1234 Sub OptionExplicit ()var1 = 10MsgBox varlΤέλος υπο

Χρήση με - Τέλος με δηλώσεις

Εάν αναφέρετε τα ίδια αντικείμενα πολλές φορές (π.χ. εύρος, φύλλα εργασίας, βιβλία εργασίας), σκεφτείτε να χρησιμοποιήσετε τη δήλωση με. Είναι πιο γρήγορη στην επεξεργασία, μπορεί να κάνει τον κώδικα σας ευκολότερο στην ανάγνωση και απλοποιεί τον κώδικά σας.Με παράδειγμα δήλωσης:
12345678 Υπο Faster_Example ()Με φύλλα ("Φύλλο2").Range ("D9"). FormulaR1C1 = "παράδειγμα".Range ("D12"). FormulaR1C1 = "demo".Range ("D9"). Font.Bold = True.Range ("D12"). Font.Bold = TrueΤέλος μεΤέλος υπο
Είναι ταχύτερη από:
123456 Sub Slow_Example ()Φύλλα ("Φύλλο2"). Εύρος ("D9"). FormulaR1C1 = "παράδειγμα"Φύλλα ("Sheet2"). Range ("D12"). FormulaR1C1 = "demo"Φύλλα ("Φύλλο2"). Εύρος ("D9"). Font.Bold = TrueΦύλλα ("Sheet2"). Εύρος ("D12"). Font.Bold = TrueΤέλος υπο

Συμβουλές για βέλτιστες πρακτικές για προχωρημένους

Προστατεύστε το UserInterfaceOnly

Είναι καλή πρακτική να προστατεύετε τα φύλλα εργασίας σας από την επεξεργασία απροστάτευτων κελιών για να αποτρέψετε τον τελικό χρήστη (ή εσάς!) Από τυχαία καταστροφή του βιβλίου εργασίας. Ωστόσο, αυτό θα προστατεύσει επίσης το φύλλο εργασίας από τα VBA να κάνουν αλλαγές. Επομένως, πρέπει να προστατεύσετε και να προστατεύσετε εκ νέου τα φύλλα εργασίας, κάτι που είναι πολύ χρονοβόρο όταν γίνεται σε πολλά φύλλα.

12345 Υπο UnProtectSheet ()Φύλλα ("sheet1"). Μη προστατευμένος "κωδικός πρόσβασης"«Επεξεργασία φύλλου 1Φύλλα ("sheet1"). Προστασία "κωδικού πρόσβασης"Τέλος υπο

Αντ 'αυτού, μπορείτε να προστατεύσετε τα φύλλα με τη ρύθμιση UserInterfaceOnly: = True. Αυτό επιτρέπει στο VBA να κάνει αλλαγές σε φύλλα, ενώ παράλληλα τα προστατεύει από τον χρήστη.

1 Φύλλα ("sheet1"). Προστασία κωδικού πρόσβασης: = "password", UserInterFaceOnly: = True

Σπουδαίος! Το UserInterFaceOn επαναφέρει μόνο στο False κάθε φορά που ανοίγει το βιβλίο εργασίας. Έτσι, για να χρησιμοποιήσετε αυτήν την εκπληκτική λειτουργία, θα χρειαστεί να χρησιμοποιήσετε τα συμβάντα Workbook_Open ή Auto_Open για να ορίσετε τη ρύθμιση κάθε φορά που ανοίγει το βιβλίο εργασίας.

Τοποθετήστε αυτόν τον κωδικό στη μονάδα Thisbookbook:

123456 Private Sub Workbook_Open ()Dim ws Ως φύλλο εργασίαςΓια κάθε ws σε φύλλα εργασίαςws.Protect Password: = "password", UserInterFaceOnly: = TrueΕπόμενο wsΤέλος υπο

ή αυτόν τον κωδικό σε οποιαδήποτε κανονική ενότητα:

123456 Private Sub Auto_Open ()Dim ws Ως φύλλο εργασίαςΓια κάθε ws σε φύλλα εργασίαςws.Protect Password: = "password", UserInterFaceOnly: = TrueΕπόμενο wsΤέλος υπο

Χρησιμοποιήστε πίνακες για να επεξεργαστείτε μεγάλα εύρη

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

1234567891011121314151617181920212223242526272829303132 Sub LoopRange ()Dim cell As RangeDim tStart As DoubletStart = ΧρονοδιακόπτηςΓια κάθε κελί εντός εμβέλειας ("A1: A100000")cell.Value = cell.Value * 100Επόμενο κελίDebug.Print (Timer - tStart) & "seconds"Τέλος υποSub LoopArray ()Dim arr As VariantDim στοιχείο ως παραλλαγήDim tStart As DoubletStart = Χρονοδιακόπτηςarr = Εύρος ("A1: A100000"). ΤιμήΓια κάθε στοιχείο Σε βέλοςστοιχείο = στοιχείο * 100Επόμενο στοιχείοΕύρος ("A1: A100000"). Τιμή = arrDebug.Print (Timer - tStart) & "seconds"Τέλος υπο

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

wave wave wave wave wave