Mostrando entradas con la etiqueta INDIRECTO. Mostrar todas las entradas
Mostrando entradas con la etiqueta INDIRECTO. Mostrar todas las entradas

domingo, 29 de noviembre de 2020

Sumar las celdas de la diagonal de una tabla

Puede descargar el archivo suma_diagonal.xlsm

Deseamos sumar los valores de las celdas de la diagonal de una tabla. La tabla que usamos de ejemplo está formada por números aleatorios que varían si pulsamos la tecla F9 de recálculo manual.

Con la función INDIRECTO

Vamos a resolverlo utilizando la función INDIRECTO.






En este ejemplo la celda de la primera esquina (celda D6) se encuentra en la fila 6, columna 4, por lo que en la función INDIRECTO  de la celda O2 hemos tenido que restar -2.

=INDIRECTO("F"&FILA()&"C"&FILA()-2;0)

Si la tabla estuviera en otro sitio y la primera esquina estuviera en la columna 10 tendríamos que sumar 4.  Veamos el motivo:

Si la celda de la primera esquina es la celda J6 los valores serían
  • Fila 6
  • Columna 10
  • Tendremos que sumar: 10 - 6 = 4

Con Macro

Podemos crear una macro utilizando código VBA para Excel que nos pregunte por los dos extremos de la diagonal. Primero nos preguntará por la esquina superior izquierda de la tabla.


Luego nos preguntará por la esquina inferior derecha de la tabla.


La tabla ha de ser cuadrada, en nuestro ejemplo estamos trabajando con una tabla 10x10. Se trata de una tabla de 10 filas y 10 columnas, que tendrá necesariamente 10 celdas en la diagonal.




Veamos el código del procedimiento que permite realizar la suma de la diagonal proporcionando las dos esquinas.

 Sub Informa_suma_diagonal()  
 Dim total, E1 As Range, E2 As Range  
 Dim i As Long, fila As Long, columna As Long  
 Set E1 = Application.InputBox(prompt:="Seleccione la celda superior izquierda de la tabla." & _  
  vbLf & "La tabla debe ser cuadrada.", Title:="Suma de la diagonal de una tabla", Type:=8)  
 'el 8 se usa cuando se toma una referencia a una celda como un objeto Range  
 Set E2 = Application.InputBox("Seleccione la celda inferiror derecha de la tabla." & _  
  vbLf & "Las dos esquinas de la tabla deben estar en la misma diagonal.", "Suma de la diagonal de una tabla", , , , , , 8)  
 If E2.Row - E1.Row <> E2.Column - E1.Column Then 'si la tabla no es cuadrada finaliza el programa  
   MsgBox "ERROR: estas dos esquinas no pertenecen a la misma diagonal." & _  
    vbLf & "El programa finalizará.", , "Suma de la diagonal de una tabla"  
   End 'finaliza la ejecución del programa ya que se ha detectado un error  
 End If  
 total = 0  
 For i = 1 To E2.Row - E1.Row + 1 'hasta el número de elementos de la diagonal  
   fila = E1.Row + i - 1 'contador de fila que comienza en la fila de la esquina superior izquierda  
   columna = E1.Column + i - 1 'contador de columna que comienza en la columna de la esquina superior izquierda  
   total = total + Cells(fila, columna).Value  
 Next i  
 MsgBox "La suma de la diagonal es " & total, , "Suma de la diagonal de una tabla"  
 End Sub  



Con función programada

Posiblemente es más útil trabajar con una función creada por el usuario. La función tiene dos parámetros que son las dos esquinas de la diagonal.
  • Esquina_1 es la esquina superior izquierda de la diagonal
  • Esquina_2 es la esquina inferior derecha de la diagonal
Si las dos celdas que se proporcionan no están en la misma diagonal se mostrará un aviso de error diciendo:

ERROR: no diagonal

 Function SumaDiagonal(Esquina_1 As Range, Esquina_2 As Range) As Variant  
 Dim total As Double  
 Dim i As Long, fila As Long, columna As Long  
 total = 0  
 For i = 1 To Esquina_2.Row - Esquina_1.Row + 1  
   fila = Esquina_1.Row + i - 1  
   columna = Esquina_1.Column + i - 1  
   If Application.WorksheetFunction.IsNumber(Cells(fila, columna).Value) Then  
     total = total + Cells(fila, columna).Value  
   End If  
 Next i  
 If Esquina_2.Row - Esquina_1.Row <> Esquina_2.Column - Esquina_1.Column Then  
   SumaDiagonal = "ERROR: no diagonal"  
 Else  
   SumaDiagonal = total  
 End If  
 End Function  

Alternativa propuesta

Le propongo que intente crear una macro que ponga de color amarillo, o el que usted prefiera, las celdas de la diagonal de una tabla. A la macro la tendríamos que proporcionar las dos esquinas de la diagonal, o bien, seleccionar una única celda de la tabla y luego que se señalara toda la tabla, tal como hace el atajo de teclado CONTRO+SHIFT+* de esta forma podríamos ahorrar que la macro nos pida parámetros.

Luego tendríamos que usar las ideas que se proporcionan en el siguiente post del blog:

viernes, 11 de mayo de 2018

Máquina de Galton en Excel

Puede descargar el archivo maquinaGalton.xlsm

La máquina de Galton nos permite ver cómo una distribución binomial tiende a una distribución normal cuando el número de tiradas va creciendo.


La máquina se puede ver en algunos museos de ciencias. También podríamos construirla nosotros con un tablero inclinado con una ranura superior por la que van cayendo bolitas que rebotan en una serie de clavos o pivotes. En cada rebote la bola tiene probabilidad 1/2 de ir hacia la izquierda o hacia la derecha. Esto se repite una y otra vez hasta que al final la bola termina en una cierta posición y cae por un carril que hemos construido con unas tablas verticales para separar unos de otros. Lo que vemos, si lanzamos un gran número de bolitas, es que los carriles de abajo forman una campana de Gauss. La distribución normal se forma como si de un histograma de frecuencias se tratara.

Vamos a construir una máquina de Galton virtual utilizando Excel y una macro que nos permite hacer el trabajo de la iteraciones de una forma rápida.

Hoja1

Primero creamos la macro que hace la que bolita baje rebotando entre los pivotes. En cada movimiento hacia abajo la bola tiene una probabilidad del 50% de ir hacia la izquierda y otro 50% de ir hacia la derecha. Es similar a un árbol binomial.



La macro que hace que la bola baje es la siguiente.

 Sub baja()  
 'árbol binomial de 32 etapas  
 Dim col As Byte  
 Worksheets("Hoja1").Activate  
 Randomize  
 Range("B2:BN68").Font.Bold = False  
 col = 34  
 Cells(2, 34) = "O"  
 Cells(4, 34) = "O"  
 Cells(4, 34).Font.Bold = True  
 For i = 1 To 32  
  If Rnd < 0.5 Then  
   col = col - 1  
  Else  
   col = col + 1  
  End If  
  Cells(i * 2 + 4, col) = "O"  
  Cells(i * 2 + 4, col).Font.Bold = True  
 Next i  
 End Sub  

Hoja2

Creamos un bucle FOR...NEXT que lanza un gran número de bolas, por ejemplo, 1000. De esta forma podemos ver en que columna ha quedado cada una de ellas al realizar el recorrido hacia abajo.

