Macro para repartir valores en columnas

Buenos días. En primer lugar quería agradeceros por la ayuda que nos prestáis. Muchas de mis dudas las he resuelto mirando preguntas de esta web.
Quería plantearos una duda con una macro que me está volviendo loca.
La macro funciona a modo de organizador de trabajo.
En las primeras columnas (B, C) está el nombre del proyecto y el tiempo de actividad que hay que hacer por orden de prioridad.
Luego siguen las columnas de los días del mes en cuestión (1-30, el ejemplo es noviembre). Al final (columnas AH y AI) están las columnas que contabilizan el tiempo invertido en cada actividad.
En las filas 3 a 22 están los proyectos en los que repartiremos el tiempo. En las filas 23 a 25 están otro tipo de días que no cuentan para el trabajo (vacaciones, fin de semana, etc). La fila 26 es la suma del tiempo invertido cada día.
Considerando que el tiempo está en forma de "fracción de jornada laboral", siendo 1 la jornada laboral completa, y sabiendo que la menor división de ese tiempo es una fracción de 0.1, el funcionamiento es el siguiente:
En la columna AI (ColPeso) se pone la fracción de tiempo que suponen las distintas actividades. En las filas 23 a 25, se ponen los días que son festivos y vacaciones (se coloca un 1).
Al apretar el botón "repartir tiempo" lo que hace la macro es lo siguiente: toma el primer día, y comprueba si está completo (por ejemplo, con vacaciones). De ser así, pasa al siguiente día. Si aún no está completo, va añadiendo porciones de 0.1 hasta que bien llegue al final de una tarea, en cuyo caso pasaría a seguir completando tiempo con la siguiente tarea, o bien llegue a finalizar el día (suma 1). Así se van separtiendo las tareas a lo largo de los días.
Bueno, pues el código no me funciona. Depende de los días que tenga que completar, a veces mete 1.1 en cada día, a veces excede el tiempo de cada tarea. Lo malo es que es aleatorio, no he conseguido distinguir ningún patrón de fallo.
De momento hay detalles (como asegurar que el tiempo no excede los días del mes) que dejaré para más adelante.
Disculpad si me he extendido mucho, quería que estuviera claro el caso.
Aquí dejo el código, y si alguien lo necesita, puedo adjuntar el archivo. Muchísimas gracias por adelantado.
Sub RepartirTiempo()
Dim Dia As Integer 'columna
Dim Fila As Integer
Fila = Range("FilaIni").Row 'se coloca en el primer proyecto
For Dia = Range("ColIni").Column To Range("ColFin").Column 'repasa todos los días
    If ActiveSheet.Cells(Range("FilaSuma").Row, Dia).Value <> 1 Then 'sólo se mete en el bucle si el día está incompleto
        Do While ActiveSheet.Cells(Range("FilaSuma").Row, Dia).Value < 1
            If ActiveSheet.Cells(Fila, Range("ColSuma").Column).Value < _
            ActiveSheet.Cells(Fila, Range("ColPeso").Column).Value Then
            ActiveSheet.Cells(Fila, Dia).Value = ActiveSheet.Cells(Fila, Dia).Value + 0.1            Else
            Fila = Fila + 1
            End If
        Loop
    End If
Next Dia
End Sub
1

1 Respuesta

165.850 pts. Más de 35 años en la informática y más de 20 trabajando...
Se me ocurre que puedes estar sufriendo uno de los problemas que tiene el maravilloso Windows que dice que: uno más uno no siempre son dos.
Me explico.
Hay veces que sumas 0.1+0.9 y el resultado es 0.999999 o 1.0000001. Para evitar este fallo te aconsejaría que no compares directamente con 1 sino que el valor absoluto de la diferencia entre el valor y uno sea menor que 0.00001 (por ejemplo). En tu código quedaría así:
If abs(ActiveSheet.Cells(Range("FilaSuma").Row, Dia).Value - 1)>0.00001 Then
Do While (ActiveSheet.Cells(Range("FilaSuma").Row, Dia).Value - 1) <0.00001
No he mirado la lógica del proceso que has puesto, por lo que no puedo ni afirmar ni descartar que pueda tener algún problema.
Lo que te planteo es una posibilidad que a mi me ha pasado bastantes veces y por eso es lo primero que habría que descartar.
Ya me dirás algo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas