Πίνακας περιεχομένων
Συνεχίζουμε τη σειρά σεμιναρίων για τις συναρτήσεις που ορίζονται από το χρήστη. Στα προηγούμενα άρθρα μας, γνωρίσαμε τις προσαρμοσμένες συναρτήσεις και μάθαμε πώς να τις δημιουργούμε και να τις χρησιμοποιούμε. Σε αυτό το εγχειρίδιο θα εξετάσουμε τις ιδιαιτερότητες της χρήσης αυτών των συναρτήσεων και θα δούμε τις διαφορές μεταξύ των UDF και των μακροεντολών της VBA.
Σε αυτό το σεμινάριο, θα μάθουμε τα εξής:
Ελπίζουμε ότι αυτό το άρθρο θα ενισχύσει τις γνώσεις σας σχετικά με τα UDF και θα σας βοηθήσει να τα χρησιμοποιήσετε ακόμη πιο αποτελεσματικά στα βιβλία εργασίας του Excel.
Είναι το UDF και το Macro το ίδιο πράγμα;
Τόσο οι συναρτήσεις που ορίζονται από τον χρήστη όσο και οι μακροεντολές VBA δημιουργούνται με τη χρήση του επεξεργαστή VBA. Ποια είναι η διαφορά μεταξύ τους και σε ποια πρέπει να δοθεί προτεραιότητα;
Η σημαντικότερη διαφορά είναι ότι η συνάρτηση εκτελεί τον υπολογισμό, ενώ η μακροεντολή εκτελεί κάποια ενέργεια. Μια συνάρτηση που ορίζεται από το χρήστη, όπως και μια κανονική συνάρτηση του Excel, πρέπει να γραφτεί σε ένα κελί. Ως αποτέλεσμα της εκτέλεσής της, το κελί επιστρέφει κάποια τιμή. Ταυτόχρονα, είναι αδύνατο να αλλάξει τις τιμές άλλων κελιών, καθώς και ορισμένες ιδιότητες του τρέχοντος κελιού (συγκεκριμένα,μορφοποίησης). Ωστόσο, μπορείτε να χρησιμοποιήσετε μια προσαρμοσμένη συνάρτηση σε τύπους μορφοποίησης υπό όρους.
Το UDF και η μακροεντολή VBA λειτουργούν με διαφορετικούς τρόπους. Για παράδειγμα, όταν δημιουργείτε ένα UDF στον επεξεργαστή Visual Basic, ξεκινάτε με μια δήλωση Λειτουργία και τελειώνουν με ένα Τέλος λειτουργίας Όταν εγγράφετε μια μακροεντολή, ξεκινάτε με μια δήλωση Υπο και τελειώνουν με ένα End Sub.
Δεν μπορούν να χρησιμοποιηθούν όλοι οι τελεστές της Visual Basic για τη δημιουργία UDF. Για το λόγο αυτό, μια μακροεντολή είναι μια πιο ευέλικτη λύση.
Μια μακροεντολή δεν απαιτεί από το χρήστη να δώσει ορίσματα (ούτε μπορεί να δεχτεί ορίσματα), σε αντίθεση με μια συνάρτηση που ορίζεται από το χρήστη.
Το θέμα είναι ότι ορισμένες εντολές των μακροεντολών μπορούν να χρησιμοποιούν διευθύνσεις κελιών ή στοιχεία μορφοποίησης (για παράδειγμα, χρώμα). Αν μετακινήσετε κελιά, προσθέσετε ή αφαιρέσετε γραμμές και στήλες, αλλάξετε τη μορφή των κελιών, τότε μπορείτε εύκολα να "σπάσετε" τις μακροεντολές σας. Αυτό είναι ιδιαίτερα πιθανό αν μοιράζεστε το αρχείο σας με συναδέλφους που δεν γνωρίζουν πώς λειτουργούν οι μακροεντολές σας.
Για παράδειγμα, έχετε ένα αρχείο με μια τέλεια λειτουργική μακροεντολή. Ο τύπος αυτός υπολογίζει το ποσοστό των κελιών A1 έως A4. Η μακροεντολή αλλάζει το χρώμα αυτών των κελιών σε κίτρινο. Στο ενεργό κελί ορίζεται μια μορφή ποσοστού.
Εάν εσείς ή κάποιος άλλος αποφασίσει να εισάγει μια νέα γραμμή, η μακροεντολή θα συνεχίσει να αναζητά την τιμή στο κελί A4 (η παράμετρος 4,1 στο UDF σας), θα αποτύχει και θα επιστρέψει ένα σφάλμα:
Σε αυτή την περίπτωση, το σφάλμα προέκυψε λόγω διαίρεσης με το μηδέν (δεν υπάρχει τιμή σε μια νεοπροστιθέμενη γραμμή). Σε περίπτωση που η μακροεντολή εκτελεί, ας πούμε, άθροιση, τότε απλώς θα λάβετε ένα λανθασμένο αποτέλεσμα. Αλλά δεν θα το γνωρίζετε.
Σε αντίθεση με τις μακροεντολές, οι συναρτήσεις που ορίζονται από τον χρήστη δεν μπορούν να προκαλέσουν μια τέτοια δυσάρεστη κατάσταση.
Παρακάτω βλέπετε την απόδοση των ίδιων υπολογισμών με τη χρήση ενός UDF. Εδώ μπορείτε να καθορίσετε τα κελιά εισόδου οπουδήποτε στο φύλλο εργασίας και δεν θα αντιμετωπίσετε απροσδόκητα προβλήματα κατά την αλλαγή τους.
Έγραψα τον ακόλουθο τύπο στο C3:
=UDF_vs_Macro(A1,A4)
Στη συνέχεια, εισήγαγα μια κενή γραμμή και ο τύπος άλλαξε, όπως μπορείτε να δείτε στο παραπάνω στιγμιότυπο οθόνης.
Τώρα μπορούμε να μετακινήσουμε ένα κελί εισόδου ή ένα κελί με μια συνάρτηση οπουδήποτε. Το αποτέλεσμα θα είναι πάντα σωστό.
Ένα πρόσθετο πλεονέκτημα της χρήσης των UDF είναι ότι ενημερώνονται αυτόματα όταν αλλάζει η τιμή στο κελί εισόδου. Όταν χρησιμοποιείτε μακροεντολές, πρέπει πάντα να διασφαλίζετε ότι όλα τα δεδομένα είναι ενημερωμένα.
Έχοντας αυτό το παράδειγμα κατά νου, θα προτιμούσα να χρησιμοποιώ UDFs όπου είναι δυνατόν και να χρησιμοποιώ μακροεντολές μόνο για άλλες μη υπολογιστικές δραστηριότητες.
Περιορισμοί και μειονεκτήματα της χρήσης UDF
Έχω ήδη αναφέρει τα πλεονεκτήματα της UDF παραπάνω. Για να μην τα πολυλογώ, μπορεί να εκτελέσει υπολογισμούς που δεν είναι δυνατοί με τις τυπικές συναρτήσεις του Excel. Επιπλέον, μπορεί να αποθηκεύσει και να χρησιμοποιήσει μακροσκελείς και πολύπλοκους τύπους, μετατρέποντάς τους σε μία μόνο συνάρτηση. Και δεν θα χρειάζεται να γράφετε περίπλοκους τύπους ξανά και ξανά.
Ας μιλήσουμε τώρα λεπτομερέστερα για τις ελλείψεις του UDF:
- Η δημιουργία UDF απαιτεί τη χρήση της VBA. Δεν υπάρχει τρόπος να το παρακάμψετε. Αυτό σημαίνει ότι ο χρήστης δεν μπορεί να καταγράψει την UDF με τον ίδιο τρόπο όπως μια μακροεντολή του Excel. Πρέπει να δημιουργήσετε την UDF μόνοι σας. Ωστόσο, μπορείτε να αντιγράψετε και να επικολλήσετε τμήματα του κώδικα της μακροεντολής που έχει καταγραφεί προηγουμένως στη συνάρτησή σας. Απλώς πρέπει να γνωρίζετε τους περιορισμούς των προσαρμοσμένων συναρτήσεων.
- Ένα άλλο μειονέκτημα της UDF είναι ότι, όπως κάθε άλλη συνάρτηση του Excel, μπορεί να επιστρέψει μόνο μια απλή τιμή ή έναν πίνακα τιμών σε ένα κελί. Εκτελεί απλώς υπολογισμούς, τίποτα περισσότερο.
- Αν θέλετε να μοιραστείτε το βιβλίο εργασίας σας με τους συναδέλφους σας, φροντίστε να αποθηκεύσετε τις UDF στο ίδιο αρχείο. Διαφορετικά, οι προσαρμοσμένες συναρτήσεις σας δεν θα λειτουργούν γι' αυτούς.
- Οι προσαρμοσμένες συναρτήσεις που δημιουργούνται με τον επεξεργαστή VBA είναι πιο αργές από τις κανονικές συναρτήσεις. Αυτό γίνεται ιδιαίτερα αισθητό σε μεγάλους πίνακες. Δυστυχώς, η VBA είναι μια πολύ αργή γλώσσα προγραμματισμού μέχρι στιγμής. Επομένως, αν έχετε πολλά δεδομένα, προσπαθήστε να χρησιμοποιείτε κανονικές συναρτήσεις όποτε είναι δυνατόν ή δημιουργήστε UDFs χρησιμοποιώντας τη συνάρτηση LAMBDA.
Περιορισμοί προσαρμοσμένης λειτουργίας:
- Οι UDF έχουν σχεδιαστεί για να εκτελούν υπολογισμούς και να επιστρέφουν μια τιμή. Δεν μπορούν να χρησιμοποιηθούν αντί για μακροεντολές.
- Δεν μπορούν να αλλάξουν τα περιεχόμενα άλλων κελιών (μόνο το ενεργό κελί).
- Τα ονόματα των συναρτήσεων πρέπει να ακολουθούν ορισμένους κανόνες. Για παράδειγμα, δεν μπορείτε να χρησιμοποιήσετε ένα όνομα που ταιριάζει με ένα εγγενές όνομα συνάρτησης του Excel ή μια διεύθυνση κελιού, όπως AB123.
- Η προσαρμοσμένη συνάρτησή σας δεν μπορεί να περιέχει κενά στο όνομα, αλλά μπορεί να περιλαμβάνει τον χαρακτήρα υπογράμμισης. Ωστόσο, η προτιμώμενη μέθοδος είναι να χρησιμοποιείτε κεφαλαία γράμματα στην αρχή κάθε νέας λέξης (για παράδειγμα, GetMaxBetween).
- Ένα UDF δεν μπορεί να αντιγράψει και να επικολλήσει κελιά σε άλλες περιοχές του φύλλου εργασίας.
- Δεν μπορούν να αλλάξουν το ενεργό φύλλο εργασίας.
- Τα UDF δεν μπορούν να αλλάξουν τη μορφοποίηση στο ενεργό κελί. Αν θέλετε να αλλάξετε τη μορφοποίηση ενός κελιού όταν εμφανίζονται διαφορετικές τιμές, θα πρέπει να χρησιμοποιήσετε τη μορφοποίηση υπό όρους.
- Δεν μπορούν να ανοίξουν επιπλέον βιβλία.
- Δεν μπορούν να χρησιμοποιηθούν για την εκτέλεση μακροεντολών που χρησιμοποιούν το Application.OnTime.
- Δεν είναι δυνατή η δημιουργία μιας συνάρτησης που έχει οριστεί από το χρήστη με τη χρήση της συσκευής εγγραφής μακροεντολών.
- Οι λειτουργίες δεν εμφανίζονται στο Προγραμματιστής> Μακροεντολές διάλογος.
- Οι λειτουργίες σας θα εμφανιστούν στο πλαίσιο διαλόγου ( Εισαγωγή> Λειτουργία ) και στον κατάλογο των συναρτήσεων μόνο εάν έχουν δηλωθεί ως Δημόσιο (αυτή είναι η προεπιλογή, εκτός αν αναφέρεται διαφορετικά).
- Οποιεσδήποτε συναρτήσεις δηλωμένες ως Ιδιωτικό δεν θα εμφανιστεί στη λίστα λειτουργιών.
Μια αρκετά αργή λειτουργία, καθώς και κάποιοι περιορισμοί στη χρήση, μπορεί να σας κάνουν να σκεφτείτε: "Ποια είναι η χρησιμότητα αυτών των προσαρμοσμένων λειτουργιών;"
Μπορούν να φανούν χρήσιμες και το κάνουν, αν έχουμε υπόψη μας τους περιορισμούς που τους επιβάλλονται. Αν μάθετε πώς να δημιουργείτε και να χρησιμοποιείτε σωστά τις UDF, μπορείτε να γράψετε τη δική σας βιβλιοθήκη συναρτήσεων. Αυτό θα επεκτείνει σημαντικά την ικανότητά σας να εργάζεστε με δεδομένα στο Excel.
Όσο για μένα, οι προσαρμοσμένες συναρτήσεις εξοικονομούν πολύ χρόνο. Και εσείς; Έχετε ήδη δοκιμάσει να δημιουργήσετε το δικό σας UDF; Σας άρεσε καλύτερα από τις βασικές συναρτήσεις του Excel; Ας το συζητήσουμε στα σχόλια :)