Veamos el código, similar al anterior pero incluyendo el bucle.

 Sub baja2()  
 Call BorraO  
 'árbol binomial de 32 etapas  
 Dim n As Long 'nº de tiradas  
 Dim col As Byte  
 Worksheets("Hoja2").Activate  
 Randomize  
 n = 1000  
 Application.ScreenUpdating = False  
 For j = 1 To n  
  col = 34  
  Cells(2, 34) = "O"  
  Cells(4, 34) = "O"  
  For i = 1 To 32  
   'una forma alternativa de sumar o restar 1 de forma aleatoria  
   col = col + WorksheetFunction.RandBetween(0, 1) * 2 - 1  
   Cells(i * 2 + 4, col) = "O"  
  Next i  
  'anotamos en la fila 99 los resultados  
  Cells(99, col) = Cells(99, col) + 1  
 Next j  
 Application.ScreenUpdating = True  
 End Sub  

Este es un proceso que puede tardar bastante tiempo en función del valor que demos a n. Para intentar reducir el tiempo de proceso podemos incluir al inicio la siguiente línea.

Application.ScreenUpdating = False


Con ella lo que hacemos el anular el envío de refresco a la pantalla de nuestro ordenador. Al final de la macro, dejamos el refresco activado para poder ver el resultado.

Application.ScreenUpdating = True

Veamos el resultado tras lanzar 10.000 veces la bola.



Hoja3

Nos gustaría poder ver la campana de Gauss que se forma con las tiradas. En la Hoja3 hemos creado unas columnas que se van rellenando con las bolas en vertical hasta que la columna más alta llegue a una altura de 30 bolas.


Con algo de imaginación podemos ver el bosquejo de una campana de Gauss. Para que veamos algo que nos recuerde más a la curva de una distribución normal tendríamos que usar muchas más tiradas.

Veamos el código.

 Sub baja3()  
 'árbol binomial de 32 etapas  
 Dim col As Byte  
 Call BorraO  
 Worksheets("Hoja3").Activate  
 Randomize  
 Do  
  col = 34  
  Cells(2, 34) = "O"  
  Cells(4, 34) = "O"  
  For i = 1 To 32  
   If Rnd < 0.5 Then  
    col = col - 1  
   Else  
    col = col + 1  
   End If  
   Cells(i * 2 + 4, col) = "O"  
  Next i  
  Cells(99, col) = Cells(99, col) + 1  
  miMax = Application.WorksheetFunction.Max(Range("Z99:AP99"))  
  Call BorraTri  
  Cells(98 - Cells(99, col), col) = "O"  
 Loop While miMax < 30  
 End Sub  


Hoja4 y Gráfico

En la Hoja4 lo que hacemos es traernos los valores obtenidos en la Hoja2, y presentarlos en forma de columna. Para ello usamos la siguiente expresión en la celda C4.

=INDIRECTO("Hoja2!"&"F99C"&B4*2;0)

Podemos ver aquí un potente uso de la función indirecto que toma valores de otra hoja para trasponerlos.

Con los valores obtenidos hacemos un histograma de frecuencias que se asemeja a una campana de Gauss. La apariencia será tanto mejor cuanto mayor sea el valor de tiradas (n).



sábado, 6 de febrero de 2016

BUSCARV acumulado

Puede descargar el archivo de Excel: TotalBuscarV.xlsm

La función BUSCARV realiza una búsqueda vertical en una tabla. Puede ver una entrada donde se habla de este tema clásico en Excel.

Ahora lo que deseamos es buscar varios valores y crear una función que nos de la suma de esas celdas buscadas.

Disponemos de una tabla con productos, e importes por meses. Queremos diseñar una función similar a BuscarV (Vlookup) que proporcione el acumulado. Deseamos que nos de el importe acumulado de los meses, hasta el mes indicado inclusive. La función así creada se llama BuscarVV. Si deseamos acumular entre dos meses, el de inicio y el de final, incluidos ambos, lo que haremos es restar una BuscarVV de otra. Ver ejemplo.


Los valores de la tabla se generan con números aleatorios, al igual que las celdas de color naranja donde se elijen los siguientes valores:

  • Celda Q9. Se establece el producto entre 1 y 20
  • Celda Q11: Mes de inicio
  • Celda Q12: Mes de final
Deseamos acumular los valores correspondientes al Producto seleccionados entre los meses de inicio y final ambos inclusive. Puesto que estos valores se eligen de forma aleatoria, al pulsar la tecla de función F9 se produce un recálculo manual que hace que los valores cambien.

Mediante formato condicional seleccionamos con fondo verde las celdas de la tabla que deseamos acumular. La fórmula que podemos ver en el formato condicional sobre la celda C10 es el siguiente.

=Y(VALOR(+DERECHA(C$9;2))<=$Q$12;VALOR(+DERECHA(C$9;2))>=$Q$11;$B10=$Q$10)

Disponemos de tres métodos para obtener el acumulado.

Método 1

El la celda Q13 figura la siguiente expresión.

=buscarvv(Q10;tabla;Q12+1)-buscarvv(Q10;tabla;Q11)

La función BuscarVV es una función que hemos programado usando Macros de Excel. Se trata de una función (function) que es la siguiente.



Function BuscarVV(Valor, Tabla, Hasta_Columna, Optional exacto)
    Dim i As Byte
    Dim Total
    For i = 2 To Hasta_Columna
        Total = Total + WorksheetFunction.VLookup(Valor, Tabla, i, exacto)
    Next i
    BuscarVV = Total
End Function

La función lo que hace es llamar a la función BUSCARV que en inglés es VLOOKUP. La llamada se efectúa usando la expresión:

WorksheetFunction.Función en ingles(parámetro1,parámentro2,...)

La función BuscarVV lo que hace es sumar los valores del Producto indicado, del rango Tabla, hasta la columna indicada).

El nombre de rango Tabla se corresponde con el rango B10:N29.

Método 2

El la celda Q14 figura la siguiente expresión.

=SUMA(INDIRECTO("F"&COINCIDIR(Q10;B10:B29;0)+9&"C"&Q11+2&":F"&COINCIDIR(Q10;B10:B29;0)+9&"C"&Q12+2;0);0)

Esta fórmula no utiliza macros y se basa en las funciones INDIRECTO y COINCIDIR.

Método 3

El la celda Q15 figura la siguiente expresión.

=SUMA(DESREF(B9;COINCIDIR(Q10;B10:B29;0);Q11;1;Q12-Q11+1))

Esta fórmula no utiliza macros y se basa en las funciones DESREF y COINCIDIR.




viernes, 2 de mayo de 2014

Media Móvil a intervalos fijos

Descargar el archivo: MM10.xlsm

Si disponemos de una serie de datos, por ejemplo, 200 y deseamos hacer una media móvil de 10 (MM10) lo que haremos es tomar el promedio de los 10 primeros y luego para obtener el siguiente valor de la media móvil lo que hacemos es eliminar de nuestros cálculos el primero y tomar uno nuevo, y así sucesivamente. Esto en Excel se resuelve de una forma muy sencilla con la función PROMEDIO. Véase el ejemplo siguiente.

Primero generamos aleatorios en la columna B con la expresión:
=ELEGIR(ALEATORIO.ENTRE(1;4);ALEATORIO.ENTRE(1;9);ALEATORIO.ENTRE(10;99);ALEATORIO.ENTRE(100;999);ALEATORIO.ENTRE(1000;1999))

y luego los convertimos en valores con copiar y pegar con pegado especial valores.


En la celda C11 calculamos la primera media móvil de 10 valores (MM10) con la expresión:

=PROMEDIO(B2:B11)

Observe que el rango B2:B11 abarca los 10 primeros valores de la columna B y que no se ponen con dólares, por lo que al ser libres y copiar hacia abajo la fórmula el siguiente valor de la media móvil, situado en la celda C12, hace el promedio del rango B3:B12. Esto supone haber movido hacia abajo el rango una posición, pero siguen siendo 10 valores ya que estamos haciendo una media móvil de 10.

Realizar una media móvil es así de sencillo en Excel, pero ahora nos proponemos otro reto que consiste en tomar la media de los 10 primeros valores de la columna B, y anotarlos por ejemplo en la columna F, y luego tomar los siguientes 10 valores pero sin incluir a los anteriores, simplemente los que van de la posición 11 a la 20, y lo volvemos a anotar en la columna F, y así sucesivamente. Como tenemos 200 datos en la columna B y deseamos tomarlos de 10 en 10 al final tendremos 200/10 = 20 valores anotados en la columna F.

Esto se puede conseguir de tres formas:
  • Método 1: de forma manual.
  • Método 2: con fórmula
  • Método 3: con macro

Método 2

En la colman F se obtiene la media de cada 10 valores de la columna B. Observe que se corresponden los valores obtenidos en la columna F con los marcados en azul.


La fórmula de la celda F2 se copia hacia abajo y es la siguiente.

=PROMEDIO(INDIRECTO("F"&E2*10-8&"C2";0):INDIRECTO("F"&E2*10+1&"C2";0))

Para marcar el color azul hemos utilizado Formato Condicional. La condición se ha aplicado a la celda C11 y luego se ha extendido hacia abajo. La fórmula de la condición es la que nos detecta los múltiplos de 10.

=RESIDUO(A11;10)=0



domingo, 30 de octubre de 2011

Rangos variables en fórmulas

Descargar el fichero: FormulasVariables.xlsx

Algo con lo que siempre hemos soñado los usuarios avanzados de Excel es con la posibilidad de poder modificar la sintaxis de una fórmula para que se adapte de forma automática a nuestras necesidades.

Hoja1

En este caso, no es que se logre completamente este sueño, pero si seremos capaces de modificar la función SUMA para que el rango que sume sea el que nosotros elijamos sin tener que editar la fórmula, y sin tener que cambiar el rango, de forma manual.



En la columna B disponemos de 100 números aleatorios. En la celda amarilla indicamos cuantos de estos números deseamos sumar.

En la celda verde conseguimos efectuar la suma del número de sumandos indicado en la celda amarilla. Para ello, utilizamos la función:

=SUMA(INDIRECTO("B4"):INDIRECTO("B"&D5+3))

La función INDIRECTO es ya una vieja amiga de este blog y pertenece a las funciones avanzadas con las que conseguimos grandes resultados.

Además usamos el concatenador: &, que nos permite unir (concatenar) cadenas. Esto es, unimos texto o cadenas alfanuméricas.

En la celda D9 hemos efectuado las suma de los 20 primeros datos de la columna B, y para ello hemos utilizado el método tradicional, usando la función SUMA y como rango tomamos los 20 primeros valores:

=SUMA(B4:B23)

Esta fórmula tiene el inconveniente de que si en la celda amarilla cambiamos el valor, que actualmente es de 20, por otro valor, tendríamos que editar la fórmula y cambiar el rango al que se extiende la función SUMA, si realmente queremos obtener la suma del número de valores indicados en la celda amarilla.

Para ver otras maravillas que se pueden conseguir con la función INDIRECTO puede consultar estos Posts,

Hoja2

Podemos practicar sumando en horizontal.


Hoja3

Calcular el determinante de una submatriz.

En las celdas de color rosa indicamos la posición inicial de fila y columna de la submatriz e indicamos la dimensión. Necesariamente la submatriz ha de ser una matriz cuadrada donde el número de filas y columnas coincide, por lo que únicamente marcamos de color rosa el número de filas (celda E23) y el número de columnas queda igual que el de filas.


Los valores de la matriz se generan de forma aleatoria. Al pulsar la tecla F9 cambian.

Hemos marcado de color verde la submatriz dentro de la matriz principal. Para obtener este color hemos utilizado Formato condicional. Esta es la fórmula empleada en el formato condicional para la celda B5 que luego se extiende al resto de la matriz.
=Y(FILA(B5)>=$C$13+$E$19-1;FILA(B5)<=$C$13+$E$19+$E$23-2;COLUMNA(B5)>=$C$14+$E$20-1;COLUMNA(B5)<=$C$14+$E$20+$E$24-2)

