Sorry, I am getting used to forums. I'll try my best to be more thorough. Here is the complete code:
Sub cotizacion2()
'iniciamos el código para generar la cotización a partir de pocos datos
MsgBox ("¡Bienvenido al Asistente de Cotización!")
Dim NSM, Nom, MaS, MeS, PR, areat, CSP, Asim, CF, P, H, actual As Double
Dim Per, PP, R As Integer
Dim curva As Boolean
'Se declara la información necesaria para realizar la Cotización
Nom = InputBox("Da el valor de la Nómina mensual:")
Per = InputBox("¿Con cuánto personal cuenta la empresa?")
PP = (Per * 0.8) - 1
MaS = InputBox("Da el valor del Salario más alto:")
MeS = InputBox("Da el valor del Salario más bajo:")
PR = InputBox("Indica la Prima de Riesgo en Nivel: 1, 2, 3, 4 ó 5")
'Restricciones
While Round(MeS, 2) > Round(MaS, 2) Or 0 > PR > 5 Or Nom < 0 Or Per < 0
MsgBox ("Verifica bien los datos ingresados y vuelve a intentar.")
Nom = InputBox("Da el valor de la Nómina mensual:")
Per = InputBox("¿Con cuánto personal cuenta la empresa?")
PP = (Per * 0.8) - 1
MaS = InputBox("Da el valor del Salario más alto:")
MeS = InputBox("Da el valor del Salario más bajo:")
PR = InputBox("Indica la Prima de Riesgo en Nivel: 1, 2, 3, 4 ó 5")
Wend
'Se declara el valor de PR
If PR = 1 Then PR = 0.0054355
If PR = 2 Then PR = 0.0113065
If PR = 3 Then PR = 0.025984
If PR = 4 Then PR = 0.0465325
If PR = 5 Then PR = 0.0758875
'Lógica de la cotización
MsgBox ("Empieza la Cotización:" & vbNewLine & "El Cálculo se realiza de personal con mayor sueldo al menor.")
curva = Application.InputBox("¿Esta Cotización tiene que segmentarse?" & vbNewLine & "True or False", Type:=4)
'Inicia el Cálculo de Área
If curva = True Then
Dim segmentos, i As Integer
segmentos = InputBox("Indica el número de segmentos a calcular.")
While segmentos < 0
segmentos = InputBox("Verifica el número de segmentos a calcular e ingrésalo de nuevo.")
Wend
's=tipo de curva; PS= personal segmentado; salario= salario del segmento i; area= nómina del segmento i
ReDim s(0 To segmentos), PS(0 To segmentos), salario_inicial(0 To segmentos), salario_final(0 To segmentos), area(0 To segmentos) As Variant
PS(0) = 0
salario_inicial(0) = MaS
salario_inicial(segmentos) = MeS
salario_final(segmentos) = MeS
salario_final(0) = MaS
R = Per
For i = 1 To segmentos
s(i) = InputBox("Indica el tipo de aproximación que buscas:" & vbNewLine & "Nómina Promedio #1" & vbNewLine & "Nómina Creciente #2" & vbNewLine & "Nómina Creciente Variable #3")
PS(i) = InputBox("Indica la cantidad de personal que se encuentra en el segmento " & i & vbNewLine & "Personal restante:" & R)
salario_inicial(i) = InputBox("Indica el salario inicial a utilizar en el segmento " & i)
salario_final(i) = InputBox("Indica el salario final del segmento " & i)
While 0 > Round(s(i), 2) > 4 Or PS(i) > R Or Round(salario_inicial(i), 2) > Round(salario_inicial(i - 1), 2) Or Round(salario_final(i - 1), 2) < Round(salario_final(i), 2)
PS(i) = InputBox("Verifica la cantidad de personal del segmento " & i & " y vuelve a ingresarla." & vbNewLine & "Personal restante:" & R)
s(i) = InputBox("Verifica el tipo de aproximación que buscas:" & vbNewLine & "Nómina Promedio #1" & vbNewLine & "Nómina Creciente #2" & vbNewLine & "Nómina Creciente Variable #3")
salario_inicial(i) = InputBox("Verifica el salario inicial a utilizar en el segmento " & i & " y vuelve a ingresarlo.")
salario_final(i) = InputBox("Verifica el salario final a utilizar en el segmento " & i & " y vuelve a ingresarlo.")
Wend
R = R - PS(i)
If s(i) = 1 Then area(i) = salario_inicial(i) * PS(i)
If s(i) = 2 Then area(i) = ((salario_inicial(i) - salario_final(i)) * PS(i) / 2) + salario_final(i) * PS(i)
If s(i) = 3 Then area(i) = ((salario_inicial(i) - salario_final(i)) * PS(i) * 2 / 3) + salario_final(i) * PS(i)
areat = areat + area(i)
MsgBox (area(i))
Next i
MsgBox ("Nómina mensual " & areat)
Else
segmentos = 1
s(1) = InputBox("Indica el tipo de aproximación que buscas:" & vbNewLine & "Nómina Promedio #1" & vbNewLine & "Nómina Creciente #2" & vbNewLine & "Nómina Creciente Variable #3")
While 0 > seg > 4
seg = InputBox("Verifica el tipo de aproximación que buscas:" & vbNewLine & "Nómina Promedio #1" & vbNewLine & "Nómina Creciente #2" & vbNewLine & "Nómina Creciente Variable #3")
Wend
If s(1) = 1 Then areat = MaS * Per
If s(1) = 2 Then areat = (MaS - MeS) * Per / 2 + MeS * Per
If s(1) = 3 Then areat = (MaS - MeS) * Per * (2 / 3) + MeS * Per
MsgBox ("Nómina mensual " & areat)
End If
'Inicia el Ajuste de Nómina
While Round(areat, 2) <> Round(Nom, 2)
If Round(areat, 2) > Round(Nom, 2) And segmentos = 2 Then
area(2) = area(2) - (areat - Nom)
areat = 0
For i = 1 To segmentos
areat = areat + area(i)
Next i
MsgBox ("Se modificó el Segmento 2 a: " & area(2))
'Se modifican los parámetros de la segunda área
If s(2) = 1 Then salario_inicial(2) = area(2) / PS(2)
If s(2) = 2 Then salario_inicial(2) = ((area(2) - (PS(2) * salario_final(2))) * 2 / PS(2) + salario_final(2))
If s(2) = 3 Then salario_inicial(2) = ((area(2) - (PS(2) * salario_final(2))) * (3 / 2) / PS(2)) + salario_final(2)
Else
area(segmentos - 1) = area(segmentos - 1) + (Nom - areat)
areat = 0
For i = 1 To segmentos
areat = areat + area(i)
Next i
MsgBox ("Se modificó el Segmento " & (segmentos - 1) & " a " & area(segmentos - 1))
'Se modifican los parámetros del última área
If s(segmentos - 1) = 1 Then salario_inicial(segmentos - 1) = (area(segmentos - 1) / PS(segmentos - 1))
If s(segmentos - 1) = 2 Then salario_inicial(segmentos - 1) = ((area(segmentos - 1) - (PS(segmentos - 1) * salario_final(segmentos - 1))) * 2 / PS(segmentos - 1)) + salario_final(segmentos - 1)
If s(segmentos - 1) = 3 Then salario_inicial(segmentos - 1) = ((3 / 2) * (area(segmentos - 1) - (PS(segmentos - 1) * salario_final(segmentos - 1))) / PS(segmentos - 1)) + salario_final(segmentos - 1)
End If
Wend
MsgBox ("Nómina Ajustada: " & areat & " = " & Nom & vbNewLine & "Inicia el Cálculo del Costo Óptimo.")
'La Nómina queda ajustada al dato ingresado. Se continúa con el cálculo del salario por trabajador z.
ReDim SMT(1 To Per) As Variant
Dim cont As Integer
cont = 1
For i = 1 To segmentos
For j = 1 To PS(i)
If s(i) = 1 Then SMT(cont) = salario_inicial(i) / 70.1 / 30.4
If s(i) = 2 Then SMT(cont) = ((salario_inicial(i) - salario_final(i)) / ((PS(i) - j) + salario_final(i))) / 30.4 / 70.1
'Para este caso se traslada el Punto de Origen a: [PS(i-1), salario_final(i)]
If s(i) = 3 Then
If j = 1 Then
SMT(cont) = salario_inicial(i) / 30.4 / 70.1
Else
H = PS(i)
k = (salario_final(i))
a = (-H / ((SMT(cont - 1) * 30.4 * 70.1) - k) ^ 2)
fga = 1
fgb = -2 * k
fgc = k ^ 2 + (H - j) / a
SMTP = (-fgb + ((fgb) ^ 2 - 4 * fga * fgc) ^ 0.5) / 2
SMTN = (-fgb - ((fgb) ^ 2 - 4 * fga * fgc) ^ 0.5) / 2
If Round(SMTP, 2) > Round(SMTN, 2) Then
SMT(cont) = SMTP / 30.4 / 70.1
Else
SMT(cont) = SMTN / 30.4 / 70.1
End If
End If
End If
MsgBox ("Salarios Mínimos del Trabajador " & cont & ": " & SMT(cont))
cont = cont + 1
Next j
Next i
Thanks
Bookmarks