3.0 KiB
3.0 KiB
Sub prorrateo()
' SUBRUTINA PARA PRORRATEAR EL PRESUPUESTO:
' FORMA DE EJECUTAR:
' LOS VALORES A PRORATEAR DEBEN ESTAR EN VERTICAL, DEBES SELECCIONAR EL RÁNGO Y EJECUTAR EL SCRIPT
' ¿QUE HACE EL SCRIPT? (CUANDO SE HABLA DEL RANGO SE REFIERE A 12 CELDAS A LA DERECHA DE CADA UNO DE LOS VALORES SELECCIONADOS)
' 1.- SI EL RANGO ESTÁ VACIO ENTONCES PRORRATEA EN CADA MES DEL 1 AL 12 EL EQUIVALENTE A 8.33% DEL TOTAL, DEJA UN NÚMERO REDONDEADO A ENTERO Y EN EL MES DOCE SE HACE EL AJUSTE DE LOS CENTAVOS ACUMULADOS
' 2.- SI EL RANGO TIENE ENTEROS Y ESOS ENTEROS SUMAN 100 (CADA ENTERO SE CONVIERTE A DECIMAL) ENTONCES SE HACE EL PRORRATEO DE ACUERDO AL VALOR DE CADA CELDA Y EN LA ÚLTIMA CELDA SE HACE EL AJUSTE DE CENTAVOS
Dim rng As Range
Dim i As Integer
Dim o, e As Object
Dim val_base As Double
Dim last_val As Double
Dim prev_ttl As Double
Dim din_rng As Range
Dim rng1_11 As Range
Dim din_val As Double
Dim clls_with_vals As Integer
Dim count_cells_iter As Integer
Dim din_sub_ttl As Double
For Each o In Selection
val_base = WorksheetFunction.Round(o.Value / 12, 0)
last_val = o.Value - (val_base * 11)
Set din_rng = Range(Cells(o.Row, o.Column + 1), Cells(o.Row, o.Column + 12))
Set rng1_11 = Range(Cells(o.Row, o.Column + 1), Cells(o.Row, o.Column + 11))
prev_ttl = WorksheetFunction.Sum(din_rng)
If prev_ttl = 0 Then
rng1_11.Value = val_base
o.Offset(0, 12).Value = last_val
ElseIf prev_ttl < 100 Then
din_rng.Interior.Color = vbRed
' en caso de que el usuario haya asiganado porcentajes (el valor debe estar en entero, el script lo convierte en decimal)
ElseIf prev_ttl = 100 Then
' hacer una sumatoria hasta llegar al 100
clls_with_vals = WorksheetFunction.CountA(din_rng)
count_cells_iter = 0
Debug.Print clls_with_vals
din_val = 0
For Each e In din_rng
din_val = din_val + e.Value
If e.Value = "" Then
e.Value = 0
Else
' en caso de que sea solo una celda, esa selda es 100 seguramente
If clls_with_vals = 1 Then
e.Value = WorksheetFunction.Round((e.Value / 100) * o.Value, 0)
' -> lo ando resolviendo
ElseIf clls_with_vals > 1 Then
If count_cells_iter + 1 < clls_with_vals Then
e.Value = WorksheetFunction.Round((e.Value / 100) * o.Value, 0)
count_cells_iter = count_cells_iter + 1
Else: count_cells_iter = clls_with_vals
din_sub_ttl = o.Value - WorksheetFunction.Sum(Range(Cells(o.Row, o.Column + 1), Cells(o.Row, e.Column - 1)))
e.Value = din_sub_ttl
End If
End If
'e.Value = WorksheetFunction.Round((e.Value / 100) * o.Value, 0)
End If
Next e
din_val = 0
End If
Next o
MsgBox "FIN DEL CÁLCUO", vbOKOnly, "PRORRATEO"
End Sub