domingo, 16 de octubre de 2011

Seleccionar datos con un desplegable

Puede descargar los siguientes archivos.


Utilizar un desplegable es una tarea cotidiana e intuitiva. Lo que pretendemos es que al elegir con el desplegable un año, la consecuencia sea que una tabla con datos se rellene automáticamente con datos de ese año.

Conseguiremos nuestro proposito con el uso de la función INDIRECTO de la que podemos ver unos cuantos Post publicados en este mismo Blog. Para verlos simplemente hemos de seguir este enlace:




En la tabla verde disponemos de los datos correspondientes a tres años. Deseamos que al elegir el año en el desplegable la tabla azul se alimente automáticamente con los datos correspondientes al año elegido.

Observar que la zona azul se ha obtenido con la función INDIRECTO y se ha introducido como función matricial. Esto se puede comprobar al ver las llaves {} que son el rasgo distintivo de las funciones matriciales.

Datos de partida

Los datos de partida son los que se encuentran en la tabla superior (rango B4:E9). Lo que hacemos es crear nombres de rango con los rótulos de columna:
  • Año2009
  • Año2010
  • Año2010
Para crearlos de forma masiva lo que hacemos en la versión de Excel 2007 es seleccionar el rango C4:E9 e ir al menú Fórmulas, y luego elegir Crear desde una selección. De esta forma llegaremos a esta ventana:


Marcamos únicamente donde pone 'Fila superior'.

Si tuviéramos Excel 2003, para llegar a esta ventana el recorrido es: Insertar, Nombre, Crear.

Aceptando esta ventana lo que hemos logrado es crear los tres rangos siguientes:

  • Año2009 =Hoja1!$C$5:$C$9
  • Año2010 =Hoja1!$D$5:$D$9
  • Año2011 =Hoja1!$E$5:$E$9

Tabla para el BUSCARV

Creamos la tabla amarilla para luego poder usar un BUSCARV que nos proporcione el año al elegir desde el desplegable.



Creamos el desplegable

Creamos el desplegable o ComboBox,o también llamado 'Cuadro combinado'.


Esto en Excel 2007 se consigue desde la ficha Programador, y luego en Insertar uno de los Controles de formulario denominado Cuadro combinado.


En Excel 2003 se consigue obteniendo la barra de Formularios y luego eligiendo Cuadro combinado.

Al pulsar con el botón izquierdo del ratón sobre el icono del Cuadro combinado conseguiremos que el cursor se convierta en una cruz finita, y en ese momento crearemos la diagonal del desplegable arrastrando con el ratón sobre la hoja.

Luego, pulsamos el desplegable con el botón derecho del ratón y elegimos 'Formato de control'.


Como rango de entrada ponemos G13:G15 que es donde están escritos los nombres de cabecera que previamente hemos creado.

Donde pone 'Vincular con la celda' ponemos la celda G11. Esto permitirá que al elegir en el desplegable la primera opción en la celda G11 aparezca un 1; si elegimos la segunda opción aparecerá un 2; y si elegimos la tercera opción del desplegable en la celda G11 aparecerá un 3.

BUSCARV

En la celda C11 escribimos la siguiente función:

=BUSCARV(G11;tabla;2;0)

Donde el rango tabla es: F13:G15.

Con ello conseguiremos que al cambiar el valor de la celda G11 según las elecciones que hagamos del desplegable, podamos poner en esta celda (C11) la cabecera de los datos que deseamos obtener.

Son tres posibles cabeceras que podemos obtener:

  • Año2009
  • Año2010
  • Año2010
INDIRECTO como función matricial

Finalmente hemos de emplear la función INDIRECTO. Para familiarizarnos con esta función avanzada de Excel conviene revisar algunos post donde se habla de ella o se utiliza. Para ello se puede seguir el enlace que se ha indicado al inicio de este artículo.

