Το Excel UDF δεν λειτουργεί: προβλήματα και λύσεις

  • Μοιραστείτε Αυτό
Michael Brown

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

Ακούστε τι θα συζητήσουμε:

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

    Γιατί το Excel UDF δεν υπολογίζει εκ νέου;

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

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

    Για να διορθώσετε το πρόβλημα, θα πρέπει απλά να χρησιμοποιήσετε το Application.Volatile Δες το επόμενο κεφάλαιο για να μάθεις βήμα προς βήμα τις οδηγίες για την εφαρμογή της.

    Πτητικές και μη πτητικές προσαρμοσμένες λειτουργίες

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

    Ας περάσουμε από τις λέξεις στα παραδείγματα. Για παράδειγμα, πρέπει να γράψετε το όνομα του βιβλίου εργασίας σας σε ένα κελί. Για να το κάνετε αυτό, δημιουργείτε μια προσαρμοσμένη συνάρτηση:

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    Φανταστείτε τώρα την ακόλουθη περίπτωση. Γράψατε προσαρμοσμένο τύπο =WorkbookName() στο κελί και πήρατε το όνομα του αρχείου εκεί. Σε λίγο καιρό, αποφασίσατε να μετονομάσετε το αρχείο και το αποθηκεύσατε με διαφορετικό όνομα. Αλλά κοιτάζετε την τιμή στο κελί και βλέπετε ότι δεν έχει αλλάξει. Υπάρχει ακόμα ένα παλιό όνομα αρχείου που δεν είναι πλέον σωστό.

    Δεδομένου ότι δεν υπάρχουν ορίσματα σε αυτή τη συνάρτηση, η συνάρτηση δεν υπολογίζεται εκ νέου (ακόμη και αν αλλάξετε το όνομα του βιβλίου εργασίας, το κλείσετε και, στη συνέχεια, το ανοίξετε ξανά).

    Σημείωση: Για να υπολογίσετε εκ νέου όλες τις συναρτήσεις στο αρχείο σας, μπορείτε να χρησιμοποιήσετε τη συντόμευση Ctrl + Alt + F9.

    Υπάρχει ευκολότερος τρόπος; Για να κάνετε τον τύπο να υπολογίζει εκ νέου κάθε φορά που αλλάζει το φύλλο εργασίας, χρειάζεστε μια επιπλέον γραμμή κώδικα. Επικολλήστε το ακόλουθο κομμάτι κώδικα στην αρχή της συνάρτησής σας:

    Application.Volatile

    Έτσι, ο κώδικάς σας θα μοιάζει ως εξής:

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

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

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

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

    Γιατί οι προσαρμοσμένες λειτουργίες δεν είναι διαθέσιμες

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

    Ωστόσο, αυτό δεν συμβαίνει πάντα. Ποια λάθη μπορούν να προκαλέσουν αυτή την κατάσταση;

    Εάν έχετε το Excel 2003-2007, τότε η UDF δεν εμφανίζεται ποτέ στην αναπτυσσόμενη λίστα. Εκεί μπορείτε να δείτε μόνο τις τυπικές συναρτήσεις.

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

    Βλέπετε, η προσαρμοσμένη συνάρτηση πρέπει να βρίσκεται σε μια τυπική ενότητα της VBA που ονομάζεται Ενότητες. Όταν προσθέτετε μια νέα ενότητα για να γράψετε τον κώδικα της συνάρτησης, δημιουργείται αυτόματα ένας φάκελος Ενότητες στον οποίο γράφονται όλες οι ενότητες.

    Αλλά μερικές φορές συμβαίνει να μην δημιουργείται μια νέα ενότητα. Στο επόμενο στιγμιότυπο οθόνης μπορείτε να δείτε ότι ο κώδικας προσαρμοσμένης συνάρτησης βρίσκεται στην ενότητα "Microsoft Excel Objects" μαζί με το ThisWorkbook.

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

    Το κείμενο βοήθειας προσαρμοσμένης λειτουργίας του Excel δεν εμφανίζεται

    Ένα άλλο πρόβλημα που μπορεί να προκύψει είναι η υπόδειξη που βλέπετε όταν επικολλάτε μια προσαρμοσμένη συνάρτηση. Αν χρησιμοποιείτε μια τυπική συνάρτηση, θα βλέπετε πάντα μια υπόδειξη εργαλείων για τη συνάρτηση και για τα ορίσματά της. Τι γίνεται όμως με τις UDF;

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

    Για αυτό, θα πρότεινα να χρησιμοποιήσετε το Application.MacroOptions Μέθοδος. Θα σας βοηθήσει να εμφανίσετε την περιγραφή όχι μόνο της συνάρτησης αλλά και κάθε ορίσματός της στο παράθυρο του Οδηγού συναρτήσεων. Το παράθυρο αυτό εμφανίζεται όταν κάνετε κλικ στο κουμπί Fx στη γραμμή τύπων.

    Ας δούμε πώς μπορείτε να προσθέσετε μια τέτοια υπόδειξη στις UDFs σας. Στο προηγούμενο άρθρο εξετάσαμε την προσαρμοσμένη συνάρτηση GetMaxBetween. Βρίσκει τον μέγιστο αριθμό στο καθορισμένο εύρος και λαμβάνει τρία ορίσματα: ένα εύρος αριθμητικών τιμών και μια μέγιστη και ελάχιστη τιμή προς αναζήτηση.

    Τώρα θα προσθέσουμε μια περιγραφή για αυτή την προσαρμοσμένη συνάρτηση. Για να το κάνουμε αυτό, δημιουργήστε και εκτελέστε την εντολή Application.MacroOptions Για την εντολή GetMaxBetween μπορείτε να εκτελέσετε την ακόλουθη εντολή:

    Sub RegisterUDF () Dim strFuncName As String 'όνομα της συνάρτησης που θέλετε να καταχωρήσετε Dim strDescr As String ' περιγραφή της ίδιας της συνάρτησης Dim strArgs () As String 'περιγραφή των ορίων της συνάρτησης ' Καταχωρήστε τη συνάρτηση GetMaxBetween ReDim strArgs (1 To 3) 'Αριθμός ορίων στη συνάρτησή σας strFuncName = "GetMaxBetween" strDescr = "Μέγιστος αριθμός στο καθορισμένο εύρος" strArgs (1) ="Εύρος αριθμητικών τιμών" strArgs (2) = "Κάτω όριο διαστήματος" strArgs (3) = "Άνω όριο διαστήματος" Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub

    ή

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Μέγιστος αριθμός στο καθορισμένο εύρος" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Range of numeric values" , _ "Lower interval border" , _ "Upper interval border" ) End Sub

    Μεταβλητή str FuncName είναι το όνομα της συνάρτησης. strDescr - περιγραφή της λειτουργίας. strArgs μεταβλητές περιέχουν υποδείξεις για κάθε όρισμα.

    Μπορεί να αναρωτιέστε ποιο είναι το τέταρτο όρισμα στο Application.MacroOptions. Αυτό το προαιρετικό όρισμα ονομάζεται Κατηγορία και υποδεικνύει την κατηγορία συναρτήσεων του Excel που η προσαρμοσμένη μας GetMaxBetween () Μπορείτε να την ονομάσετε όπως οποιαδήποτε από τις υπάρχουσες κατηγορίες: Math & Trig, Statistical, Logical, κ.λπ. Μπορείτε να καθορίσετε ένα όνομα για τη νέα κατηγορία στην οποία θα τοποθετείτε τις συναρτήσεις που δημιουργείτε. Εάν δεν χρησιμοποιήσετε το όρισμα Category, τότε η προσαρμοσμένη συνάρτηση θα τοποθετηθεί αυτόματα στην κατηγορία "User Defined".

    Επικολλήστε τον κώδικα της συνάρτησης στο παράθυρο της ενότητας:

    Στη συνέχεια κάντε κλικ στο κουμπί "Εκτέλεση". Η εντολή θα εκτελέσει όλες τις ρυθμίσεις για τη χρήση του Fx με το κουμπί GetMaxBetween() λειτουργία.

    Εάν προσπαθήσετε να εισάγετε μια συνάρτηση σε ένα κελί χρησιμοποιώντας το Λειτουργία εισαγωγής εργαλείο, θα δείτε ότι υπάρχει η δική σας GetMaxBetween βρίσκεται στην κατηγορία "Οι προσαρμοσμένες λειτουργίες μου":

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

    Στη συνέχεια, καλέστε το Οδηγός λειτουργιών με το κουμπί Fx.

    Συμβουλή. Μπορείτε επίσης να χρησιμοποιήσετε τον συνδυασμό πλήκτρων CRTL + A για να ανοίξετε τον Οδηγό λειτουργιών.

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

    Αν θέλετε να αλλάξετε το κείμενο αυτών των υποδείξεων, αλλάξτε τις τιμές των πεδίων strDescr και strArgs μεταβλητές στο RegisterUDF () Στη συνέχεια, εκτελέστε το RegisterUDF () εντολή ξανά.

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

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    Υπάρχει ένας ακόμη τρόπος για να λάβετε μια υπόδειξη όταν εισάγετε μια προσαρμοσμένη συνάρτηση. Εισάγετε το όνομα της συνάρτησης και στη συνέχεια πατήστε το πλήκτρο Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Θα δείτε μια λίστα με όλα τα ορίσματα της συνάρτησης:

    Δυστυχώς, εδώ δεν θα δείτε την περιγραφή της συνάρτησης και τα ορίσματά της. Αλλά αν τα ονόματα των ορίων είναι αρκετά κατατοπιστικά, οπότε μπορεί να είναι και αυτά χρήσιμα. Παρόλα αυτά, είναι καλύτερα από το τίποτα :)

    Θα χρειαστεί λίγη περισσότερη δουλειά για να δημιουργήσετε intellisense για UDFs που λειτουργούν όπως οι τυπικές συναρτήσεις του Excel. Δυστυχώς, η Microsoft δεν παρέχει καμία επιλογή. Η μόνη διαθέσιμη λύση είναι προς το παρόν μια επέκταση Excel-DNA IntelliSense. Μπορείτε να βρείτε περισσότερες πληροφορίες στον ιστότοπο του προγραμματιστή.

    Ελπίζουμε ότι αυτές οι οδηγίες θα σας βοηθήσουν να επιλύσετε προβλήματα όταν η προσαρμοσμένη συνάρτηση σας δεν λειτουργεί ή δεν λειτουργεί όπως θα θέλατε. Εάν όμως η UDF σας εξακολουθεί να μην λειτουργεί, παρακαλούμε περιγράψτε το πρόβλημα σας με ακρίβεια στην ενότητα Σχόλια. Θα προσπαθήσουμε να το καταλάβουμε και να βρούμε τη λύση για εσάς ;)

    Ο Michael Brown είναι ένας αφοσιωμένος λάτρης της τεχνολογίας με πάθος για την απλοποίηση πολύπλοκων διαδικασιών χρησιμοποιώντας εργαλεία λογισμικού. Με περισσότερο από μια δεκαετία εμπειρίας στον κλάδο της τεχνολογίας, έχει βελτιώσει τις δεξιότητές του στο Microsoft Excel και το Outlook, καθώς και στα Φύλλα Google και στα Έγγραφα. Το blog του Michael είναι αφιερωμένο στο να μοιράζεται τη γνώση και την τεχνογνωσία του με άλλους, παρέχοντας εύκολες συμβουλές και σεμινάρια για τη βελτίωση της παραγωγικότητας και της αποτελεσματικότητας. Είτε είστε έμπειρος επαγγελματίας είτε αρχάριος, το ιστολόγιο του Michael προσφέρει πολύτιμες πληροφορίες και πρακτικές συμβουλές για να αξιοποιήσετε στο έπακρο αυτά τα βασικά εργαλεία λογισμικού.