Forma de aplicar una fórmula cumpliendo determinadas condiciones

En una hoja excel, concretamente en toda la columna "F" se encuentra aplicada la siguiente fórmula:

INDICE(Auxiliar!$A$1:$C$1;INDICE(MAX((E2=Auxiliar!$A$2:$C$22)*COLUMNA(Auxiliar!$A$2:$C$22));))

el problema es que al ir en toda la columna, tanto al cerrar como al abrir el libro, recalcula toda esta fórmula y tarda bastante, se hace muy pesado. Además, como en el rango definido de la hoja "Auxiliar" existen celdas en blanco, siempre esta fórmula da un valor en la celda correspondiente de la columna "F", aunque en su celda correspondiente de la columna "E" se encuentre vacía. Por lo tanto, me gustaría conseguir lo siguiente, si es posible:

1.-Que no sea necesario, de antemano, aplicar la fórmula a toda la columna, sino que se fuera aplicando, de forma automática, cada vez que se introdujera un valor en su correspondiente celda de la columna "E", de la que depende.

Si lo necesitáis, puedo enviar un archivo de prueba.

1 respuesta

Respuesta
1

Para evitar el recalcular todo cada vez que abres o modificas valores que afectan la fórmula, puedes quitar el cálculo automático y hacerlo manual, entra a opciones de excel, Fórmulas, Cálculo de libro y selecciona la opción manual. Si esto no es lo que necesitas, entonces habría que reemplazar tu fórmula por una macro, tendrás que tener 2 macros, una que actualice todos los valores de la columna F, esta macro sería manual y tendrías que ejecutarla cada vez que necesites actualizar todo; y otra macro, que de forma automática calcule el valor de la columna F cuando modifiques un dato de la columna E.

Revisa las opciones y me comentas.

Sería posible que la macro calculara únicamente la celda que afecte cuando se introduzca un valor en su correspondiente celda de la columna "E"; es decir, si se insertan datos en la celda E2 se ejecute la fórmula en F2, si en E3 se ejecute en F3 y,  así, sucesivamente. En cualquier caso, si lo estimas conveniente, envíame los códigos y voy probando que opción de ajusta a lo que pretendo. La opción del cálculo manual ya lo conocía.

Gracias.

Para hacer la macro, necesito entender lo que hace la fórmula, también dime si la fórmula es matricial y explícame con un ejemplo lo que hace la fórmula.

Buenas tardes,

La fórmula no es matricial. Lo que hace es lo siguiente:

1.- En la hoja "Auxiliar", en sus columnas "A", "B" y "C", bajo la denominación A1:Barrio1, B1:Barrio2 y C1:Bario3, respectivamente, se incluyen los nombres de calles pertenecientes a cada uno de estos barrios.

2.- En la hoja "Datos", en su columna "E", mediante una lista desplegable, cuyo listado sale del rango de la hoja "Auxiliar", $A$2:$C$22 (donde se encuentra el listado de calles), al elegir una de estas calles, automáticamente esta fórmula, hace que en la celda contigua de la columna "G", se inserte el nombre del Barrio al que pertenece la misma.

Por último, para tu información, en el rango definido de la hoja "Auxiliar", $A$2:$C$22, existen celdas en blanco, al no tener los barrios definidos el mismo número de calles; y, por lo tanto, aunque las celdas de la columna "E", hoja "Datos", estén vacías, la fórmula sigue asignado un valor; es decir, el nombre de un Barrio.

Espero poder haberme explicado bien, en caso contrario, por favor, no dudes en pedir cualquier aclaración.

Muchas gracias.

Saludos.

Antes de poner la macro, copia toda la columna "G" que tienes en tu hoja "Datos" y pégala en la misma columna "G" con pegado especial Valores, con esto las fórmulas desaparecerán y te quedarás con los datos del barrio.

Ahora, copia la siguiente macro en los eventos de tu hoja.

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Columns("E")) Is Nothing Then
        Set h = Sheets("Auxiliar")
        For Each c In Target
            If c.Value <> "" Then
                u = h.UsedRange.Rows(h.UsedRange.Rows.Count).Row
                Set b = h.Range("A2:C" & u).Find(c.Value, lookat:=xlWhole)
                If Not b Is Nothing Then
                    Cells(c.Row, "G") = h.Cells(1, b.Column)
                End If
            Else
                Cells(c.Row, "G") = ""
            End If
        Next
    End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. Del lado derecho copia la macro

Con la macro, cada vez que modifiques un dato de la columna "E" en automático enla columna "G" te pondrá el Barrio.

Saludos. Dante Amor

Recuerda valorar la respuesta.

Fenomenal respuesta: Podrías explicarme un poco qué es lo que hace las distintas líneas de tu extraordinario código?

Con esto busca el valor en la otra hoja, si lo encuentra pone el dato que tienes en la fila 1 según la columna en la que encontró el valor.

                Set b = h.Range("A2:C" & u).Find(c.Value, lookat:=xlWhole)                If Not b Is Nothing Then                    Cells(c.Row, "G") = h.Cells(1, b.Column)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas