En Excel, una función personalizada (UDF en inglés) es una función escrita por el usuario o por un programador para añadir alguna funcionalidad no implementada en la aplicación, o bien para simplificar algunas fórmulas que resultan largas, ininteligibles y a menudo casi imposibles de escribir y mantener.
Rotundamente, no.
Las fórmulas de Excel son mucho más rápidas que cualesquiera que podamos escribir los programadores de VBA, y además ocupan bastante menos espacio en disco. Pero sucede que a veces la fórmula requerida para hacer algo usando las funciones de hoja de cálculo de Excel (suponiendo que existan) resulta larguísima y complicada, haciendo casi imposible su comprensión y mantenimiento, incluso para su propio autor. En el caso de estas fórmulas, a las que en el mundillo de Excel se las suele denominar “megafórmulas”, puede resultar más cómodo optar por una función personalizada.
Lo habitual es situarla en el libro donde vaya a ser necesaria. Una vez abierto dicho libro hay que entrar en el editor de VBA (Visual Basic para Aplicaciones) pulsando Alt + F11 o desde Herramientas -> Macro -> Editor de Visual Basic.
Las funciones personalizadas deben ser ubicadas en módulos creados por el usuario, nunca en los módulos pertenecientes a los objetos de Excel (Thisworkbook, que es el módulo del libro, o en los módulos de las hojas).
Para crear un nuevo módulo hay que hacer Insertar -> Módulo (desde el editor de VBA), aunque las funciones también pueden situarse en módulos existentes, haciendo una doble pulsación sobre el que se desee para abrirlo. Finalmente hay que pegar o escribir el código de la función en la ventana Código.
Si se necesitase que una función personalizada estuviera disponible para muchos libros, se podría evitar tener que ponerla en todos ellos situándola en un libro que estuviera en el directorio Office\XLStart, en el directorio de inicio alternativo (Herramientas->Opciones->solapa "General"), en el libro de macros personal o en un complemento.
Si los libros estuvieran destinados a terceras personas en otras computadoras, habría que situar la función en un módulo dentro de una plantilla y basar los libros en dicha plantilla.
La sintaxis para utilizar una función personalizada en una hoja es igual a la de las funciones que incorpora Excel. Por ejemplo, supongamos una función personalizada llamada MiSuma cuyo cometido fuera sumar las celdas o rangos que se le pasaran como argumentos. La sintaxis para sumar tres celdas sería:
=MiSuma(A1;B1;C1)
La sintaxis para sumar tres rangos sería:
=MiSuma(A1:A5;B1:B5;C1:C5)
Y también sería posible sumar dos o más rangos con nombre:
=MiSuma(RangoConNombre1;RangoConNombre2)
Es necesario destacar que el separador de los argumentos puede ser el punto y coma o la coma, dependiendo del separador de listas que esté definido en la configuración regional del sistema en Panel de control -> Configuración regional.
Sí, mediante la propiedad MacroOptions del objeto Application, la cual permite también asignar el texto que aparecerá como comentario para la función cuando se hace Insertar->Función. La sintaxis para la propiedad MacroOptions es:
Application.MacroOptions Macro:="NombreDeLaFunción", Description:="Texto que aparecerá", Category:= NúmeroDeLaCategoría
Donde NúmeroDeLaCategoría es un entero del 1 al 15, según la siguiente tabla:
1.- Funciones financieras
2.- Funciones de fecha y hora
3.- Funciones matemáticas
4.- Funciones estadísticas
5.- Funciones de búsqueda y referencia
6.- Funciones de base de datos
7.- Funciones de texto
8.- Funciones lógicas
9.- Funciones de información
10.- Funciones de comandos
11.- Funciones personalizadas
12.- Funciones de control de macros
12.- Funciones DDE Externas
14.- Funciones definidas por usuario
15.- Funciones de ingeniería
Si no se usa el parámetro Category, o si no establece la propiedad MacroOptions para la función, la misma aparece en la categoría de Funciones definidas por usuario.
Las funciones personalizadas no pueden modificar el entorno de Excel. Por ejemplo, no pueden:
- cambiar el color de una celda, incluso aunque sea la que tiene la llamada a la función
- insertar o borrar filas, columnas u hojas
- modificar el valor de otra celda que no sea la que invocó a la función
- ordenar rangos
- etcétera.
Si una o varias celdas con funciones definidas por el usuario no están siendo actualizadas al modificarse los datos, es posible "forzar" a Excel a recalcularlas siempre que se produzca un recálculo declarando la función como volátil, lo que se consigue poniendo la siguiente instrucción:
Application.Volatile
dentro de la propia función, siendo una práctica habitual colocar la instrucción como primera línea de código de la función.
Si el libro es muy grande o costoso de calcular, no recomiendo el uso de esta sentencia porque la función que la contenga se recalculará cada vez que Excel haga un recálculo, incluso si las modificaciones que han provocado el recálculo no tienen nada que ver con el o los rangos afectados por la función personalizada.
Variable=FunciónPersonalizada(Argumento1, Argumento2)
Un evento es una acción que puede ser reconocida por un objeto. Cuando se produce un evento, se ejecuta el código asociado al mismo, si lo hay. Ejemplos de eventos podrían ser: al abrir un libro, al imprimir, al seleccionar una hoja, al cambiar la celda seleccionada, etc.
En Excel hay muchos tipos de eventos. Los eventos de libros, hojas de cálculo y hojas de gráfico pueden usarse simplemente escribiendo el código necesario en su módulo correspondiente (ThisWorkbook para los libros). Los eventos para Application, gráficos incrustados (los objetos ChartObject) y QueryTables requieren la creación de un objeto con eventos, lo que ha de hacerse desde un módulo de clase.
En www.jrgc.es/eventos01.htm hay algunos ejemplos de eventos.
El código para un evento que queramos usar se tiene que situar en el módulo del objeto en el que se produce el evento. Si es el libro, en su módulo (ThisWorkbook), y si es una hoja de cálculo también en su módulo, cuyo nombre (por defecto) es el de la hoja.
Es conveniente dejar que sea Excel el que se encargue de crear el cuerpo del código del evento porque casi todos ellos tienen uno o varios parámetros que han de figurar necesariamente en su declaración. Por lo tanto, para crear un evento lo mejor es entrar en el editor de VBA (Alt + F11), hacer doble click en el objeto para el que se necesita crear el evento (ThisWorkbook o el módulo de una hoja) y cambiar la selección del cuadro de diálogo superior izquierdo de (General) a Workbook o Worksheet, según corresponda. Por defecto Excel creará el evento Workbook_Open si se trata de ThisWorkbook o el evento Worksheet_SelectionChange si se trata del módulo de una hoja, pero si el evento creado no es el que interesa no hay más que borrarlo y seleccionar en el desplegable superior derecho el que se necesite.
En mi experiencia, este problema se ha dado siempre cuando la hoja destino tiene código en su evento Worksheet_Activate(). Excel borra el contenido del portapapeles al procesar el código del evento si el código modifica la hoja. La solución es bastante sencilla, una vez que se conoce: basta con entrar en el editor de VBA y teclear en la ventana Inmediato:
Application.EnableEvents=False
Tras hacer las operaciones de copiado y pegado que se necesite, normalmente se deseará que los eventos vuelvan a estar activos, para lo que bastará con teclear en esa misma ventana Inmediato:
Application.EnableEvents=True
Sí.
Y, además, es aconsejable configurar el editor de VBA para que siempre ponga automáticamente dicha instrucción en todos los módulos nuevos. Esto se hace desde Herramientas->Opciones->Solapa “Editor”, marcando la casilla “Requerir declaración de variables”.
Esta instrucción obliga al programador a declarar las variables de forma explícita, lo que al principio puede resultar molesto pero a la larga facilita la depuración del código y evita errores muy difíciles de localizar, especialmente en proyectos grandes.
El nivel de seguridad para la ejecución de código por defecto (Herramientas->Macro->Seguridad) está en “Medio”, lo que significa que antes de abrir un libro cuyo código no está firmado por una fuente de confianza Excel preguntará si se autoriza o no su ejecución; y lo mejor es dejarlo así.
Rebajarlo a la seguridad “Mínima” no acarrearía ningún riesgo si jamás se fuera a abrir un libro creado por un tercero, lo que hoy en día, con el correo electrónico y el trabajo en grupo, resulta muy difícil garantizar. Y aumentar la seguridad a su nivel máximo impediría la ejecución de cualquier código, a no ser que el proyecto VBA estuviera firmado por una fuente de confianza.
Sí, es posible, utilizando como plantilla la constante xlWBATWorksheet. Por ejemplo, para crear un nuevo libro con una sola hoja (sea cual sea el número de hojas predeterminado para los libros nuevos) y asignárselo a un objeto WorkBook llamado wkbLibroNuevo, el código sería:
Dim wkbLibroNuevo As Workbook
Set wkbLibroNuevo = Workbooks.Add(xlWBATWorksheet)
Nota: si lo que se desea es que todos los libros nuevos tengan una sola hoja, lo único que hay que hacer es establecerlo así en Herramientas->Opciones->solapa 'General'->Número de hojas en nuevo libro.
Si no es posible entrar en Excel, hay algunas cosas que se pueden intentar, aunque en ningún caso puedo garantizar que lo siguiente vaya a solucionar el problema. Pero tampoco lo empeorará.
Probar si se puede entrar desactivando todos los complementos y cualquier libro que se pueda estar cargando automáticamente.
Para ello, hay que hacer Inicio->Ejecutar, y teclear en “Abrir”:
Excel /Automation
Si aparece un mensaje avisando que no es posible encontrar Excel, habría que situarse, desde una ventana de "Símbolo del sistema", en el directorio donde esté su ejecutable (Excel.exe), el cual normalmente es C:\Archivos de programa\Microsoft Office\Office, y teclear lo anterior.
Si se consiguiera entrar así, la imposibilidad de entrar en Excel en modo “normal” se debería a algún complemento o libro que se está cargando en el inicio.
En cuanto a los complementos, habría que desmarcarlos todos desde Herramientas->Complementos e intentar entrar en Excel en modo “normal”. Si se consigue, habría que ir activando de nuevo los complementos uno por uno hasta encontrar al que está provocando el problema.
En cuanto a los libros, sería necesario evitar que se cargaran moviendo a otro directorio cualquier libro que se encontrara en el directorio XLStart o en el directorio de inicio alternativo establecido en Herramientas->Opciones->solapa “General”->Archivos de inicio alternativos en:”, y luego habría que ir situándolos de nuevo en el directorio uno a uno hasta localizar el que da problemas.
Probar si se puede entrar omitiendo la configuración personalizada de las barras de herramientas.
El archivo que controla la disposición de las barras de herramientas se llama Excel.xlb, Excel10.xlb en Office XP o Excel11.xlb en Office 2003. Este archivo tiene cierta tendencia a corromperse: en los foros sobre Excel aparecen con cierta frecuencia mensajes preguntando sobre la forma de solucionar problemas al arrancar. Por ejemplo, se informa de que aparece un mensaje como “error en el módulo MS09.DLL” o que se muestra la pantalla de inicio de Excel pero no pasa de ahí. A menudo el problema está causado por este archivo .xlb.
Un problema añadido en lo que respecta a este archivo es que no es regenerado al reinstalar Office, lo cual tiene cierto sentido porque, al ser el archivo que almacena la disposición personalizada de las barras de herramientas, si se borrara se perdería dicha disposición. Pero esto tiene el grave inconveniente de que si el archivo se corrompe, reinstalar Office no solucionará el problema.
Si el sistema operativo es multiusuario (Windows 2000 o XP, por ejemplo), y hay más de un usuario creado, es posible cambiar de usuario e intentar entrar en Excel. Si se consiguiera, sería casi seguro que el archivo .xlb del usuario con el cual no se consigue entrar en Excel se ha dañado. Pero si en el equipo tan solo hay un usuario se puede saber si el problema al arrancar está causado por el archivo .xlb haciendo Inicio->Ejecutar, y tecleando en “Abrir”:
Excel /S
Si aparece un mensaje avisando que no es posible encontrar Excel, habría que situarse, desde una ventana de "Símbolo del sistema", en el directorio donde esté su ejecutable (Excel.exe), el cual normalmente es C:\Archivos de programa\Microsoft Office\Office, y teclear lo anterior.
Al abrir Excel en modo seguro no se carga la configuración de las barras de herramientas. Si se consiguiera entrar así, lo que habría que hacer es:
Luego habría que intentar entrar en Excel en modo normal. Si no se consiguiera, al menos se sabría que el problema no estaba causado por el archivo .xlb. En este caso habría que volver a darle al archivo su nombre anterior. Si se consiguiera entrar en Excel, automáticamente se creará un nuevo .xlb. El único problema es que se habrá perdido la configuración personalizada de las barras de herramientas.
Artículo de la KB de Microsoft sobre el tema
NOTA: Si se hacen copias de seguridad de los datos del equipo, es aconsejable incluir el archivo Excel.xlb en dichas copias. El tamaño del archivo es muy pequeño (normalmente no llega ni a 20 Kbs.), y tener una copia de él nos puede evitar perder la configuración personalizada de las barras de herramientas.
Sí, se puede. Hay disponible un visor de Excel con el que se puede ver un libro ya creado, aunque no modificarlo:
Descargar visor para Excel desde www.microsoft.com
Sí, es posible hacerlo, pero hay que tener en cuenta que para conseguirlo es necesario ejecutar código casi continuamente, lo cual podría interferir con otro código que tuviera el libro. Lo mejor es usar el parpadeo lo menos posible, y sólo en libros que no tengan más código.
Hay un ejemplo disponible aquí, pero si se abre el libro desde Internet Explorer el código fallará al cerrar el libro, por lo que lo mejor es guardarlo en el disco duro y abrirlo desde allí.
No consigo abrir los libros de Excel desde el explorador de Windows
Éste problema normalmente puede resolverse desde Herramientas->Opciones->solapa 'General', desmarcando la opción "Omitir otras aplicaciones". El siguiente enlace es a un artículo de la KB de Microsoft al respecto:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;211494
¿Qué son los "rangos dinámicos"?
Son Rangos con Nombre que ajustan automáticamente sus dimensiones, dependiendo de las filas y/o columnas que los forman en cada momento.
Por ejemplo, supongamos que en el rango Hoja1!A2:A10 tenemos una lista de nombres (la celda A1 sería el título), pero que dicha lista irá creciendo (o, para el caso, decreciendo) y se necesita tener en todo momento un rango con nombre que haga referencia a la lista completa.
Para conseguirlo, habría que hacer Insertar -> Nombre -> Definir (atajo: Control+F3), ponerle el nombre que se desee al rango y en 'Se refiere a:' la siguiente fórmula:
=DESREF(Hoja1!$A$2;0;0;CONTARA(Hoja1!$A:$A);1)
Lo único que habría que hacer para saber el número de nombres sería usar la siguiente fórmula en cualquier celda (excepto una de la columna A):
=FILAS(NombreDelRango)
En este ejemplo se puede ver cómo trabajan unos rangos dinámicos para que un gráfico esté permanentemente actualizado, sin importar si se añaden o se quitan filas del rango de datos de que se nutre.
Cuando se trabaja con rangos dinámicos, hay que tener la precaución de no dejar filas vacías entre medias de los datos (o, lógicamente, columnas vacías si el rango dinámico se refiriese a una fila en lugar de a una columna).
¿Qué son las "fórmulas matriciales"?
Fórmula matricial es la que se aplica a todas las celdas de
un rango o a todos los valores de una matriz
La notación que se suele usar para indicar que una fórmula es matricial es encerrarla entre
llaves { }, pero las llaves propiamente dichas no hay que teclearlas al
introducir la fórmula en Excel, sino que
deberían aparecer automáticamente al introducirla como matricial, para
lo cual hay que pulsar al mismo tiempo las teclas Mayúsculas Control y Entrada.
Algunas funciones de Excel, como por ejemplo SUMAPRODUCTO, trabajan con matrices
de forma implícita, por lo que no es necesario introducirlas como matriciales.
En este enlace hay bastantes
ejemplos de fórmulas matriciales, y en
este otro se puede consultar un índice por temas de dichas fórmulas.
No consigo que Excel me muestre bien un número de más de 15 dígitos.
La precisión numérica máxima de Excel es de 16 bytes (15 dígitos más el signo), de forma que si un número es muy grande o muy pequeño, a partir de su dígito 15º Excel comenzará a mostrar ceros.
En este enlace hay una demostración sobre esto, así como una posible forma de aumentar esta precisión numérica usando funciones personalizadas.
¿Para qué sirve el signo dólar en una fórmula?
En Excel, el signo $ se usa para convertir filas y/o columnas en referencias absolutas, de forma que no cambien al ser copiadas y pegadas, o extendidas.
Por ejemplo, si en una celda tenemos una fórmula con una referencia a la celda A1 y queremos que al copiar la celda con la fórmula y pegarla en otra la fórmula resultante siga haciendo referencia a A1, lo único que hay que hacer es convertir en absolutas tanto la fila como la columna mediante $A$1.
Es posible convertir en absolutas la fila y/o la columna, de forma independiente.
Mientras se está editando una fórmula, se puede alternar entre los distintos tipos de referencias situándose en la dirección que se desee modificar y pulsando F4 (el ciclo es: columna y fila absolutas -> columna relativa y fila absoluta -> columna absoluta y fila relativa -> columna y fila relativas).
Hay que tener en cuenta que el uso de referencias absolutas mediante el signo $ no sirve si lo que se necesita es hacer referencia a la dirección absoluta de una celda o rango incluso si se insertan o eliminan filas por encima suyo o columnas a su izquierda. En este caso sería necesario utilizar la función INDIRECTO. Por ejemplo, para hacer permanentemente referencia a la celda A1 de Hoja1, la sintaxis sería:
=INDIRECTO("Hoja1!A1")
Si el nombre de la hoja tuviese uno o varios espacios, sería necesario utilizar apóstrofes:
=INDIRECTO("'Hoja 1'!A1")
En una celda que debería tener una fecha o una hora aparece un número. ¿Por qué?
Excel almacena las fechas y horas como un número decimal en el que la parte entera representa la fecha y la parte decimal la hora.
Si en una celda con una fecha u hora aparece un número y se desea que se muestre como fecha u hora, lo único que hay que hacer es darle el formato adecuado a la celda desde Formato->Celdas->solapa 'Número'->Fecha (u hora).
De repente aparecen las fórmulas en las celdas en lugar de sus valores
Esto sucede porque se ha seleccionado la opción "Mostrar fórmulas", o porque se ha pulsado su atajo de teclado (Alt º). Para que vuelvan a aparecer los valores lo único que hay que hacer es volver a pulsar dicho atajo o presionar de nuevo el botón "Mostrar fórmulas".
Desde siempre ha habido un problema con la función RESIDUO (RESTO en Excel 2010 hasta el Service Pack 1), problema que hasta la versión 2003 provoca el error #¡NUM! si el dividendo de la división que ha de procesar RESIDUO es ≥ 134.217.728 (227) veces el divisor. Este error está reconocido por Microsoft y debidamente documentado.
Por ejemplo, si en Excel 2003 ponemos en A1 el número 134.217.727 y en B1 la fórmula =RESIDUO(A1;1), veremos que Excel devuelve 0, que es correcto. Pero si incrementamos en 1 el dividendo (134.217.728, ó =2^27), la misma fórmula devolvérá el error #¡NUM!.
A partir de Excel 2007 el problema se ha subsanado, pero sólo de forma parcial porque en Excel 2010 aún aparece este error si el dividendo es ≥ 1.125.900.000.000 veces el divisor. En el momento de escribir esto, hasta donde yo sé no hay reconocimiento de este problema por parte de Microsoft, así que obviamente tampoco está documentado de forma adecuada.
Pero que el problema no esté oficialmente reconocido no evita que exista: si en Excel 2010 ponemos en A1 el número 1.125.900.000.000 y en B1 la fórmula =RESIDUO(A1;1), veremos que Excel devuelve el error #¡NUM!, cosa que no sucede si el número es 1.125.899.999.999
La forma de solventar este inconveniente pasa por prescindir de RESIDUO y utilizar ENTERO en una expresión capaz de calcular el resto que se desee. Esta expresión está bien explicada en el enlace a la KB de Microsoft de más arriba, por lo que pienso que lo mejor es consultarla allí.
¿Cuántos días faltan para mi "cumple"?
Esta es una pregunta que recibí por correo electrónico, y como me hizo gracia la pongo en estas preguntas frecuentes.
Para saber los días que faltan para una fecha concreta (en este caso, nuestro "cumple"), lo único que hay que hacer es una resta entre dicha fecha y la fecha actual.
Por ejemplo, si en A1 ponemos la fecha de nuestro próximo "cumple" y en A2 ponemos
=A1-HOY()
aparecerán los días que faltan. Eso sí, habrá que tener la precaución de aplicarle a la celda donde esté la fórmula un formato numérico (o el general), ya que por defecto Excel pondrá formato de fecha.
Cambio de nombre en algunas funciones en Excel 2010
En la última versión de Excel, la 2010, Microsoft ha cambiado el nombre de algunas funciones. He aquí una tabla, que iré ampliando según me vaya tropezando con las funciones que han sufrido cambios, y mis opiniones sobre ellos:
Anterior | Excel 2010 | Comentarios |
EXTRAE | MED | Cambio absurdo. EXTRAE se entiende perfectamente, pero además si se quería cambiar su nombre al menos podía haberse rebautizado "MEDIO". "MED" tiene toda la pinta de ser una especie de "espanglish" para la función MID inglesa. |
RESIDUO | RESTO | Cambio correcto. En español (o al menos en el español de España), siempre se ha denominado "resto". |
RAIZ | RCUAD | Cambio correcto. RAIZ no es nada precisa ya que podría referirse también a raíces cúbicas, etc. |
MODA | MODA.UNO | Hay una nueva función, MODA.VARIOS, que devuelve los elementos "empatados" (si los hay) en el primer puesto de la tabla de repeticiones. Aparte de esto, hay una nueva función llamada (supongo que alguien sabrá por qué: yo lo ignoro) MODO, para mantener la compatibilidad con la MODA de las versiones anteriores. |
BUSCARV | CONSULTAV | Cambio incomprensible: Microsoft sabrá a santo de qué nos tiene que incordiar a sus clientes con nimiedades como esta. |
BUSCARH | CONSULTAH | Mismo comentario que para BUSCARH. |
NSHORA | TIEMPO | Cambio correcto. NSHORA era una especie de siglas para "Número de Serie Hora" |
CARACTER | CAR | Otro cambio-molestia que, como en el caso de MED, parece una especie de "espanglish" para la función CHAR inglesa. |
ESPACIOS | RECORTAR | Ninguno de los dos nombres, ni el actual ni su predecesor, da la menor pista sobre qué es lo que hace esta función. |
HORANUMERO | VALHORA | Cambio innecesario, pero al menos no resulta absurdo e incomprensible como otros. |
FECHANUMERO | VALFECHA | Mismo comentario que para HORANUMERO. |
Nota: para terminar de complicarnos la vida a los usuarios, Microsoft decidió deshacer estos cambios de nombre con el lanzamiento, en junio de 2011, del Service Pack 1 para Office 2010 (artículo de la KB al respecto).
Así pues, una vez instalado este Service Pack 1 tendremos que acostumbrarnos de nuevo a los nombres "de siempre".