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)