Como vamos a tratarla como una función matricial hemos de seguir los tres pasos típicos de toda función matricial. Para familiarizarnos con esto se aconseja ver el siguiente artículo:


Primero, señalamos el rango C12:C16, que es donde la función matricial dejará su resultado.

Segundo, escribimos la función matricial que empleamos en este caso, que es la siguiente:

=INDIRECTO(C11)

Tercero, para validar no pulsamos Enter, sino que hemos de pulsar tres teclas simultaneamente: CONTROL+MAYUCULAS+ENTER.

Resultado

Si todo ha ido bien hemos conseguido un desplegable donde al elegir el año la tabla de abajo toma los datos correspondientes a ese año de la tabla de arriba. Con ello, hemos conseguido disponer de un desplegable que permite traernos los datos que deseamos.


Esto con tablas de datos realmente grandes puede llegar a ser muy interesante.

Hoja2

Proponemos un segundo método que incluso puede ser mejor que el primero por ser más sencillo.

Consiste en utilizar como desplegable una celda con Validación de datos de tipo LISTA.



En el siguiente vídeo puede ver el proceso de creación por los dos métodos.

El 10%


Podemos crear fórmulas matriciales que hagan referencia a todo un rango o matriz. Veamos cómo se calcula el 10% del rango C12:C16.



Al variar los datos con el desplegable de la celda C11 nuestro 10% también varía.


Para saber más

Puede consultar el siguiente enlace.

jueves, 11 de junio de 2009

INDIRECTO

Descargar el fichero: indirecto.xlsx

Vincular a una celda es una tarea bastante habitual y sencilla. Simplemente ha de hacer referencia a la celda a la que quiere vincular. Pero existe otro método para vincular a una celda, utilizando la función INDIRECTO. La diferencia entre ambos métodos radica en que al mover la celda vinculada, si hemos utilizado la vinculación clásica, nuestro valor se actualiza. Por el contrario, si utilizamos INDIRECTO se seguirá apuntando a la celda donde originariamente estuviera el dato inicial, pese a haberse movido.

Hoja1

La función INDIRECTO.

=INDIRECTO(ref;tipo)

Vease un post anterior denominado:

Un desplegable con INDIRECTO

En nuestro caso utilizaremos la función INDIRECTO con el tipo de referencia a celda habibual A1, por tanto en tipo no indicaremos nada.

En B4 ponemos un dato, por ejemplo 100.

Si deseamos vincular a esa celda desde otra, por ejemplo desde C7, simplemente pondremos la referencia: =+B4. Este es el modo habitual de vincular con otra celda.

Un método alternativo con la función INDIRECTO consiste en poner en otra celda, por ejemplo en B10, el valor B4 como texto, que hace referencia a la celda B4. Y en C10 ponemos la fórmula:

=INDIRECTO(B10)

El resultado obtenido en C10 sera 100, al igual que el que se obtuvo al vincular con B4 desde C7. ¿Entonces para que vale INDIRECTO, si hace lo mismo que si vinculamos?, y además vincular es más fácil, e intuitivo.

La respuesta a esta pregunta la vamos a comprender al mover la celda amarilla (B4) a cualquier otro posición. Por ejemplo, movámosla hasta la celda E4. ¿Qué observamos?. Vemos que la celda C7 conserva el valor 100, ya que adapta su fórmula y ahora pone: =+E4. Esto es, al mover una celda, todas las fórmulas que apuntaban a esa celda se actualizan con la nueva celda.

Por el contrario, en C10 ahora pone 0. Esto es así, ya que la función INDIRECTO apunta siembre a la referencia de celda que se indica en B10, y en ésta sigue poniendo B4. Puesto que, tras el movimiento, en B4 ahora no hay nada, el valor que devuelve INDIRECTO es cero.






Hoja2

La función INDIRECTO con rangos.

Este caso es similar al anterior, pero trabajamos con rangos de celdas.

