jueves, 7 de marzo de 2013

Asociar palabras (2 de 3)

Siguiendo con el problema planteado en la entrada anterior, vamos a asignar a las frases de la columna B el nombre de la ciudad asociada a la palabra clave que contiene el texto.

Segunda solución

Comprobamos  si la frase de la celda B3 contiene alguna palabra clave.

Seleccionamos H3:H10 y escribimos:
=HALLAR($E$3:$E$10;$B3)     [Terminar con Ctrl + Mayús + Intro]

Sustituimos los errores por FALSO y el número por VERDADERO.

Seleccionamos I3:I10 y escribimos:
=ESNUMERO($H$3:$H$10)     [Terminar con Ctrl + Mayús + Intro]

Determinamos en qué fila de la lista I3:I10 hay VERDADERO.

Seleccionamos J3:J10 y escribimos:
=($I$3:$I$10)*(FILA($E$3:$E$10)-FILA($E$3)+1)     [Terminar con Ctrl + Mayús + Intro

VERDADERO está en la fila 6. Aislamos ese valor en la celda K3.

En K3:
=SUMA($J$3:$J$10)      [Terminar con Intro]

Podría darse la circunstancia de que la frase no contuviera ninguna palabra clave, en cuyo caso, la fórmula de K3 devolvería cero. Hemos de tener en cuenta este supuesto para determinar el nombre de la ciudad asociada.

En L3:
=SI($K$3=0;"******";INDICE($F$3:$F$10;$K$3))      [Terminar con Intro]

Una vez desarrolladas todas las fórmulas (cinco columnas auxiliares), creamos en C3 la fórmula compuesta.

En C3:
=SI(SUMA((ESNUMERO(HALLAR($E$3:$E$10;$B3)))*(FILA($E$3:$E$10)-FILA($E$3)+1))=0;"******";INDICE($F$3:$F$10;SUMA((ESNUMERO(HALLAR($E$3:$E$10;$B3)))*(FILA($E$3:$E$10)-FILA($E$3)+1))))     [Terminar con Ctrl + Mayús + Intro]

Finalizamos extendiendo la fórmula hasta la fila 17.

Tercera solución

En la primera solución del artículo anterior usamos 7 columnas auxiliares; en la segunda solución, 5; y en ésta lo haremos con 4.

El primer paso es el mismo.

Seleccionamos H3:H10 y escribimos:
=HALLAR($E$3:$E$10;$B3)     [Terminar con Ctrl + Mayús + Intro]

Mantenemos los errores y sustituimos el número (si existe) por un 1.

Seleccionamos I3:I10 y escribimos:
=SI($H$3:$H$10>0;1;0)     [Terminar con Ctrl + Mayús + Intro]

Comprobamos en qué fila de la lista I3:I30 está el número 1.

En J3:
=COINCIDIR(1;$I$3:$I$10;0)     [Terminar con Intro]

Usamos la función INDICE para determinar la ciudad asociada. Si J3 contiene un error, lo capturamos con SI.ERROR y devolvemos una lista de asteriscos.

En K3:
=SI.ERROR(INDICE($F$3:$F$10;$J$3);"******")     [Terminar con Intro]

Ponemos la fórmula definitiva en C3:
=SI.ERROR(INDICE($F$3:$F$10;COINCIDIR(1;SI(HALLAR($E$3:$E$10;$B3)>0;1;0);0));"******")     [Terminar con Ctrl + Mayús + Intro]

Extendemos la fórmula hasta la fila 17.

Cuarta solución

También con 4 columnas auxiliares, podemos resolver el problema modificando ligeramente el razonamiento.

Seleccionamos H3:H10 y escribimos:
=HALLAR($E$3:$E$10;$B3)     [Terminar con Ctrl + Mayús + Intro]

En el segundo paso, sustituimos los errores por blancos, y el número por su posición en la lista H3:H10.

Seleccionamos I3:I10 y escribimos:
=SI(ESERROR($H$3:$H$10);"";FILA($F$3:$F$10)-2)     [Terminar con Ctrl + Mayús + Intro]

En J3:
=SUMA($I$3:$I$10)     [Terminar con Intro]

En K3:
=SI($J$3=0;"******";INDICE($F$3:$F$10;$J$3))     [Terminar con Intro]

Escribimos la fórmula compuesta en C3:
=SI(SUMA(SI(ESERROR(HALLAR($E$3:$E$10;$B3));"";FILA($F$3:$F$10)-2))=0;"******";INDICE($F$3:$F$10;SUMA(SI(ESERROR(HALLAR($E$3:$E$10;$B3));"";FILA($F$3:$F$10)-2))))     [Terminar con Ctrl + Mayús + Intro]

Extendemos la fórmula hasta la fila 17.



lunes, 4 de marzo de 2013

Asociar palabras (1 de 3)

Las frases de la columna B contienen palabras clave relacionadas con fenómenos meteorológicos. El objetivo del ejercicio es asignar a cada frase el nombre de la ciudad asociada a cada palabra clave según la tabla del rango E2:F10. El resultado irá en la columna C. Así, la frase "Como una ventisca helada", contiene la palabra clave "ventisca", que lleva asociada la ciudad de "Pisa".

El ejercicio lo resolveremos de varias maneras, empezando con los métodos que utilizan fórmulas más largas y terminando con las más cortas. En esta entrada estudiaremos la fórmula más larga y dejaremos las otras para otro artículo.

Primera solución

Usaremos las columnas H a N para obtener valores auxiliares. Finalizado el ejercicio podremos prescindir de esos valores ya que la fórmula compuesta la colocaremos en la columna C.

Usando la frase de la celda B3 para hacer el razonamiento, primero, comprobaremos, una a una, si hay alguna palabra clave en la frase. En caso de haberla, en qué lugar comienza. La frase que no contenga ninguna palabra clave devolverá un error. Inicialmente, todas las frases tienen una palabra clave. Más adelante consideraremos el caso de que no tengan ninguna.

Seleccionamos H3:H10 y escribimos:
=HALLAR($E$3:$E$10;$B3)     [Terminar con Ctrl + Mayús + Intro]

Sustituimos los errores por ceros.

Seleccionamos I3:I10 y escribimos:
=SI.ERROR($H$3:$H$10;0)     [Terminar con Ctrl + Mayús + Intro]

Sumando los números de la columna I obtendremos la posición en la que comienza la palabra clave.

En J3:
=SUMA($I$3:$I$10)     [Resultado: 10]

Ya sabemos que la palabra clave empieza en el carácter décimo. Ahora, necesitamos saber dónde acaba para determinar su longitud. Como no hemos puesto signos de puntuación, la palabra clave irá seguida de un espacio (si está en medio de la frase) o no habrá nada después de ella (si es la última palabra de la frase).

En K3:
=SI.ERROR(HALLAR(" ";$B3;J3);LARGO($B3)+1)     [Resultado: 18]

La longitud será la diferencia de las celdas K3 y J3.

En L3:
=K3-J3     [Resultado: 8]

La palabra clave la obtendremos extrayendo 8 caracteres (L3) de la frase (B3) empezando desde el carácter 10 (J3).

En M3:
=EXTRAE($B3;J3;L3)     [Resultado: ventisca]

Una vez que tenemos la palabra clave, con BUSCARV, obtenemos la ciudad asociada.

En N3:
=BUSCARV(M3;$E$3:$F$10;2;FALSO)     [Resultado: Pisa]

Sólo falta crear la fórmula compuesta en C3 y copiar la fórmula hacia abajo.

En C3:
=BUSCARV(EXTRAE($B3;SUMA(SI.ERROR(HALLAR($E$3:$E$10;$B3);0));SI.ERROR(HALLAR(" ";$B3;SUMA(SI.ERROR(HALLAR($E$3:$E$10;$B3);0)));LARGO($B3)+1)-SUMA(SI.ERROR(HALLAR($E$3:$E$10;$B3);0)));$E$3:$F$10;2;FALSO)     [Resultado: Pisa]

Arrastramos la fórmula hasta la fila 17.

¿Qué ocurre si alguna frase no tiene palabra clave? Para comprobarlo, sustituimos la frase de la celda B17 por la siguiente: "Cuando se disipó la bruma". Excel nos devuelve un error.

La solución es sencilla. Basta capturar el error con la función SI.ERROR y mostrar en su lugar un espacio en blanco, una línea, un conjunto de asteriscos, o lo que queramos.

En C3:
=SI.ERROR(BUSCARV(EXTRAE($B3;SUMA(SI.ERROR(HALLAR($E$3:$E$10;$B3);0));SI.ERROR(HALLAR(" ";$B3;SUMA(SI.ERROR(HALLAR($E$3:$E$10;$B3);0)));LARGO($B3)+1)-SUMA(SI.ERROR(HALLAR($E$3:$E$10;$B3);0)));$E$3:$F$10;2;FALSO);"*******")

Si añadimos nuevas frases a la columna B, tendremos que copiar hacia abajo la fórmula de la columna C. Sin embargo, esto no será necesario si transformamos la lista de las columnas B y C en una tabla. Para ello, nos colocamos en cualquier celda del rango B2:C17 y accedemos a Insertar + Tabla. Excel mostrará el cuadro de diálogo correspondiente.

Nos aseguramos de que muestre los valores de la figura y pulsamos Aceptar.

Añadimos unas cuantas frases:

En la columna C, las fórmulas de las nuevas filas se han generado automáticamente.

El método descrito no es del todo correcto. No funciona si la palabra clave va seguida de un punto, una coma o cualquier otro símbolo que no sea un espacio en blanco. La solución la veremos en los próximos artículos.



lunes, 25 de febrero de 2013

¿Se solapan las fechas?

En una hoja de cálculo se han puesto los programas de utilización de tres máquinas (B2:D18). Cada fila señala las fechas de comienzo y fin previstas para la realización de una tarea. Sin embargo, existe el riesgo de que se hayan cometido errores y algunas máquinas se hayan programado de modo que inicien sus actividades antes de terminar el trabajo de la tarea anterior.

Debemos determinar si se producen solapamientos en las programaciones de las máquinas. Los resultados irán en la columna E. Las columnas G a M se usarán para obtener resultados intermedios.
El razonamiento para resolver el problema lo haremos con la Máquina A de la celda B4. Constará de 8 pasos:
  1. Asignar FALSO a la máquina que estamos analizando (en nuestro caso la de la celda B4) y VERDADERO al resto (esto dará la primera matriz de valores VERDADERO y FALSO).
  2. Comprobar si el valor de B4 coincide con los otros valores de la columna B (segunda matriz, con valores VERDADERO Y FALSO).
  3. Comprobar si la fecha final de D4 es anterior a todas las fechas de comienzo (matriz con valores VERDADERO Y FALSO). Comprobar si la fecha inicial de C4 es posterior a todas las fechas finales (matriz con valores VERDADERO Y FALSO). Sumar ambas matrices (obtendremos la tercera matriz, con ceros y unos).
  4. Sustituir los ceros por unos y viceversa (se creará la cuarta matriz, con ceros y unos).
  5. Multiplicar las matrices de los apartados 1), 2) y 4).
  6. Sumar los elementos de la esta última matriz.
  7. Si el resultado es cero, no hay solapamiento. En caso contrario, hay solapamiento.
  8. Combinar todas las fórmulas en E4.
Seleccionamos G4:G18 y escribimos:
=FILA($B4)<>FILA($B$4:$B$18)     [Terminar con Ctrl + Mayús + Intro]

La primera referencia ($B4) debe ser mixta ya que una vez obtenida la fórmula definitiva la pondremos en E4 y la copiaremos hacia abajo. De ese modo, $B4 pasará a ser $B5, $B6...

Seleccionamos H4:H18 y escribimos:
=($B4=$B$4:$B$18)     [Terminar con Ctrl + Mayús + Intro]

Seleccionamos I4:I18 y escribimos:
=($D4<$C$4:$C$18)+($C4>$D$4:$D$18)     [Terminar con Ctrl + Mayús + Intro

Seleccionamos J4:J18 y escribimos:
=--NO($I$4:$I$18)     [Terminar con Ctrl + Mayús + Intro]

Seleccionamos K4:K18 y escribimos:
=($G$4:$G$18)*($H$4:$H$18)*($J$4:$J$18)     [Terminar con Ctrl + Mayús + Intro]

En L4:
=SUMA($K$4:$K$18)     [Terminar con Intro]

En M4:
=SI(L4=0;"No";"Sí")     [Terminar con Intro]

Sólo falta poner la fórmula compuesta en E4.

En E4:
=SI(SUMA((FILA($B4)<>FILA($B$4:$B$18))*(($B4=$B$4:$B$18))*(--NO(($D4<$C$4:$C$18)+($C4>$D$4:$D$18))))=0;"No";"Sí")     [Terminar con Ctrl + Mayús + Intro]

Extendemos la fórmula hasta la fila 18 y eliminamos las columnas G:M.




viernes, 22 de febrero de 2013

Sumar caracteres según su posición en el abecedario

En este ejercicio vamos a resolver un problema que, probablemente, no tiene una utilidad práctica inmediata pero que va a poner a prueba nuestro ingenio.

Asignaremos a cada letra un valor numérico que coincida con su posición en el abecedario, independientemente de que sea mayúscula, minúscula, esté acentuada  o lleve diéresis. Así,  "a", "á", "A" y "Á" tendrán valor 1; "b" y "B" tendrán valor 2; "u", "ú", "ü", "U", "Ú" y "Ü" tendrán valor 22; y así sucesivamente.

El problema va a consistir en escribir el nombre de una persona (o un texto cualquiera) y calcular, con arreglo al criterio anterior, la suma de las cifras asignadas a sus caracteres. El texto irá en la celda C2 y la suma en C3. Las celdas de las filas 6 a 26 las usaremos para hacer cálculos intermedios. Al final, crearemos una fórmula compleja y podremos eliminar los valores de las celdas auxiliares.

Resolveremos el ejercicio en 7 pasos:
  1. Quitar los espacios en blanco y poner el texto en mayúscula (MARTÍNCORTÉS).
  2. Contar los caracteres que han quedado (12).
  3. Generar una lista de números del 1 al total de caracteres (del 1 al 12).
  4. Extraer uno a uno todos los caracteres creando una matriz.
  5. Eliminar la tilde de las vocales que lo lleven.
  6. Asignar a cada letra un valor numérico según su posición en el abecedario.
  7. Sumar los números.
Para quitar los espacios usaremos la función SUSTITUIR, y para poner el texto en mayúscula, la función MAYUSC.

En C6:
=MAYUSC(SUSTITUIR($C$2;" ";))    [Resultado: MARTÍNCORTÉS]

El número de caracteres del texto se obtiene mediante la función LARGO.

En B9:
=LARGO(C6)     [Resultado: 12]

La lista de números del 1 al 12 la generamos mediante las funciones FILA y DESREF.

Seleccionamos C9:C26 y escribimos:
=FILA(DESREF($A$1;;;$B$9))     [Terminar con Ctrl + Mayús + Intro]

La matriz de caracteres individuales del texto se obtiene con la función EXTRAE.

Seleccionamos D9:D26 y escribimos:
=EXTRAE($C$6;$C$9:$C$26;1)     [Terminar con Ctrl + Mayús + Intro]

La eliminación de las tildes de las vocales acentuadas se realiza con las funciones CODIGO, ELEGIR y COINCIDIR.

Seleccionamos E9:E26 y escribimos:
=SI(CODIGO($D$9:$D$26)>90;ELEGIR(COINCIDIR($D$9:$D$26;{"Á";"É";"Í";"Ó";"Ú";"Ü"});"A";"E";"I";"O";"U";"U");$D$9:$D$26)     [Terminar con Ctrl + Mayús + Intro]

Usamos la función HALLAR para obtener la posición de cada letra en el abecedario.

Seleccionamos F9:F26 y escribimos:
=HALLAR($E$9:$E$26;"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1)     [Terminar con Ctrl + Mayús + Intro]

Sólo falta sumar los números.

En G9:
=SUMA(F9:F26)     [Resultado: #N/A]

Parece que no hemos obtenido el resultado correcto, pero cuando compongamos la fórmula veremos que todo se arregla. La razón es que en la suma hemos incluido las filas 21 a 26 que contienen errores. En la fórmula definitiva, Excel eliminará estas filas, como se comprobará más adelante.

Compondremos la fórmula paso a paso. Para ello, comenzamos poniendo en C3 la fórmula anterior pero sustituyendo F9:F26 por la fórmula de la matriz incluida en ese rango. El resultado será:

En C3:
=SUMA(HALLAR($E$9:$E$26;"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1))     [Terminar con Ctrl + Mayús + Intro]

El error continúa.

En la fórmula que nos ha quedado, sustituimos $E$9:$E$26 por la fórmula de esa columna. Queda otra fórmula más larga:

En C3:
=SUMA(HALLAR(SI(CODIGO($D$9:$D$26)>90;ELEGIR(COINCIDIR($D$9:$D$26;{"Á";"É";"Í";"Ó";"Ú";"Ü"});"A";"E";"I";"O";"U";"U");$D$9:$D$26);"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1))     [Terminar con Ctrl + Mayús + Intro]

Persiste el error. No desesperemos. Tenemos que seguir sustituyendo valores. En este momento, el valor a sustituir, tres veces, es $D$9:$D$26.

En C3:
=SUMA(HALLAR(SI(CODIGO(EXTRAE($C$6;$C$9:$C$26;1))>90;ELEGIR(COINCIDIR(EXTRAE($C$6;$C$9:$C$26;1);{"Á";"É";"Í";"Ó";"Ú";"Ü"});"A";"E";"I";"O";"U";"U");EXTRAE($C$6;$C$9:$C$26;1));"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1))     [Terminar con Ctrl + Mayús + Intro]

Aún no hemos obtenido el valor correcto. $C$9:$C$26 aparece otras tres veces. Repetimos el proceso.

=SUMA(HALLAR(SI(CODIGO(EXTRAE($C$6;FILA(DESREF($A$1;;;$B$9));1))>90;ELEGIR(COINCIDIR(EXTRAE($C$6;FILA(DESREF($A$1;;;$B$9));1);{"Á";"É";"Í";"Ó";"Ú";"Ü"});"A";"E";"I";"O";"U";"U");EXTRAE($C$6;FILA(DESREF($A$1;;;$B$9));1));"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1))     [Terminar con Ctrl + Mayús + Intro]

¡Por fin! Resultado correcto. ¿Por qué ahora Excel nos devuelve un resultado correcto y antes no? La razón es que las fórmulas anteriores incluían las filas 21 a 26, que contienen errores. Sin embargo, ahora, hemos introducido en la fórmula la función DESREF, que devuelve una matriz de únicamente 12 elementos, que no incluyen las filas mencionadas.

Aún no hemos acabado. Debemos quitar $B$9.

En C3:
=SUMA(HALLAR(SI(CODIGO(EXTRAE($C$6;FILA(DESREF($A$1;;;LARGO(C6)));1))>90;ELEGIR(COINCIDIR(EXTRAE($C$6;FILA(DESREF($A$1;;;LARGO(C6)));1);{"Á";"É";"Í";"Ó";"Ú";"Ü"});"A";"E";"I";"O";"U";"U");EXTRAE($C$6;FILA(DESREF($A$1;;;LARGO(C6)));1));"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1))     [Terminar con Ctrl + Mayús + Intro]

Finalmente, quitamos $C$6.

En C3:
=SUMA(HALLAR(SI(CODIGO(EXTRAE(MAYUSC(SUSTITUIR($C$2;" ";));FILA(DESREF($A$1;;;LARGO(MAYUSC(SUSTITUIR($C$2;" ";)))));1))>90;ELEGIR(COINCIDIR(EXTRAE(MAYUSC(SUSTITUIR($C$2;" ";));FILA(DESREF($A$1;;;LARGO(MAYUSC(SUSTITUIR($C$2;" ";)))));1);{"Á";"É";"Í";"Ó";"Ú";"Ü"});"A";"E";"I";"O";"U";"U");EXTRAE(MAYUSC(SUSTITUIR($C$2;" ";));FILA(DESREF($A$1;;;LARGO(MAYUSC(SUSTITUIR($C$2;" ";)))));1));"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";1))     [Terminar con Ctrl + Mayús + Intro]

Podemos borrar las celdas auxiliares; ya no las necesitamos.



viernes, 8 de febrero de 2013

Saltar a una celda con el "Cuadro de nombres"

Normalmente, para seleccionar una celda o un rango nos movemos a la zona deseada por medio de las barras de desplazamiento y hacemos clic con el ratón. Sin embargo, este método puede ser demasiado lento si tenemos que desplazarnos a una celda que esté muy alejada. Por ejemplo, si estamos en A1 y debemos desplazarnos a UEG25000, la cosa es complicada usando el ratón, pero no lo es si usamos el "Cuadro de nombres".

En los ejemplos que se muestran a continuación se utilizan dos libros. El libro "E29-Cuadro de Nombres.xlsx" tiene tres hojas: Ciudad, Rutas y Verduras. El otro libro, "E4-Inspección.xlsx", tiene dos: Precio y Rebaja.

Abrimos el libro E29-Cuadro de Nombres.xlsx y nos ponemos en la celda A1 de la hoja Ciudad. Estando en esa celda (o en otra cualquiera), escribimos B15 en el Cuadro de nombres y terminamos pulsando Intro. Excel salta y selecciona la celda B15.

De nuevo, en el Cuadro de nombres, escribimos UEG25000 y pulsamos Intro. Hemos conseguido ir a esa celda, que, por cierto, está vacía. 

También podemos saltar a una celda de otra hoja; por ejemplo, para ir a la celda B20 de la hoja Rutas, hay que escribir lo siguiente: Rutas!B20

Del mismo modo, estando en cualquier hoja, para seleccionar el rango B6:D8 de la hoja Verduras, tendremos que escribir: Verduras!B6:D8

Otra forma de saltar a cualquier lugar es usando nombres. En el libro se han creado cinco:

Pulsando en cualquiera de ellos se selecciona el rango definido por el nombre elegido.

El uso del Cuadro de nombres aún es más completo: permite saltar de un libro a otro. La única condición es que ambos estén abiertos.

Sin cerrar el libro actual, abrimos E4-Inspección.xlsx. No es necesario abrirlo desde el libro activo; puede abrirse desde otra copia de Excel.

Para seleccionar el rango B4:C8 de la hoja Rebajas del libro E4-Inspección.xlsx, estando en cualquier celda del libro E29-Cuadro de Nombres.xlsx, escribimos en el Cuadro de nombres: '[E4-Inspección.xlsx]Rebaja'!B4:C8





viernes, 18 de enero de 2013

El libro de macros «Personal.xlsb»

Hemos visto en varios artículos cómo se quita la contraseña de las hojas protegidas, pero si trabajamos frecuentemente con hojas protegidas de otros autores y estamos hartos de realizar esta operación, ¿no sería formidable que tuviéramos un "botoncito" que al pulsarlo nos desprotegiera automáticamente la hoja?

Esto nos lleva al libro Personal.xlsb. Si guardamos una macro en el fichero Personal.xlsb, Excel la cargará cada vez que se abra y la dejará disponible para ser utilizada al momento. Si además ponemos un acceso directo en la Barra de herramientas de acceso rápido, podremos ejecutarla con un simple clic de ratón. Bastará que la macro sea la adecuada para nuestros propósitos. Veamos como se hace.

En primer lugar, necesitamos la macro BuscarContraseña.bas, que se puede descargar desde aquí y ha sido utilizada en el artículo Cómo quitar la protección de una hoja sin conocer la contraseña. Una vez que la tengamos, iniciamos Excel con un libro en blanco.

En la ficha Programador, pulsamos Grabar macro.



Aparecerá el cuadro de diálogo correspondiente. Ponemos un nombre, por ejemplo, EliminarContraseñaHoja y, en el apartado Guardar macro en, seleccionamos Libro de macros personal.



















Pulsamos Aceptar e inmediatamente observaremos que el icono Grabar macro se ha transformado en Detener grabación.



Hacemos clic en Detener grabación. La macro se ha creado pero no contiene ninguna línea de código. Lo comprobamos pulsando Alt + F11 para entrar en el editor de VBA. Haciendo doble clic en Módulo1 veremos, en el panel de la derecha, que el código asociado a la macro sólo contiene el encabezado y el fin de procedimiento.



Nos aseguramos de que esté seleccionado Módulo1 y accedemos a Archivo + Importar archivo. Buscamos el fichero BuscarContraseña.bas que hemos descargado desde el enlace anterior y hacemos clic en Abrir. Excel insertará el Módulo11.



Seleccionamos todo el procedimiento excluyendo el encabezado Sub BuscarContraseña() y el fin End Suby pulsamos Ctrl + C para copiarlo en el portapapeles.

Hacemos doble clic en Módulo1 y pegamos el procedimiento dentro con Ctrl + V.

Eliminamos Módulo11 haciendo clic con el botón derecho y eligiendo Quitar Módulo11. Cuando Excel nos pregunte si queremos exportar el módulo, hacemos clic en No.

Salimos del editor de VBA pulsando Alt + Q.

Ahora, tenemos que poner un icono permanente en la Barra de herramientas de acceso rápido para que se ejecute la macro con un solo clic. De este modo, cuando abramos un libro que contenga alguna hoja protegida, el icono de desprotección estará listo para ser usado.

Abrimos el menú Archivo + Opciones + Barra de herramientas de acceso rápido. En el apartado Comandos disponibles en, elegimos Macros. Seleccionamos PERSONAL.XLSB!EliminarContraseñaHoja y pulsamos el botón Agregar para pasarlo al panel de la derecha. Todavía no pulsamos Aceptar.



El siguiente paso consistirá en elegir el icono y el mensaje que queremos que aparezca en la barra de herramientas de acceso rápido.

Seleccionamos PERSONAL.XLSB!EliminarContraseñaHoja en el panel de la derecha y pulsamos el botón Modificar. Se abrirá el cuadro de diálogo Modificar botón.




















Elegimos un icono adecuado (por ejemplo, la llave) y en el apartado Nombre para mostrar, escribimos: Quita la protección de la hoja. Terminamos pulsando dos veces Aceptar. Ahora, la barra de herramientas de acceso rápido tiene un nuevo botón con su correspondiente mensaje.



Para concluir, debemos cerrar Excel pulsando Archivo + Salir. Cuando aparezca el cuadro de diálogo preguntándonos si queremos guardar la macro, pulsamos Guardar.

Sólo falta comprobar que funciona correctamente.

Abrimos un libro que tenga alguna hoja protegida con contraseña (aquí hay uno de tres hojas con contraseñas diferentes). Si intentáramos desproteger la hoja, Excel nos pediría la contraseña, pero no necesitamos conocerla. Pulsamos en la llave de la barra de herramientas de acceso rápido y, al poco rato, Excel nos mostrará un mensaje anunciándonos que la hoja ha quedado desprotegida.


miércoles, 16 de enero de 2013

Hallar el primer y el último día hábil del mes

En un artículo antiguo estudiamos la manera de utilizar las funciones DIA.LAB, DIA.LAB.INTL, DIAS.LABDIAS.LAB.INTL. Hoy vamos a utilizarlas para calcular el primer y el último día hábil de cada mes.

En B3 pondremos el año y en B5:B23 los días festivos de ese año. En las columnas E y F calcularemos el primer día laborable de cada mes y el último.



En el primer ejemplo, consideraremos que son festivos los sábado, los domingos y los días señalados en B5:B23. Posteriormente haremos otro ejemplo en el que serán festivos los lunes, martes, viernes y los días del rango B5:B23.

En E5:
=DIA.LAB(FECHA($B$3;FILA(A1);1)-1;1;$B$6:$B$23)   

Extendemos la fórmula hasta la fila 16.

El truco consiste en situarnos en el último día del mes anterior. Por ejemplo, en enero, la función FECHA($B$3;FILA(A1);1)-1 equivale a FECHA(2013;1;1)-1; o lo que lo mismo: 1/1/2013 menos un día, lo que nos lleva al 31 de diciembre de 2012. Así pues, la fórmula de E5 es equivalente a DIA.LAB(31 de diciembre de 2012;1;$B$6:$B$23). DIA.LAB nos remite al primer día laborable después del 31/12/2012 (es el 1 del segundo argumento). Como el 1/1/2013 es festivo (es el primer día del rango B5:B23) busca el siguiente; es decir, el 2/1/2013, que no es festivo y, por tanto, éste será el primer día laborable de enero de 2013.

El razonamiento para calcular el último día laborable del mes es parecido, aunque, en este caso tendremos que situarnos en el primer día del mes siguiente y restarle uno.

En F5:
=DIA.LAB(FECHA($B$3;FILA(A1)+1;1);-1;$B$6:$B$23)

Extendemos la fórmula hasta la fila 16.

Para calcular el primer y último día laborable del mes, siendo festivos los lunes, martes y viernes, es necesario usar la función DIA.LAB.INTL (no disponible en Excel 2003 y 2007).



En E5:
=DIA.LAB.INTL(FECHA($B$3;FILA(A1);1)-1;1;"1100100";$B$6:$B$23) 

En F5:
=DIA.LAB.INTL(FECHA($B$3;FILA(A1)+1;1);-1;"1100100";$B$6:$B$23)
Extendemos ambas fórmulas hasta la fila 16.

Descargar archivo (SE1-Primer y último habil.xlsx)

Descargar archivo (SE1-Primer y último habil.xls)


sábado, 12 de enero de 2013

Funciones BD

Excel dispone de un conjunto de funciones que comienzan con las iniciales BD y que sirven para trabajar con bases de datos. Se usan de un modo similar a los criterios de selección en las Consultas de Access. A los lectores que conozcan Access les resultará familiar su manejo.

Éstas son las funciones BD:

=BDCONTAR Cuenta las celdas que contienen números en el campo (columna) de registros de la base de datos que cumplen las condiciones especificadas
=BDCONTARA Cuenta el número de celdas que no están en blanco en el campo (columna) de los registros de la base de datos que cumplen las condiciones especificadas
=BDDESVEST Calcula la desviación estándar basándose en una muestra de las entradas seleccionadas de una base de datos
=BDDESVESTP Calcula la desviación estándar basándose en la población total de las entradas seleccionadas de una base de datos
=BDEXTRAER Extrae de una base de datos un único registro que coincide con las condiciones especificadas
=BDMAX Devuelve el número máximo en el campo (columna) de registros de la base de datos que coinciden con las condiciones especificadas
=BDMIN Devuelve el número menor del campo (columna) de registros de la base de datos que coinciden con las condiciones especificadas
=BDPRODUCTO Multiplica los valores del campo (columna) de registros en la base de datos que coinciden con las condiciones especificadas
=BDPROMEDIO Obtiene el promedio de los valores de una columna, lista o base de datos que cumplen las condiciones especificadas
=BDSUMA Suma los números en el campo (columna) de los registros que coinciden con las condiciones especificadas
=BDVAR Calcula la varianza basándose en una muestra de las entradas seleccionadas de una base de datos
=BDVARP Calcula la varianza basándose en la población total de las entradas seleccionadas de una base de datos

Todas tienen la misma sintaxis:

Sintaxis: FUNCIÓN_BD(base_de_datos;nombre_de_campo;criterios)
  • base_de_datos: Es la tabla o base de datos.
  • nombre_de_campo: Es el nombre de la columna de la tabla sobre la que se va a realizar el cálculo.
  • criterios: Es el rango de celdas que contiene las condiciones que se van a utilizar en el cálculo.
El rango de criterios puede colocarse en cualquier lugar pero, para permitir la adición de nuevos datos, se desaconseja situarlo debajo de la tabla.

Vamos a emplear la función BDCONTAR para ilustrar cómo se usan las funciones BD. Utilizaremos una base de datos ficticia que colocaremos en el rango B9:F41, dejando las filas 1 a 7 para situar los criterios. La fórmula la pondremos en H10.



Primer ejemplo

Contar las veces que la Empresa Ascensores J & C ha hecho Aportaciones comprendidas entre 150 y 300, teniendo, al mismo tiempo, algún valor en la columna Devolución.

Copiamos los encabezamientos de la base de datos en B2:F2. Como el criterio que vamos a emplear requiere hacer dos comprobaciones en el campo Aportación, necesitamos dos celdas con este título. Por tanto, escribimos Aportación en G2.

En la celda B3, escribimos:
="=Ascensores J & C"     [Excel mostrará: =Ascensores J & C]

En C3:
>150

En G3:
<300

Los tres criterios están en la misma fila. Esto significa que están vinculados mediante el operador Y. Dicho de otra forma: (El campo Empresa contiene Ascensores J & C) Y (Aportación es mayor que 150) Y (Aportación es menor que 300).

Como queremos contar el número de celdas no vacías de la columna Devolución que cumplen los tres criterios, la fórmula que pondremos en H10 será:

En H10:
=BDCONTAR(B9:F41;D9;B2:G3)    [Resultado: 2]



El primer argumento es el rango que ocupa la base de datos; el segundo, es el campo sobre el que vamos a aplicar la función (contar registros); el tercero, el el rango que ocupa los criterios. El segundo argumento, D9, podemos sustituirlo por el nombre del campo. Si lo hacemos así, la fórmula sería: =BDCONTAR(B9:F41;"Devolución";B2:G3)

Segundo ejemplo

Contar las veces que Ascensores J & C ha hecho Aportaciones mayores que 300 o menores que 200 y haya algún dato en la columna Devolución.

Los criterios deberán ser:



Cuando se usa el operador O los criterios van en filas distintas.

En este caso, la fórmula será:

En H10:
=BDCONTAR(B9:F41;D9;B2:C4)    [Resultado: 2]

Tercer ejemplo

Contar las veces que cualquier empresa distinta de Ascensores J & C haya hecho Aportaciones mayores que 200 y haya algún dato en la columna Devolución.



En H10:
=BDCONTAR(B9:F41;D9;B2:C3)     [Resultado: 8]

Cuarto ejemplo

Contar las veces que cualquier empresa, excluidas Ascensores J & C y Decoraciones Eder, haya hecho Aportaciones mayores que 200 y haya algún dato en la columna Devolución.



En H10:
=BDCONTAR(B9:F41;D9;B2:H3)     [Resultado: 8]

Quinto ejemplo

Contar celdas no vacías de Devolución que cumplan:
  • Ascensores J & C tenga Aportación entre 150 y 300, O
  • Decoraciones Eder tenga Rendimiento=6, O
  • Decoraciones Eder tenga Beneficios >3500, O
  • Pascual Reina tenga Aportaciones >84


En H10:
=BDCONTAR(B9:F41;"Devolución";B2:G6)     [Resultado: 6]

Sexto ejemplo

Contar celdas no vacías de Devolución que cumplan:
  • La Empresa no debe ser Ascensores J & C
  • La Empresa no debe ser Metalkarma, S.L.
  • Beneficio menor que la media de beneficios de todas las empresas
Estamos ante un caso complejo ya que no conocemos el promedio de la columna Beneficio para poner el criterio. Podemos calcularlo en una celda vacía o poner la fórmula correspondiente en la zona de criterios. El primer método es poco recomendable ya que requiere cambiar la fórmula si se modifica algún valor de la columna Beneficio. Veamos cómo se haría.

En H14 (o cualquier otra celda vacía):
=PROMEDIO(F10:F41)     [Resultado: 2.565,67]

Conocido el promedio, ponemos los criterios:



La fórmula en H10 sería:
=BDCONTAR(B9:F41;"Devolución";B2:G3)     [Resultado: 14]

Es mejor utilizar el segundo método: poner una fórmula en la zona de criterios. Sin embargo, antes hay que conocer una serie de condiciones de obligado cumplimiento (extraídas de la ayuda de Excel):
  • La fórmula se debe evaluar como VERDADERO o FALSO.
  • Puesto que está utilizando una fórmula, escriba la fórmula como lo haría normalmente, pero no la escriba de la forma siguiente: =''=entrada''
  • No utilice rótulos de columnas para los rótulos de los criterios; deje los rótulos de criterios en blanco o utilice uno que no sea un rótulo de columna incluido en el rango.
  • Si en la fórmula utiliza un rótulo de columna en lugar de una referencia relativa a celda o un nombre de rango, Excel presenta un valor de error, como por ejemplo #¿NOMBRE? o #¡VALOR!, en la celda que contiene el criterio. Puede pasar por alto este error, ya que no afecta a la manera en que se filtra el rango.
  • La fórmula que utilice con el fin de generar los criterios debe utilizar una referencia relativa para hacer referencia a la celda correspondiente de la primera fila.
  • Todas las demás referencias usadas en la fórmula deben ser referencias absolutas.
 A la nueva columna de la zona de criterios le llamaremos Auxiliar y la fórmula será:

En H3:
=F10<PROMEDIO($F$10:$F$41)     [Resultado: FALSO]



F10 es la primera celda de la columna con la que vamos a hacer el cálculo (en nuestro caso la media aritmética). Debe ser una referencia relativa (no lleva signo $). Todas las demás referencias deben ser absolutas (llevan signo $).

En H10:
=BDCONTAR(B9:F41;"Devolución";B2:H3)     [Resultado: 14]

Séptimo ejemplo

Contar celdas no vacías de la columna Devolución de las empresas que sean sociedades anónimas (S.A.) o sociedades limitadas (S.L.)

En este caso tendremos que usar caracteres comodín: asterisco (*) e interrogación (?). El asterisco sustituye a un número indeterminado de caracteres; la interrogación, solamente a uno.











Si entre los elementos buscados hay una interrogación o un asterisco, para incluirlo en la búsqueda debe ir precedido de la tilde (~).

En H10:
=BDCONTAR(B9:F41;"Devolución";B2:B3)     [Resultado: 6]

Descargar archivo (SE10-EmpresasBD.xlsx)

Descargar archivo (SE10-EmpresasBD.xls)