2013-09-22

Incompatibilidad de Excel con consulta de Access usando NZ

En la entrada anterior tratamos el cálculo de expresiones con valores nulos en Access. Una consecuencia imprevista al usar la función NZ() en una consulta de Access es que Excel no permite usar como origen de datos consultas que incluyan dicha fórmula. Si tratamos de importarla, y vamos a la ficha Datos, grupo Obtener datos externos y clic en Desde Access, la consulta no aparecerá listada en el cuadro de diálogo Seleccionar tabla.


Si tratamos de importarla De otras fuentes, Desde Microsoft Query listará la consulta pero al tratar de incorporar sus campos no dará un error.


Se me ocurren varias soluciones al problema:

1.Transformar la consulta de selección y crear una tabla con los resultados. El inconveniente es que crea una tabla innecesaria que duplica la información contenida en la tabla original.

2. Utilizar otra fórmula alternativa a NZ. Usamos la fórmula SiInm y EsNulo para comprobar si el campo es nulo. Si es verdad que devuelva un cero y, si es falso, el campo.
CVble: nz([Coste_variable])  'Expresión con NZ
CVble: SiInm(EsNulo([Coste_variable]);0;[Coste_variable]) 'Sin función NZ
SQL:
IIf(IsNull([Coste_variable]),0,[Coste_variable]) AS CVble
3. Diseñar una tabla donde sea obligatoria la entrada de datos en el campo. Evitaremos nulos pues nos forzará a introducir un valor, p. ej., ceros en lugar de nulos. Podemos modificar una tabla existente haciendo clic con el botón derecho sobre la tabla y clic sobre Vista Diseño. Elegimos el campo deseado y en la propiedad Requerido seleccionamos :


4. Crear una consulta de actualización para sustituir los valores nulos por ceros, y a continuación cambiar el diseño de la tabla para que ese campo sea requerido (ver solución anterior).


En SQL:
UPDATE Costes SET Costes.Coste_variable = 0
WHERE (((Costes.Coste_variable) Is Null));
Dejando de lado la primera opción por ineficiente, la número dos es la más rápida y recomendable si disponemos de poco tiempo. Las soluciones tres y cuatro son complementarias, nos permiten solucionar definitivamente el problema en la base de datos con nulos.

En general, y salvo que sea absolutamente necesario, en el diseño de la tabla debemos prevenir la existencia de valores nulos siguiendo los pasos de la solución tres. De esta manera, con un buen diseño inicial de nuestra base de dato, podemos evitar futuros comportamientos indeseados y ahorrarnos mucho tiempo.

Entradas relacionadas:

Cálculo de expresiones con valores nulos en Ms Access

2013-09-19

Cálculo de expresiones con valores nulos en Ms Access

Un error frecuente entre usuarios principiantes es incluir en expresiones o fórmulas campos que incluyen algún valor nulo. Y en Access cuando los cálculos incluyen un valor nulo, el resultado es nulo:

En la columna CTotal vemos el cálculo del coste total para los tres primeros conceptos es correcto, pero no para el último, devolviendo un nulo en lugar de 500. Para evitar este comportamiento causado por los nulos usamos la función NZ(). Tenemos dos opciones, o bien en cada campo que pudiera contener nulos introducimos la función NZ, o bien en el total alrededor de cada campo sumado:

Si queremos que CVble muestre ceros en lugar de nulos: CVble: nz([Coste_variable];0):

Entradas relacionadas:

Incompatibilidad de Excel con consulta de Access usando NZ

2013-09-15

Seleccionar objetos y panel de selección en Excel

En Excel cuando seleccionamos una forma o un objeto tenemos dos opciones:

1. Mantener presionada la tecla MAYÚS o CTRL mientras hacemos clic en los objetos.
2. En la ficha Inicio, en el grupo Edición, y clic en Seleccionar objetos.


A continuación puedes ver los dos métodos:

El primer método no es práctico cuando tenemos multitud de objetos. Además corremos el riesgo de no seleccionar algún objeto del área deseada.

Estos dos métodos sólo permiten seleccionar las formas u objetos visibles en una hoja. En cualquier caso es recomendable activar el panel de selección para ver la lista de los objetos de la hoja y su visibilidad.


Desde el panel de selección podemos cambiar el nombre, ordenar, mostrar, ocultar y seleccionar varios objetos (CTRL presionado mientras hacemos clic en los objetos). El panel se puede desanclar y adaptar su tamaño:
Como extra para finalizar, un atajo para seleccionar todos las formas u objetos de una hoja: seleccionamos cualquier objeto y presionamos CTRL+MAYÚS+Barra espaciadora

2013-09-10

Insertar una imagen GIF en Ms Excel

Para insertar una imagen GIF en Excel, vamos a la ficha Programador y hacemos clic sobre Insertar y luego sobre el icono Más controles:

En el desplegable seleccionamos Microsoft Web Browser y presionamos Aceptar:


A continuación con el cursor crea un marco para tu imagen. Luego podrás ajustar su tamaño al de la imagen. Sobre el objeto creado, haz clic con el botón derecho y luego sobre Ver código.

Inserta el siguiente código, con la ruta completa de la imagen.
Private Sub Worksheet_Activate()
WebBrowser1.Navigate "C:\Users\nubededatos\Desktop\insertarimagen.gif"  
End Sub 
También puedes indicar URL de la imagen:
Private Sub Worksheet_Activate()
WebBrowser1.Navigate "http://kevinburg.com/tumblr/fm2ugifs/train-repeat-615.gif"
End Sub
Finalmente en la ficha Programador desactiva el Modo diseño, haciendo clic sobre el mismo.


Para ajustar el tamaño del marco de la imagen activa de nuevo el modo diseño y arrastra los controladores de tamaño redondos sin colorear que aparecen alrededor del objeto.

Un ejemplo del resultado final. Una imagen gif con la evolución del ratio de fertilidad y la esperanza de vida:

Google's Public Data Explorer - World Bank
Entradas relacionadas:
Insertar una imagen GIF en Ms Excel

2013-09-05

Generar campo autonumérico aleatoriamente en Ms Access

Title En Ms Access los nuevos valores de un campo autonumérico pueden ser generados incrementalmente (por defecto) o aleatoriamente. Para cambiar el modo de generar los nuevos valores, en la vista diseño de la tabla, seleccionar en el desplegable Nuevos valores la opción Aleatoriamente.


Access nos avisa de la irreversibilidad del cambio:


En la tabla, cada vez que comencemos a escribir un nuevo registro se generará un número aleatorio entre -2.147.483.648 y 2.147.483.647.

Como es natural, los números aleatorios asignados a los registros son fijos y no se recalculan (p. ej.: como al usar la función ALEATORIO en Excel). Como mencionamos antes, no es posible revertir la manera de generar nuevos valores de un campo autonumérico de aleatorio a incremental.


En tal caso, deberíamos eliminar dicho campo autonumérico y crear uno nuevo. Si es posible cambiar de incremental a aleatorio.

Entradas relacionadas

2013-08-26

Consulta para generar una muestra aleatoria en Ms Access

Title En la entrada anterior vimos como generar números aleatorios con la función NúmAleat. Con esa función podemos generar una muestra aleatoria de nuestros datos.

Creamos una consulta, agregamos los campos deseados, en el ejemplo todos los campos de TuTabla.* Añadimos un campo con la función NúmAleat basado en un campo numérico de la tabla, ordenamos por este campo, seleccionamos en Devuelve: el número de registros de la muestra o porcentaje del total y ejecutamos la consulta.

En SQL, la sintaxis sería:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd([campo numérico]);
Si solamente tuviéramos campos de texto, usamos la función Longitud (Len en inglés) para que nos devuelva como valor el número de caracteres de la cadena de texto. La consulta sería:
En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Len([campo de texto]));

Es importante señalar que la función NúmAleat con un argumento igual a cero devuelve el último número generado. Y si es negativo, repite cada vez el mismo número aleatorio para ese valor.

La solución sería usar la función Abs, que devuelve el valor absoluto de un número:
NúmAleat(Abs([campo numérico]))

En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Abs([campo numérico]));

Otra alternativa sería usar de nuevo la función Longitud como vimos más arriba, en este caso con un campo numérico. Así forzamos a que nos devuelva un número mayor que cero,  aunque tenga un cero o un número negativo.

En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Len([campo numérico]));

Entradas relacionadas

2013-08-20

Generar números aleatorios entre dos valores en Ms Access

Title En Access se pueden generar números aleatorios con la función NúmAleat(). Para generar números enteros entre un intervalo, usamos la fórmula:

Int(Límite superior- Límite inferior + 1)*NúmAleat+Límite inferior)
Hacemos clic en la celda Campo de la columna donde deseemos crear el campo calculado y escribimos la expresión necesaria:

Ejemplo, número aleatorio entre 1 y 10:

Número_Aleatorio: Int((10-1+1)*NúmAleat+1) 'En la celda,o bien 
SELECT Int((10-1+1)*Rnd()+1) AS Número_Aletorio; 'en SQL
Si no necesitamos número enteros, borramos la función Int

(Límite superior- Límite inferior + 1)*NúmAleat+Límite inferior

Entradas relacionadas

2013-08-17

Lógica de Boole en lugar de la función SI- Parte 2

En la entrada anterior vimos una alternativa a los SI anidados. En aquel ejemplo evaluábamos una serie de condiciones y devolvíamos un valor. ¿Qué sucedería si quisiéramos que en lugar de un valor devuelva un texto? Por ejemplo, en una celda podemos tener: a, b, c, o d. Y en función de la letra queremos que devuelva respectivamente: primero, segundo, tercero o cuarto.

