Método Holt con Solver 2/2

En la primer entrada de este tema vimos como usar las funciones de Solver en VBA para realizar pronósticos individuales hacia un producto en especifico, para completar este tema y dejar una herramienta practica y completamente funcional a las necesidades reales de la industria en esta entrada veremos como realizar el pronostico para una lista de productos.

Vamos a arrastrar hacia abajo el mismo formato que ya determinamos en Método Holt con Solver en VBA  de acuerdo al numero de productos que vayamos a pronosticar, para este ejemplo solo pronosticaremos 17 productos.

Como se puede observar en la animación nos sigue apareciendo la notificación para realizar el pronostico, ya que al seleccionar el rango el código detecta que se ha hecho una selección dentro del rango establecido para ejecutar el MsgBox.

El arrastre de esta formula será hasta cumplir con la cantidad de productos que se van a pronosticar.

Una vez realizado eso crearemos una nueva función la cual nombraremos como conjunto:

Sub conjunto()
    Dim i           As Integer
    Dim x           As Integer
    Dim start       As Date
    Dim actual      As Date
    Dim trans       As Date
    Dim strTrans    As String
    
    start = TimeValue(Now)
    
    x = 0
    For i = 3 To 99 Step 6
        x = x + 1
        If Range("A" & i) = "X" Then
            
        Else
            SolverReset
            SolverOk SetCell:="$E$" & i, MaxMinVal:=2, ValueOf:=0, ByChange:="$C$" & i & ":$D$" & i, Engine:=1, EngineDesc:="GRG Nonlinear"
            
            SolverAdd CellRef:="$C$" & i & ":$D$" & i, Relation:=3, FormulaText:="0"
            SolverAdd CellRef:="$C$" & i & ":$D$" & i, Relation:=1, FormulaText:="1"
            
            SolverSolve UserFinish:=True
            SolverFinish KeepFinal:=1
            
            actual = TimeValue(Now)
            trans = actual - start
            strTrans = Int(CSng(trans * 24)) & ":" & Format(trans, "nn:ss")
            Range("A1") = ("Partida #: " & x & " de 17 | Inicio: " & start & vbCrLf & "Tiempo transcurrido: " & strTrans)
            
        End If
    Next i

Iniciamos definiendo las variables a utilizar:

i: Esta variable la utilizaremos para el ciclo for
x: Nos servirá para contar cuántos ciclos ha realizado el bucle.
start: Registraremos la hora de inicio de la macro.
actual: Rescataremos nuevamente la hora pero dentro del ciclo.
trans: Con las dos variables anteriores determinaremos el tiempo transcurrido.
strTrans: Estructuramos el mensaje estado.

Bien, ya definidas las variables iniciaremos  rescatando la hora actual en la linea 9 para ello utilizaremos la función TimeValue() a la cual le asignaremos el argumento de la función Now(), con esto aseguramos que al ejecutar la macro nos rescate la hora exacta.

Después asignaremos el valor 0 a nuestra variable x para que más adelante podamos ir sumando una unidad por cada ciclo recorrido.

Iniciaremos el ciclo For con i = 3  To 99 ya que la fila en donde se encuentra nuestro primer producto es la 3 y la ultima la 99. Recordemos que los parámetros que optimizaremos se encuentran en la  misma fila que la del nombre y la demanda real del producto. Agregamos un Step de 6 unidades ya que el rango de filas de todos los cálculos para un solo producto es de 6, lo que conseguiremos con esta indicación es incrementar en 6 unidades la variable por cada corrida de ciclo.

Una vez dentro del ciclo vamos a incrementar en 1 unidad nuestro valor x que para este ejercicio será nuestro contador. De esta manera podemos saber cuántas corridas del se han realizado, otra forma de realizarlo es consultar el valor de i , pero para fines educativos nos resulta más enriquecedor hacerlo de está forma.

Dentro del ciclo For agregaremos un condicional con la sentencia If para que únicamente nos realice la optimización con Solver de aquellos productos que no tengan marcado una «X» en la columna A. Si encuentra alguna X no hará nada, si no lo hay ejecutará las funciones de Solver que revisamos en la entrada anterior.

A diferencia del código anterior, para dar referencias a las celdas de los parámetros α y β y del error, no utilizaremos las propiedades ActiveCell.Row ya que tendríamos que indicar en el ciclo que la selección la otorgue a un rango especifico y no resultaría practico. En su defecto hacemos referencia al número de fila dado por la variable i del ciclo.

Por ultimo necesitamos indicar el estado, recodemos que rescatamos la hora precisa en la que iniciamos el script, dentro del ciclo rescataremos nuevamente la hora y calcularemos la diferencia de ambas para determinar el tiempo transcurrido. Al estar trabajando con datos del tipo date es necesario asegurarnos que los datos son numéricos reales, para ello utilizamos las funciones Int que nos convierte cualquier numero a un entero eliminando los decimales y CSng la cual nos ayudará a convertir cualquier tipo de dato a numérico (con un máximo de 6 decimales).

Finalizamos colocando el texto deseado utilizando el operador & para concatenar el texto con las variables que ya calculamos y todo esto lo imprimimos en la columna C1, y con esto damos por terminado nuestro script.

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *