La UDF de Excel no funciona: problemas y soluciones

  • Compartir Este
Michael Brown

En este artículo, echaremos un vistazo a los problemas a los que te puedes enfrentar cuando utilizas funciones personalizadas en tus libros de trabajo. Intentaré mostrarte cuál es la causa y cómo se pueden solucionar fácilmente.

Esto es de lo que hablaremos:

    Anteriormente hemos hablado de lo que es una función personalizada, cómo crearla y utilizarla. Si sientes que necesitas refrescar antes los conocimientos básicos sobre las UDF, haz una pausa y echa un vistazo a mi artículo anterior.

    ¿Por qué la UDF de Excel no recalcula?

    Cuando realices algún cambio en tu libro, Excel no recalculará todas y cada una de las fórmulas que tengas allí, sino que actualizará los resultados sólo para aquellas fórmulas que estén vinculadas a las celdas modificadas.

    Pero esto se refiere a las funciones estándar de Excel. En cuanto a las personalizadas, Excel no puede validar el código VBA e identificar otras celdas que también podrían afectar al resultado de la función personalizada. Por lo tanto, es posible que su fórmula personalizada no cambie cuando realice cambios en el libro.

    Para solucionar el problema, basta con utilizar la función Aplicación.Volátil Consulta el capítulo siguiente para saber cómo aplicarlo paso a paso.

    Funciones personalizadas volátiles y no volátiles

    Por defecto, las funciones personalizadas en Excel no son volátiles. Esto significa que la UDF se recalcula sólo si cambia el valor de alguna de las celdas a las que hace referencia. Pero si cambia el formato de las celdas, el nombre de la hoja de cálculo o el nombre del archivo, no se producirá ningún cambio en la UDF.

    Pasemos de las palabras a los ejemplos. Por ejemplo, necesitas escribir el nombre de tu libro de trabajo en una celda. Para ello, creas una función personalizada:

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

    Ahora imagine el siguiente caso. Usted escribió la fórmula personalizada =NombreLibroTrabajo() en la celda y obtuviste allí el nombre del archivo. Al cabo de un tiempo, decidiste cambiar el nombre del archivo y lo guardaste con otro nombre. Pero miras el valor en la celda y ves que no ha cambiado. Sigue habiendo un nombre de archivo antiguo que ya no es correcto.

    Como no hay argumentos en esta función, la función no se recalcula (aunque cambies el nombre del libro de trabajo, lo cierres y lo vuelvas a abrir).

    Nota: para recalcular todas las funciones del archivo, puede utilizar la combinación de teclas Ctrl + Alt + F9.

    ¿Hay alguna manera más fácil? Para hacer que la fórmula recalcule cada vez que cambia la hoja de cálculo, necesitas una línea de código extra. Pega el siguiente trozo de código al principio de tu función:

    Aplicación.Volátil

    Por lo tanto, su código se verá así:

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

    Ahora su UDF es volátil, por lo tanto se recalculará automáticamente si alguna celda de la hoja de cálculo se ha recalculado o se ha producido algún cambio en el libro de trabajo. En cuanto cambie el nombre del archivo, verá esa actualización inmediatamente.

    Nota. Tenga en cuenta que demasiadas funciones volátiles pueden ralentizar su Excel. Al fin y al cabo, hay demasiadas funciones personalizadas que realizan cálculos complejos y operan continuamente sobre grandes rangos de datos.

    Por lo tanto, recomiendo utilizar la volatilidad sólo cuando sea realmente necesario.

    Por qué no están disponibles las funciones personalizadas

    Al introducir las primeras letras del nombre de una función personalizada, ésta aparece en la lista desplegable junto a la celda de entrada, igual que las funciones estándar de Excel.

    Sin embargo, esto no siempre ocurre. ¿Qué errores pueden provocar esta situación?

    Si tienes Excel 2003-2007, entonces la UDF nunca aparece en la lista desplegable. Allí sólo puedes ver funciones estándar.

    Pero incluso si está utilizando una versión más reciente de Excel, hay otro error que puede cometer accidentalmente.

    Verá, la función personalizada debe estar en un módulo VBA estándar llamado Módulos. Cuando añade un nuevo módulo para escribir el código de la función, se crea automáticamente una carpeta Módulos en la que se escriben todos los módulos.

    En la siguiente captura de pantalla puede ver que el código de la función personalizada está en el módulo "Microsoft Excel Objects" junto con ThisWorkbook.

    La cuestión es que no se puede colocar una función personalizada en el área de código de una hoja o libro de trabajo. En este caso, la función no funcionará. Además, no aparecerá en la lista desplegable de funciones. Por lo tanto, el código debe estar siempre en la carpeta Módulos .

    No se muestra el texto de ayuda de las funciones personalizadas de Excel

    Otro problema que puede surgir es la sugerencia que ve cuando pega una función personalizada. Si utiliza una función estándar, siempre verá una sugerencia para la función y para sus argumentos, pero ¿qué ocurre con las UDF?

    Si tienes muchas funciones personalizadas, te resultará extremadamente difícil recordar qué cálculos hace cada una de ellas. Más difícil aún será recordar qué argumentos utilizar. Creo que será una buena idea tener una descripción de tus funciones personalizadas a modo de recordatorio.

    Para ello, le sugiero que utilice la función Aplicación.MacroOpciones Le ayudará a mostrar la descripción no sólo de la función, sino también de cada uno de sus argumentos en la ventana Asistente para funciones. Verá esta ventana cuando haga clic en el botón Fx de la barra de fórmulas.

    Veamos cómo añadir una pista de este tipo a sus UDFs. En el artículo anterior vimos la función personalizada GetMaxBetween. Encuentra el número máximo en el rango especificado y toma tres argumentos: un rango de valores numéricos, y un valor máximo y mínimo a buscar.

    Ahora vamos a añadir una descripción para esta función personalizada. Para ello, cree y ejecute el archivo Aplicación.MacroOpciones Para el comando GetMaxBetween puede ejecutar el siguiente comando:

    Sub RegisterUDF () Dim strFuncName As String 'nombre de la función que desea registrar Dim strDescr As String ' descripción de la propia función Dim strArgs () As String 'descripción de los argumentos de la función ' Registrar la función GetMaxBetween ReDim strArgs (1 To 3) 'Número de argumentos de su función strFuncName = "GetMaxBetween" strDescr = "Número máximo en el rango especificado" strArgs (1) ="Rango de valores numéricos" strArgs (2) = "Límite inferior del intervalo " strArgs (3) = "Límite superior del intervalo " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Mis funciones personalizadas " End Sub

    o

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Número máximo en el rango especificado" , _ Category: = "Mis funciones personalizadas" , _ ArgumentDescriptions: = Array (_ "Rango de valores numéricos" , _ "Límite inferior del intervalo" , _ "Límite superior del intervalo" ) End Sub

    Variable str FuncName es el nombre de la función. strDescr - Descripción de la función strArgs contienen sugerencias para cada argumento.

    Puede que se pregunte cuál es el cuarto argumento de Application.MacroOptions. Este argumento opcional se denomina Categoría e indica la clase de funciones de Excel que nuestra función personalizada GetMaxBetween () Puede darle el nombre de cualquiera de las categorías existentes: Matemáticas & Trigonometría, Estadística, Lógica, etc. Puede especificar un nombre para la nueva categoría en la que colocará las funciones que cree. Si no utiliza el argumento Categoría, la función personalizada se colocará automáticamente en la categoría "Definida por el usuario".

    Pegue el código de la función en la ventana del módulo:

    A continuación, haga clic en el botón "Ejecutar". El comando realizará todos los ajustes necesarios para utilizar la función Fx con su GetMaxBetween() función.

    Si intenta insertar una función en una celda utilizando la función Función de inserción verás que está tu GetMaxBetween se encuentra en la categoría "Mis funciones personalizadas":

    Sólo tiene que empezar a escribir el nombre de la función en la celda y verá su función personalizada en la lista desplegable de funciones para seleccionar.

    A continuación, llame al Asistente de funciones con el botón Fx.

    Consejo: también puede utilizar la combinación de teclas CRTL + A para abrir el Asistente para funciones.

    En el Asistente de funciones verás una descripción de la función, así como una sugerencia para el primer argumento. Si colocas el cursor sobre el segundo o tercer argumento, también verás sugerencias para ellos.

    Si desea cambiar el texto de estas sugerencias, cambie los valores de los campos strDescr y strArgs variables en el RegistrarUDF () A continuación, ejecute el código RegistrarUDF () de nuevo.

    Si quieres deshacer todos los ajustes realizados y borrar la descripción de la función, ejecuta este código:

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

    Existe otra forma de obtener una pista cuando se introduce una función personalizada. Introduzca el nombre de la función y, a continuación, pulse las teclas Ctrl + Mayús + A :

    =GetMaxBetween( + Ctrl + Mayús + A

    Verá una lista de todos los argumentos de la función:

    Desafortunadamente, aquí no verás la descripción de la función y sus argumentos. Pero si los nombres de los argumentos son bastante informativos, por lo que podrían ser útiles también. Aún así, es mejor que nada :)

    Llevará un poco más de trabajo crear intellisense para UDFs que funcionen como funciones estándar de Excel. Desafortunadamente, Microsoft no proporciona ninguna opción. La única solución disponible actualmente es una extensión Excel-DNA IntelliSense. Puede encontrar más información en el sitio web del desarrollador.

    Esperamos que estas directrices le ayuden a resolver problemas cuando su función personalizada no funcione o no lo haga como le gustaría. No obstante, si su UDF sigue sin funcionar, describa su problema con precisión en la sección Comentarios. Intentaremos averiguarlo y encontrar la solución por usted ;)

    Michael Brown es un entusiasta de la tecnología dedicado y apasionado por simplificar procesos complejos utilizando herramientas de software. Con más de una década de experiencia en la industria de la tecnología, ha perfeccionado sus habilidades en Microsoft Excel y Outlook, así como en Google Sheets y Docs. El blog de Michael está dedicado a compartir su conocimiento y experiencia con otros, brindando consejos y tutoriales fáciles de seguir para mejorar la productividad y la eficiencia. Ya sea un profesional experimentado o un principiante, el blog de Michael ofrece información valiosa y consejos prácticos para aprovechar al máximo estas herramientas de software esenciales.