Opción 1 - SI anidados
=SI(A1="a";"primero";SI(A1="b";"segundo";SI(A1="c";"tercero";SI(A1="d";"cuarto"))))
Seguiríamos la sintaxis habitual de los SI anidados sin problema.

Opción 2 -Boole
=REPETIR("primero";A1="a")&REPETIR("segundo";A1="b")&REPETIR("tercero";A1="c")&REPETIR("cuarto";A1="d"))

En este caso no podríamos usar la estructura de la entrada anterior pues =(A1="a")*"primero" daría un error. Empleamos la función REPETIR(texto;núm_de_veces), que repite el texto indicado un determinado número de veces, 1 si la condición es verdadera o 0 si es falsa. Al encadenar las diferentes condiciones, solamente mostrará la verdadera o nulo (celda en blanco)si no se cumple ninguna. Si en lugar de nulo queremos que nos muestre un valor, habría que añadir el siguiente trozo al final.
&REPETIR("Otro";(A1<>"a")*(A1<>"b")*(A1<>"c")*(A1<>"d")
                                       'o bien
&REPETIR("Otro";NO(O(A1={"a";"b";"c";"d"})))

Entradas relacionadas:
Lógica de Boole en lugar de la función SI -Parte 1

2013-08-11

Lógica de Boole en lugar de la función SI -Parte 1

SI() es una de las funciones más útiles y utilizadas en Excel. Básicamente, comprueba si se cumple una condición y devuelve un valor si se evalúa como VERDADERO y otro valor si se evalúa como FALSO. Sin embargo, en muchas ocasiones podemos obtener los mismos resultados de una manera más sencilla: usando la lógica de Boole.

Comparamos si A3 es mayor que B1.
=SI(A3>$B$1;VERDADERO;FALSO) 'Usando la función SI
=A3>$B$1                     'Usando lógica de Boole
Ambas fórmulas nos devolverán VERDADERO o FALSO. Pero la segunda fórmula, es más corta y clara, y Excel la calcula más rápidamente.


Puede ser útil tener esas expresiones lógicas evaluadas como 1 (VERDADERO) o 0 (FALSO). Excel trata los valores de Boole como 1 o 0 cuando los combinamos con operaciones matemáticas.
=(A3>$B$1)*1   'Multiplicando por 1       
=--(A3>$B$1)   'Usando dos signos negativos (operador unario)


También podemos asignar usar la misma lógica en lugar de SI anidados. Por ejemplo, asignar una ganancia cuando las cifras anteriores alcanzan unos objetivos:


Opción 1 - SI anidados
=SI(A3>50000;1000;SI(A3>45000;750;SI(A3>35000;750;SI(A3>25000;250;0))))) 'SI
Evalua cada condición secuencialmente de izquierda a derecha, y si se cumple alguna condición se detiene.

Opción 2 -Boole
=(A3>25000)*250+(A3>35000)*250+(A3>45000)*250+(A3>55000)*250        'Boole
Evalua toda la expresión a la vez sin detenerse. Por ejemplo si A3>35000, cumple las dos primeras condiciones.
=(VERDADERO)*250 + (VERDADERO)*250 + (FALSO)*250+ (FALSO)*250




=(1)*250 + (1)*250 + (0)*250+ (0)*250 




=500
Por esa razón, porque se acumulan las condiciones cumplidas, indicamos los incrementos de la ganancia entre cada intervalo en lugar del total de la ganancia.

Esta segunda opción es más breve, más rápida de calcular por Excel, y más fácil de escribir y de leer que la función SI anidada.

Entradas relacionadas:

Lógica de Boole en lugar de la función SI -Parte 2

2013-08-05

Importar un fichero de texto en Access conservando los decimales

Es posible que al importar un fichero de texto, en alguno de los campos numéricos se trunquen los decimales. Una posible causa es que ninguno de los 25 primeros registros de ese campo incluya decimales. Access evalua las 25 primeras filas y determina el tipo de dato para los campos de la tabla. Si no encuentra ningún decimal en los 25 primeros registros de un campo sugiere como tipo de dato el entero largo, en lugar del doble.

Para corregir este comportamiento y conservar los decimales de un campo numérico al que Access asigna el tipo entero largo, tenemos dos opciones dentro del Asistente para importación de texto:

Opción1- 

Seleccionamos el campo (clic sobre la columna correspondiente) y en el desplegable Tipo de dato, escogemos Doble y presionamos Siguiente.


Opción2- 

Hacemos clic sobre Avanzado... y en el desplegable Tipo de dato, escogemos Doble, y clic sobre Aceptar.


Otra manera menos eficiente sería importar el campo como texto y luego transformarlo en numérico con una consulta.
Nube de datos