En las celdas amarillas escribimos unos datos. En las celdas verdes vinculamos con las amarillas pero de forma matricial. Esto se hace de la siguiente forma:

  1. Primero seleccionamos las celdas verdes: C7:C8
  2. Escribimos una fórmula comenzando con el signo + y luego marcamos con el ratón las celdas amarillas: B4:B5
  3. Y ahora no pulsamos Intro. Para validar debemos pulsar: Control+Mayúsculas+Intro
En B10 ponemos como texto la referencia a las celdas amarillas: B4:B5.

Las celdas azules las creamos matricialmente con INDIRECTO, siguiendo estos pasos:

  1. Seleccionamos las dos celdas azules: C10:C11
  2. Escribimos la fórmula: =INDIRECTO(B10)
  3. No validamos con Intro. Validamos con Control+Mayúsculas+Intro
Si movemos las celdas amarillas a otra posición de la hoja, sucederá lo mismo que se ha comentado anteriormente. Veremos que las referencias a celdas se actulizan, pero en el caso de la función INDIRECTO se rellenara con ceros.


Puede ver una aplicación de la función INDIRECTO en un post anterior, denominado:


La función INDIRECTO es una de esas funciones avanzadas que permite crear fantásticos trucos en Excel.

martes, 9 de junio de 2009

Celdas Alternas con INDIRECTO

Puede descargar los archivos de Excel siguientes.

Hoja1

Supongamos que queremos mostrar una lista vertical con los beneficios de una empresa a lo largo de múltiples años. Los datos originales los tenemos en una fila y alternos. Disponemos de los ingresos, los gastos y por diferencia los resultados. Si tratáramos de crear la columna de beneficios vinculando celda a celda nos encontraríamos con una tarea muy ardua y llena de posibles errores. Aquí mostramos un método estupendo con la función INDIRECTO utilizando referencias de Fila Columna: F1C1.






Hoja2

En la Hoja2 hemos dispuesto los datos originales en una tabla vertical y deseamos obtener el Resultado también en una tabla vertical. Hemos utilizado dos métodos.
  1. Método 1: usando la función INDIRECTO
  2. Método 2: usando la función INDICE



Un desplegable con INDIRECTO

Descargar el fichero: vinculo.xlsx

INDIRECTO es una función fascinante que nos permite idear trucos muy interesantes en Excel. En este caso vamos a ver cómo se puede utilizar para extraer información de varias tablas según elijamos una y otra con un desplegable, también denominado combobox o cuadro combinado.

La función tiene los siguientes argumentos

=INDIRECTO(ref;a1)

donde

ref  representa una referencia a celda, que podemos escribir en la fórmula o puede estar escrita en otra celda a la que aquí se haga referencia

a1 representa el método que utilizamos para hacer referencia a una celda. Existen dos métodos. El clásico A1 que indica columna A, fila 1. Y el menos conocido R1C1 que indica Row (fila) 1 y Column (columna) 1. En español sería F1C1, que supone hablar de la Fila 1 y la Columna 1. Y en otras ocasiones, según tengamos definido en Windows la configuración regional, estaríamos hablando de L1C1, que es Línea 1 y Columna 1.
  • Si este argumento se omite o ponemos VERDADERO o 1, se utiliza el método A1.
  • Si en este argumento ponemos FALSO o 0, se utilizara la referencia tipo F1C1.

Disponemos de tres hojas: Hoja1, Hoja2 y Hoja3, en las que tenemos tres tablas con diferentes valores núméricos. También disponemos de una hoja denominada Index, en la que queremos mostrar los valores de alguna de las tres tablas anteriores, en función de la selección que haga el usuario mediante un desplegable. Si el usuario elige la Hoja1 se mostrará la tabla correspondiente a esa hoja, si elige la Hoja2 se mostrará la tabla correspondiente a ella, y si elige la Hoja3 se mostrará la tercera tabla.

Esta resuelto de dos formas, con o sin formula matricial.