Macro para identificar cedas en blanco de un rango

Hice la misma pregunta en un post anterior. Quizás formulé mal el planteamiento, se entiende poco y por ello no tuvo respuesta. Intentaré dar más y mejores datos.

Tengo una tabla en la que hay Una serie Histórica (de ventas, de producción...).

Según la cantidad de periodos de estudios, habrá más o menos celdas vacías que, en teoría, serían las celdas donde irán las "Predicciones" de Ventas o producción.

En una segunda Hoja hay otra tabla en la que se hace una "Media Móvil", aplicada a la serie Histórica.

El caso es que la serie Media Móvil, sobre el final de la Serie Histórica (donde no hay ya datos) toma como referencia celdas vacías para la Previsión.

Con la Herramienta SOLVER de Excel, se puede hacer un sistema Iterativo que "iguale" ambas "Predicciones"

En este caso, las celdas vacías empiezan en la Celda F18 de la Hoja Datos.

Los Datos de la "Media Móvil" se encuentra en la Hoja Media Móvil, en la celda E18 (Coincide el número de la Fila, pero no el de la columna)

La macro que muestro, hace el proceso iterativo hasta que la celda F18 (de la Hoja Datos) es lo más cercano posible según la estructura de datos deja a la celda E18 (de la Hoja Media Móvil)

La Macro debería, de forma dinámica, revisar las celdas vacías de la tabla mostrada (Columna F, a partir de la Fila 6) y repetir el método iterativo en cada celda vacía que encuentra.

Hoja Datos F18 con Hoha Media Móvil E18

Hoja Datos F19 con Hoha Media Móvil E19

Hoja Datos F20 con Hoha Media Móvil E20

Y así sucesivamente, por cada ceda vacía del rango de la columna F, dentro de los límites de la tabla.

La Macro la logré del "Grabador de Macros" y sólo le añadía un par de líneas de código, sólo para limpiar los valores de la iteración precedente. La Macro es la siguiente:

Sub SolverMM()
'Calcula el valor Óptimo Preventivo de la Previsión, según la Previsión calculada originalmente (Iteración)
'
SolverReset
SolverOk SetCell:="$F$18", MaxMinVal:=1, ValueOf:=0, ByChange:="$F$18", Engine _
:=1, EngineDesc:="GRG Nonlinear"
SolverDelete CellRef:="$F$18", Relation:=2, FormulaText:="$E$18"
SolverAdd CellRef:="$F$18", Relation:=2, FormulaText:= _
"'[PREVISIONE.xlsm]Media Mobile'!$E$18"
SolverOk SetCell:="$F$18", MaxMinVal:=1, ValueOf:=0, ByChange:="$F$18", Engine _
:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$F$18", MaxMinVal:=1, ValueOf:=0, ByChange:="$F$18", Engine _
:=1, EngineDesc:="GRG Nonlinear"
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
SolverReset
End Sub

¿Hay posibilidades de ayudarme en esto?

1 respuesta

Respuesta
2

H o l a: No tengo solver, así que no puedo probar los resultados de solver, pero voy a modificar las líneas de tu macro para que vayan tomando la dirección de la celda.

Según tu ejemplo en la columna E tienes un periodo y esa columna sí tiene datos.

Entones lo que va a hacer la macro es recorrer la columna E, desde la E6 hasta la última celda con datos, para cada celda en E con datos, va a revisar si en la celda de la columna F está vacía, si está vacía, entonces toma la dirección de la celda y lo pone en tus fórmulas de Solver.

Como puedes ver en el código, simplemente estoy cambiando "$F$18" por la variable celdaf y "$E$18" por la variable celdae. En el código dejé la línea original (comentada) y la nueva línea con las variables.

Sub SolverMM()
'Calcula el valor Óptimo Preventivo de la Previsión, según la Previsión calculada originalmente (Iteración)
'
    i = 6
    Do While Cells(i, "E") <> ""
        If Cells(i, "F") = "" Then
            celdaf = Cells(i, "F").Address
            celdae = Cells(i, "E").Address
            SolverReset
            'SolverOk SetCell:="$F$18", MaxMinVal:=1, ValueOf:=0, ByChange:="$F$18", _
                Engine:=1, EngineDesc:="GRG Nonlinear"
            SolverOk SetCell:=celdaf, MaxMinVal:=1, ValueOf:=0, ByChange:=celdaf, _
                Engine:=1, EngineDesc:="GRG Nonlinear"
            '
            'SolverDelete CellRef:="$F$18", Relation:=2, FormulaText:="$E$18"
            SolverDelete CellRef:=celdaf, Relation:=2, FormulaText:=celdae
            '
            'SolverAdd CellRef:="$F$18", Relation:=2, FormulaText:= _
                "'[PREVISIONE.xlsm]Media Mobile'!$E$18"
            SolverAdd CellRef:=celdaf, Relation:=2, FormulaText:= _
                "'[PREVISIONE.xlsm]Media Mobile'!" & celdae
            '
            'SolverOk SetCell:="$F$18", MaxMinVal:=1, ValueOf:=0, ByChange:="$F$18", _
                Engine:=1, EngineDesc:="GRG Nonlinear"
            SolverOk SetCell:=celdaf, MaxMinVal:=1, ValueOf:=0, ByChange:=celdaf, _
                Engine:=1, EngineDesc:="GRG Nonlinear"
            '
            'SolverOk SetCell:="$F$18", MaxMinVal:=1, ValueOf:=0, ByChange:="$F$18", _
                Engine:=1, EngineDesc:="GRG Nonlinear"
            SolverOk SetCell:=celdaf, MaxMinVal:=1, ValueOf:=0, ByChange:=celdaf, _
                Engine:=1, EngineDesc:="GRG Nonlinear"
            '
            SolverSolve UserFinish:=True
            SolverFinish KeepFinal:=1
            SolverReset
            '
        End If
        i = i + 1
    Loop
    MsgBox "Fin"
End Sub

Prueba y me comentas.

'S aludos. Dante Amor. Si es lo que necesitas R ecuerda valorar la respuesta. G racias

¡Gracias! 

Funciona Perfectamente. La probé con varios rangos de celdas vacías y es pefecta.

Gracias, nuevamente

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas