Excel UDF no funciona: problemes i solucions

  • Comparteix Això
Michael Brown

En aquest article, analitzarem els problemes que podeu trobar quan feu servir funcions personalitzades als vostres llibres de treball. Intentaré mostrar-vos què els causa i amb quina facilitat es poden resoldre.

Així és de què parlarem:

    Abans hem parlat de què és un La funció personalitzada és com crear-la i utilitzar-la. Si creieu que necessiteu actualitzar els coneixements bàsics de les UDF abans, feu una pausa i reviseu el meu article anterior.

    Per què no es recalcula Excel UDF?

    Quan feu canvis a el vostre llibre de treball, Excel no recalcularà totes i cadascuna de les fórmules que hi tingueu. Actualitzarà els resultats de les fórmules que només estan enllaçades a les cel·les modificades.

    Però això es refereix a les funcions estàndard d'Excel. Pel que fa a les personalitzades, Excel no pot validar el codi VBA i identificar altres cel·les que també podrien afectar el resultat de la funció personalitzada. Per tant, és possible que la vostra fórmula personalitzada no canviï quan feu canvis al llibre de treball.

    Per solucionar el problema, només haureu d'utilitzar la instrucció Application.Volatile . Consulteu el següent capítol per conèixer les instruccions pas a pas sobre com aplicar-lo.

    Funcions personalitzades volàtils i no volàtils

    Per defecte, les funcions personalitzades a Excel no són volàtils. Això vol dir que l'UDF només es torna a calcular si el valor d'alguna de les cel·les a les quals fa referència canvia. Però si el format de les cel·les, el nom de lafull de treball, el nom del fitxer canvia, llavors no es produiran canvis a l'UDF.

    Canviem de paraules a exemples. Per exemple, heu d'escriure el nom del vostre llibre de treball en una cel·la. Per fer-ho, creeu una funció personalitzada:

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

    Ara imagineu el cas següent. Heu escrit la fórmula personalitzada =WorkbookName() a la cel·la i hi heu obtingut el nom del fitxer. Al cap d'un temps, vau decidir canviar el nom del fitxer i el vau desar amb un altre nom. Però mireu el valor de la cel·la i observeu que no ha canviat. Encara hi ha un nom de fitxer antic que ja no és correcte.

    Com que no hi ha arguments en aquesta funció, la funció no es torna a calcular (encara que canvieu el nom del llibre de treball, tanqueu-lo i torneu a obrir-lo). it).

    Nota. Per tornar a calcular totes les funcions del vostre fitxer, podeu utilitzar la drecera Ctrl + Alt + F9.

    Hi ha una manera més fàcil? Per fer que la fórmula es torni a calcular cada vegada que canvia el full de treball, necessiteu una línia de codi addicional. Enganxeu el següent fragment de codi al principi de la vostra funció:

    Application.Volatile

    Per tant, el vostre codi tindrà aquest aspecte:

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

    Ara la vostra UDF és volàtil, per tant, es tornarà a calcular automàticament si hi ha alguna cel·la del full de treballs'ha tornat a calcular o s'ha produït cap canvi al llibre de treball. Tan bon punt canvieu el nom del fitxer, veureu aquesta actualització immediatament.

    Nota. Tingueu en compte que massa funcions volàtils poden alentir el vostre Excel. Al cap i a la fi, hi ha massa funcions personalitzades que realitzen càlculs complexos i operen en grans intervals de dades contínuament.

    Per tant, us recomano utilitzar la volatilitat només allà on realment es necessita.

    Per què les funcions personalitzades no estan disponibles

    Quan introduïu les primeres lletres del nom d'una funció personalitzada, apareix a la llista desplegable al costat de la cel·la d'entrada, igual que les funcions estàndard d'Excel.

    No obstant això, això no sempre passa. Quins errors poden provocar aquesta situació?

    Si teniu Excel 2003-2007, la UDF no apareix mai a la llista desplegable. Allà només podeu veure les funcions estàndard.

    Però fins i tot si feu servir una versió més recent d'Excel, hi ha un altre error que podeu cometre accidentalment.

    Ja veieu, la funció personalitzada ha d'estar a un mòdul VBA estàndard anomenat Mòduls. Quan afegiu un mòdul nou per escriure el codi de la funció, es crea automàticament una carpeta Mòduls en la qual s'escriuen tots els mòduls.

    Però de vegades passa que un mòdul nou no ho és. creant-se. A la següent captura de pantalla podeu veure que el codi de funció personalitzat es troba al mòdul "Microsoft Excel Objects" juntament ambAquest llibre de treball.

    La qüestió és que no podeu col·locar una funció personalitzada a l'àrea de codi d'un full de treball o llibre de treball. En aquest cas, la funció no funcionarà. A més, no apareixerà a la llista desplegable de funcions. Per tant, el codi hauria d'estar sempre a la carpeta Mòduls .

    No es mostra el text d'ajuda de la funció personalitzada d'Excel

    Un altre problema que pot aparèixer és la pista que veieu quan enganxeu una funció personalitzada. Si utilitzeu una funció estàndard, sempre veureu una informació sobre eines per a la funció i els seus arguments. Però, què passa amb les UDF?

    Si teniu moltes funcions personalitzades, us serà molt difícil recordar quins càlculs fa cadascuna d'elles. Serà encara més difícil recordar quins arguments utilitzar. Crec que seria una bona idea tenir una descripció de les vostres funcions personalitzades com a recordatori.

    Per a això, us suggeriria que utilitzeu el mètode Application.MacroOptions . Us ajudarà a mostrar la descripció no només de la funció sinó també de cadascun dels seus arguments a la finestra de l'assistent de funcions. Veu aquesta finestra quan feu clic al botó Fx a la barra de fórmules.

    Vem a veure com afegir una pista d'aquest tipus a les vostres UDF. A l'article anterior vam analitzar la funció personalitzada GetMaxBetween. Troba el nombre màxim a l'interval especificat i pren tres arguments: un rang de valors numèrics i un valor màxim i mínim percerca.

    Ara afegirem una descripció per a aquesta funció personalitzada. Per fer-ho, creeu i executeu l'ordre Application.MacroOptions . Per a la funció GetMaxBetween , podeu executar l'ordre següent:

    Sub RegisterUDF () Dim strFuncName As String 'nom de la funció que voleu registrar Dim strDescr As String ' descripció de la funció mateix Dim strArgs () As String 'descripció dels arguments de la funció ' Registre la funció GetMaxBetween ReDim strArgs (1 a 3) 'Nombre d'arguments a la funció strFuncName = "GetMaxBetween" strDescr = "Número màxim a l'interval especificat" strArgs (1) = "Rang de valors numèrics" strArgs (2) = "Bord inferior de l'interval " strArgs (3) = " Vora de l'interval superior " Macro d'aplicació.MacroOptions: = strFuncName, _ Descripció: = strDescr, _ ArgumentDescriptions: = strArgs, _ Categoria: = " Les meves funcions personalitzades " End Sub

    o

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Número màxim a l'interval especificat" , _ Categoria: = "El meu Funcions personalitzades" , _ ArgumentDescriptions: = Matriu (_ "Rang de valors numèrics" , _ "Interval inferior bor der" , _ "Bord de l'interval superior" ) End Sub

    Variable str FuncName és el nom de la funció. strDescr - descripció de la funció. Les variables strArgs contenen pistes per a cada argument.

    Us podeu preguntar quin és el quart argument per aAplicació.MacroOpcions. Aquest argument opcional s'anomena Categoria i indica la classe de funcions d'Excel on es col·locarà la nostra funció personalitzada GetMaxBetween () . Podeu anomenar-lo amb qualsevol de les categories existents: Matemàtiques i amp. ; Trig, Estadística, Lògica, etc. Podeu especificar un nom per a la nova categoria en la qual col·locareu les funcions que creeu. Si no feu servir l'argument Categoria, la funció personalitzada es col·locarà automàticament a la categoria "Definit per l'usuari".

    Enganxeu el codi de la funció a la finestra del mòdul:

    A continuació, feu clic al botó "Executar". L'ordre realitzarà tots els paràmetres per utilitzar el botó Fx amb la funció GetMaxBetween() .

    Si intenteu inserir una funció a una cel·la mitjançant la Insereix una funció , veureu que la vostra funció GetMaxBetween es troba a la categoria "Les meves funcions personalitzades":

    Vostè simplement podeu començar a escriure el nom de la funció a la cel·la i veureu la vostra funció personalitzada a la llista desplegable de funcions per seleccionar.

    A continuació, truqueu a Assistent de funcions. amb el botó Fx.

    Consell. També podeu utilitzar la combinació de tecles CRTL + A per obrir l'assistent de funcions.

    A la finestra Auxiliar de funcions veureu una descripció de la vostra funció, així com una pista per al primer argument. Si col·loqueu el cursor sobresegon o tercer argument, també hi veureu pistes.

    Si voleu canviar el text d'aquestes pistes, canvieu els valors de strDescr i strArgs variables al codi RegisterUDF () . A continuació, torneu a executar l'ordre RegisterUDF () .

    Si voleu desfer tots els paràmetres fets i esborrar la descripció de la funció, executeu aquest codi:

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Descripció: = Buit , ArgumentDescriptions: = Buit , Categoria: = Buit End Sub

    Hi ha una manera més d'obtenir una pista quan introduïu una funció personalitzada. Introduïu el nom de la funció i, a continuació, premeu Ctrl + Maj + A :

    =GetMaxBetween( + Ctrl + Maj + A

    Veureu una llista de tots els arguments de la funció:

    Desafortunadament, aquí no veureu la descripció de la funció i els seus arguments. Però si els noms dels arguments són força informatius, també poden ser útils. Tot i així, és millor que res :)

    Es necessitarà una mica més de feina per crear intellisense per a UDF que funcionin com les funcions estàndard d'Excel. Malauradament, Microsoft no ofereix cap opció. L'única solució disponible actualment és una extensió Excel-DNA IntelliSense. Podeu trobar més informació al lloc web del desenvolupador.

    Tant de bo, aquestes directrius us ajudaran a resoldre problemes quan la vostra funció personalitzada no funciona o no funciona.treballeu com vulgueu. Tanmateix, si la vostra UDF encara no funciona, descriu el vostre problema amb precisió a la secció de comentaris. Intentarem esbrinar-ho i trobar la solució per a tu ;)

    Michael Brown és un entusiasta de la tecnologia dedicat amb una passió per simplificar processos complexos mitjançant eines de programari. Amb més d'una dècada d'experiència en la indústria tecnològica, ha perfeccionat les seves habilitats en Microsoft Excel i Outlook, així com en Google Sheets i Docs. El bloc de Michael es dedica a compartir els seus coneixements i experiència amb altres persones, oferint consells i tutorials fàcils de seguir per millorar la productivitat i l'eficiència. Tant si sou un professional experimentat com si sou un principiant, el bloc de Michael ofereix valuoses idees i consells pràctics per treure el màxim profit d'aquestes eines de programari essencials.