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

martes, 5 de diciembre de 2017

Ciudades elegidas

Puede descargar el archivo ciudadesElegidas.xlsm

Hoja1

Disponemos de una lista de ciudades, son en total 735 ciudades, y deseamos elegir aleatoriamente unas cuantas de ellas. La elección se realizará por dos métodos, ambos con la posibilidad de que salgan ciudades repetidas. Si obtenemos ciudades repetidas las detectaremos con Formato condicional.

Los métodos empleados son los siguientes.
  • Método 1: con la función INDICE
  • Método 2: con la función DESREF



Hoja2

Disponemos de una lista de ciudades en la columna A y de ellas deseamos elegir aleatoriamente y sin repetición un cierto número de ellas. Vamos a resolver este caso con la ayuda de una macro de Excel.


 Sub EligeNombresAleatorios()  
 Borra  
 Dim numElegidas As Integer  
 Dim numNombres As Long  
 Dim numAlea As Integer  
 Dim Nombres() As String  
 Dim i As Byte, j As Byte  
 Dim Fila As Long  
 Dim Repe As Boolean 'para ver si está repetida la ciudad seleccionada  
 numElegidas = Range("C3").Value  
 Fila = 6  
 ReDim Nombres(1 To numElegidas)  
 numNombres = Application.CountA(Range("A:A")) - 1  
 For i = 1 To numElegidas  
   Do  
     Repe = False 'inicialmente supondremos que no está repetida la ciudad  
     numAlea = Application.RandBetween(1, numNombres)  
     'veamos si la ciudad seleccionada ya ha sido elegida  
     For j = LBound(Nombres) To UBound(Nombres)  
       If Nombres(j) = Cells(numAlea + 1, 1).Value Then Repe = True: Exit For  
     Next j  
   Loop While Repe  
   Nombres(i) = Cells(numAlea + 1, 1).Value ' Assign random name to the array  
 Next i  
 'Escribe las ciudades elegidas  
 For j = LBound(Nombres) To UBound(Nombres)  
   Cells(Fila, 3) = Nombres(j)  
   Fila = Fila + 1  
 Next j  
 End Sub  
   
 Sub Borra()  
 Range("C6").Select  
 Range(Selection, Selection.End(xlDown)).ClearContents  
 Range("C3").Select  
 End Sub  


Y en la Hoja2 tenemos el siguiente código.

 Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address = "$C$3" Then  
     Call EligeNombresAleatorios  
   End If  
 End Sub  

martes, 15 de noviembre de 2016

Función DESREF y función INDICE

Puede descargar el archivo:

Hoja1

Disponemos de una tabla de doble entrada con valores de ventas en cinco ciudades durante seis meses.

Partiendo de los datos anteriores, deseamos elaborar una tabla donde figure la ciudad, el mes y las ventas correspondientes.

En la celda L5 utilizamos la siguiente fórmula.

=INDICE($C$7:$H$11;COINCIDIR(J5;$B$7:$B$11;0);COINCIDIR(K5;$C$6:$H$6;0))

Ahora deseamos elaborar una tabla donde figuren las ventas máxima indicando en que ciudad y mes se alcanzaron.

La celda O5 es la siguiente.

=DESREF(L4;COINCIDIR(MAX(Ventas);Ventas;0);-2)

Hoja2

Planteamos un ejercicio para practicar el uso de DESREF y de INDICE.

Como datos nos proporcionan las averías que se producen en cada mes desde enero-2017 hasta diciembre-2025.
Nos piden que con Formato condicional marquemos la cifra de averías máximas y mínimas.

Queremos elaborar una tabla como la siguiente, donde se indiquen las averías máximas y mínimas y en que año y mes se producen, usando para el año y el mes la función DESREF.


Nos proporcionan el gráfico de la evolución de las averías a lo largo del tiempo.


Nos piden que volcar la base de datos anterior a una tabla de doble entrada, usando para ello la función INDICE.



Finalmente nos piden que partiendo de la tabla de doble entrada anterior construyamos una tabla igual a la que se utilizó inicialmente con los datos de partida. Para ello, volveremos a utilizar la función INDICE.

Hoja3

En esta hoja damos solución al ejercicio planteado en la hoja anterior.
La celda F9 nos proporciona el mes donde se alcanza el mínimo de averías, su fórmula es:

=DESREF($B$4;COINCIDIR(MIN(Averias);Averias;0);0)


Para elaborar esta tabla hemos realizado un cambio importante en la columna que recoge los meses. Inicialmente los meses venían en texto: ene, feb, mar, may, ... Lo que hemos hecho para que las fórmulas funcionen bien es cambiar esos textos por fechas reales con el formato que nos pide Excel para la fechas y luego con Formato de celda personalizado hemos pedido que se muestre únicamente el mes de esa fecha.


La celda Q5 que proporciona el primer número de averías (50.000) es la siguiente.

=INDICE(tabladoble;MES(P5);AÑO(P5)-2016)


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, 15 de agosto de 2014

Gráfico incremental

El ejemplo utilizado en el vídeo se puede encontrar en la Hoja4 del siguiente archivo.


Utilizando la capacidad de la función DESREF para crear Rangos dinámicos vamos a crear el denominado Gráfico incremental. Se trata de un gráfico en el que podemos elegir de forma sencilla, presionando sobre un control de formulario, cuántos valores se verán representados en la serie de datos del gráfico.

Conviene entender previamente lo que es un Rango dinámico consultado el siguiente post.
La sintaxis de la función DESREF es la siguiente.
=DESREF(ref, filas, columnas, [alto], [ancho])

miércoles, 25 de noviembre de 2009

Ultimo valor. Una aplicación de DESREF

Descargar el fichero: ultimo_valor.xlsx

Ultimo valor nos permite calcular el último valor de una columna. Para ello se utiliza la función DESREF y COINCIDIR. Utilizaremos un caso que nos permite gestionar las participaciones de un Fondo de Inversión.

Disponemos de tres tablas y un gráfico.


En las celdas amarillas se introducen los datos y en las verdes se calculan las fórmulas.

La tabla central contiene el valor de una participación en diferentes fechas. Con esta información creamos el gráfico que nos muestra el valor cotizado a lo largo del tiempo de una participación del fondo de inversión. Esta tabla central irá creciendo hacia abajo a medida que se introduzcan nuevos valores en diferentes fechas.

La tabla de la izquierda permite ir anotando los movimientos (compras y ventas) que se producen en la cartera de este fondo de inversión en concreto. Las compras suponen un número positivo de participaciones y las ventas implican un número negativo de participaciones. A medida que se vayan produciendo nuevas compras y ventas de participaciones esta tabla irá creciendo hacia abajo, anotándose una nueva línea por cada operación realizada.


El precio de la celda E5 se obtiene con la expresión:

=DESREF(H4;COINCIDIR(B5;H:H)-4;1)

La función COINCIDIR tiene la siguiente sintaxis:
=COINCIDIR(valor_buscado; matriz_buscada; tipo_de_coincidencia])

Y la función DESREF utiliza los siguientes argumentos:

=DESREF(ref;filas;columnas;alto;ancho)

A la función COINCIDIR tenemos que restarle 4 porque las fechas de la columna H comienzan en la fila 5. Esto supone que los datos deben comenzar siempre en la fila 5, no pudiéndose insertar filas.

En la celda K5 determinamos las participaciones en cartera sumando todos los valores de la columna D. Esto se hace con la expresión:

=SUMA(D:D)
Esto supone que no se deben introducir valores numéricos ni fechas en las celdas
D1 a D4.

La tabla de la derecha contiene tres fórmulas, y es una tabla que no crece. Esto es, no es una base de datos como las dos anteriores sino que esta constituida por tres fórmulas de resultados. En ella se determina el valor actual de la cartea de participaciones de este fondo de inversión concreto. Este valor actual se calcula como el producto del número de participaciones existentes en el momento actual, multiplicado por el último valor conocido de la participación.

La celda L5 se calcula con la expresión:

=DESREF(I4;COINCIDIR(MAX(H:H);H:H)-4;0)
Al ser la columna H la de fechas, su máximo nos da el valor de la fecha correspondiente a la fecha más actual, la más tardía. La función COINCIDIR nos indica cuantas fechas hay en la columna H. Restamos 4 ya que los datos comienzan en la fila 5. Por eso no se deben insertar o eliminar filas antes de la fila 5. La función DESREF nos lleva hasta el último precio de la participación anotado en la columna I. Por tanto la celda L5 contiene el último precio conocido de la participación.

En M5 calculamos el Valor Actual de la cartera simplemente multiplicando el número de participaciones que tenemos en cartera por el último precio conocido de una participación.

=K5*L5

miércoles, 10 de junio de 2009

Buscar la Pareja

Descargar el fichero: emparejar.xlsx

Hemos creado un caso que permite buscar la pareja correspondiente a una persona según una tabla de parejas. La novedada es que nos pueden dar cualquiera de las dos personas correspondiente a la columna de la derecha o de la izquierda, y nosotros debemos buscar la contraparte. Para ello utilizaremos la función DESREF.

La tabla de la izquierda tiene dos columnas Persona_1 y Persona_2 que establecen las parejas existentes. Estas columnas se nombran con nombres de rango: PER1 y PER2.

En la segunda tabla disponemos de dos columnas Pareja A y Pareja B. Todos los valores se generan con números aleatorios. Esto supone que al pulsar la tecla de función F9 cambian los valores de esta segunda tabla.

Veamos la columan Pareja A. En este caso se extrae el nombre de una persona de forma aleatoria sea de la primera o segunda columna de la tabla de datos. Se emplea la función:

=DESREF(ref;filas;columnas;alto;ancho)

Esta función tiene dos formas de trabajar:
  1. Si utilizamos los tres primeros argumentos, la función permite extraer un valor de una tabla comenzando a contar desde la celda ref, y desde ella bajando el número de filas indicado, y moviéndonos a la derecha el número de columnas indicado. Si las filas son negativas nos movemos hacia arriba. Si las columnas son negativas nos movemos hacia la izquierda.
  2. Si utilizamos los cinco argumentos, la función trabaja como una función matricial, y lo que extrae no es un valor sino un rango de valores. Este rango extraido tiene como esquina superior izquierda la definida por los tres primeros argumentos, tal y como se han definido antes, y el argumento alto y ancho indican la dimensión del rango extraido. Al ser una función matricial, en primer lugar se han de seleccionar las celdas donde la matriz devolverá su resultado, y finalmente se ha de validar con Control+Mayusculas +Intro.
En este caso se extrae un único valor, no utilizandose la vesión matricial.

La fórmula utilizada para la Pareja A es la siguiente:

=DESREF($A$4;ALEATORIO.ENTRE(1;6);ALEATORIO.ENTRE(1;2))

Esto permite extraer de forma aleatoria cualquier persona de la primera tabla, este en la columna de la izquierda o de la derecha.


Para determinar la Persona B disponemos de varios métodos. El primero de ellos utiliza la siguiente expresión, para la celda F6:

=SI(ESNUMERO(COINCIDIR(E6;PER1;0));BUSCARV(E6;TODO;2;0);DESREF($B$5;COINCIDIR(E6;PER2;0);0))


Se utiliza la función:

=ESNUMERO(valor)

determina si es número, respondiendo con VERDADERO o FALSO.

El segundo método utiliza la expresión, para la celda G6:

=SI(ESERROR(BUSCARV(E6;TODO;2;0));DESREF($B$5;COINCIDIR(E6;PER2;0);0);BUSCARV(E6;TODO;2;0))

La función:

=ESERROR(valor)

responde con VERDADERO o FALSO. Si detecta un error responde con VERDADERO, y considera que #N/A es un error. Existe otro función, =ESERR que no considera como error el valor #N/A.

Tanto el método 1 para la celda F6, como el método 2 para la celda G6 requieren copiar la fórmula hacia abajo para toda su columna. Vamos a buscar una alternativa con nombres de rango donde la fórmula se la misma para todas las celdas de su columna.

El método 3 trabaja con el rango ParejaA, lo que permite que la fórmula sea la misma para todas las celdas de la columna H. Su expresión es:

=SI(ESERROR(BUSCARV(ParejaA;TODO;2;0));DESREF($B$5;COINCIDIR(ParejaA;PER2;0);0);BUSCARV(ParejaA;TODO;2;0))

El método 4 es una variante del anterior que trabaja de forma matricial.