Calcular entre fechas dando como resultado otra si se cumple una condición

Por mi parte llevo horas dándole la vuelta y no es que no de con el código, es que no veo la manera matemáticamente de hacerlo.

Tengo que realizar los cálculos sobre dos fechas, el primer y ultimo día de un mes. Por ejemplo:

F_Inicio           F_Fin
01/10/2017   31/10/2017

Luego tengo una tabla donde a través de un formulario da de alta los vehículos que llegan.

Matricula Marca Modelo Renting Seguro Cuota Mes F_Recepción Fecha_Devolución
0126MMM RENAULT KANGOO ALD ZURICH 300,00 € 02/10/2017
0188MMM RENAULT KANGOO ALD ZURICH 300,00 € 01/08/2016
0529MMM RENAULT KANGOO ALD ZURICH 300,00 € 26/09/2014

En esta otra tabla tenemos los conductores que asigno, también a través de un formulario.

Matricula Nombre Y Apellidos Empresa F_Entrega F_Devolucion
0126MMM LUIS PEREZ PEREZ    XXXX      08/10/2017  13/10/2017
0126MMM JOSE HERNANDEZ    XXXX     13/10/2017
0529MMM JAVIER RUIZ RUIZ XXXX 26/01/2017

Y aquí es donde viene lo complicado. Necesito ajustar los costes de cuotas de los días en los que los vehículos llegaron pero no tenían conductor asignado, ya que estaban parados en la calle. Lo que hago es que al primer conductor le añado el coste.

Matricula Nombre Y Apellidos Empresa F_Entrega F_Devolucion F_IncioCALC
0126MMM LUIS PEREZ PEREZ     XXXX        08/10/2017  13/10/2017       01/10/2017
0126MMM JOSE HERNANDEZ XXXX 13/10/2017

En el ejemplo vemos que el vehículo 0126MMM se le entregó a este señor (ficticio) el día 8/10 pero he creado un campo llamado F_InicioCALC en el que quiero que en este caso aparezca el día de inicio, en este caso el 01/10/2017. Lo puede hacer en este campo nuevo o simplemente cambiar el de F_Entrega y en vez de poner 08/10 poner 01/10.

Y así recorriendo esta tabla de movimientos del mes.

Creo que es bastante complicado y no se si he sido capaz de explicarme bien.

2 Respuestas

Respuesta
2

No entendí muy bien qué necesitas. Quieres ayuda sobre los cálculos de costes, o nada más ayuda para crear la fecha en el campo nuevo.

Solamente para establecer en qué necesitas ayuda.

Si es para calcular la fecha en el campo nuevo " F_InicioCALC", ¿siempre debe poner el primer día del mes?

En tu ejemplo en la celda D2 tendrías la fecha 08/10/2017

Si pones la siguiente fórmula en la celda F2 tendrías las fecha 01/10/2017

=FECHA(AÑO(D2);MES(D2);1)

En vba el código sería:

Range("F2").FormulaR1C1 = "=DATE(YEAR(RC[-2]),MONTH(RC[-2]),1)"

Si lo quieres para toda la columna F:

    With ragne("F2:F" & Range("D" & Rows.Count).End(xlUp).Row)
        .FormulaR1C1 = "=DATE(YEAR(RC[-2]),MONTH(RC[-2]),1)"
    End With

O es algo que no vi.

Explícame si es algo más.

Hola Dante.

Gracias por tan rápida respuesta.

No me he explicado bien. Te cuento. Se trata de lo siguiente. Tengo unos vehículos que me llegan de un renting en una fecha, por ejemplo el día 03/10. Estos vehículos están parados sin conductor unos días. Ahora por ejemplo el día 08/10 les asigno un conductor. A nivel interno cuando quiero desglosar el coste de la cuota de alquiler del vehículo lo que hago es que los vehículos que han llegado en el período que hago el cálculo, por ejemplo en este caso sería del 01/10 al 31/10 (estas fechas ya existen en dos variables), los primeros días que no han tenido conductor, se los computo al primer conductor. SOLO en el caso de que hayan llegado durante el periodo que estoy haciendo el calculo.

Es decir, a este vehículo aunque lo haya asignado a un conductor el día 08/10 quiero imputarle el coste a ese conductor desde el día 03/10. En el ejemplo veías varios conductores en el mismo período, pero solo se lo imputo al primer conductor. Por eso he añadido un campo adicional al de la fecha real de entrega al conductor que se llama F_InicioCALC, solo para el caso que se cumpla esa condición, vehículo nuevo sin conductor.

No se si ahora lo he explicado mejor o como lo tengo tan vivo todos los días me resulta difícil explicarlo correctamente.

Gracias.

Sigo sin entender en qué quieres ayuda.

Quieres ayuda en obtener una fecha o en obtener los cálculos de costes.

Tienes que terminar tu ejemplo. O pon 3 ejemplos para entender en qué quieres ayuda.

Otra cosa más, quieres ayuda con una fórmula o con una macro.

Para que tus ejemplos sean más claros, pon imágenes

Buenas noches Dante. Voy a intentar explicarme con imágenes.Primero aclara que quiero obtener una fecha con una macro. Comienzo.

Tengo en la Hoja "PanelPrincipal" en las celdas "A2" y "B2" estos datos. Las fechas inicio y fin de un periodo a calcular.

Tengo una hoja donde a través de un Form introduzco los datos de los vehículos nuevos que alquilo. Es decir, vienen del renting y los doy de alta. La hoja se llama "AltaVehiculos"

Después tengo otra tabla donde a través de otro Form doy de alta los conductores. Es decir, un coche lo alquilo y luego le asigno un conductor, que no tienen por qué ser el mismo día que llega el coche a mi empresa. A esta tabla la llamo "Conductores"

Y ahora tengo por último una tabla que es donde quiero actuar. Esta a través de macros ya la he rellenado con los datos de los conductores que han tenido un vehículo en el periodo de F_Inicio y F_Fin que decía al principio. Esta tabla se llama "MovimientosPeriodo"

Lo que quiero es lo siguiente. Fíjate en el vehiculo 0126MMM. Este lo di de alta el día "02/10/2017", como reza en la tabla "AltaVehiculos". Sin embargo si ves en la tabla Conductores no tuvo a ningun conductor asignado hasta el día "08/10/2017". Hay 6 días al principio sin conductor. Lo que quiero es que en el caso en que haya un vehículo de alta entre la fecha inicio y fecha fin, es decir que sea nuevo en el periodo de calculo, que en la tabla movimientos en el campo F_InicioCALC le ponga SOLO al primer conductor, la fecha de llegada del vehículo, es decir el día 02/10/2017. Si en esta tabla de movimientos aparecen más conductores con la misma matrícula el único que debe tener esa fecha en ese campo debe ser el de la fecha inferior, el mas cercano a la fecha de llegada del vehículo a la empresa.

Ya se que es un lío, y por lo que veo no estoy muy hábil en explicarlo.

Gracias!!

Ya te entendí, solamente un detalle, en tu redacción mencionas que debo poner la fecha "02/10/2017", esa fecha la obtengo de la hoja "AltaVehiculos", ¿es correcto?

Lo que pasa es que, en la imagen de tu ejemplo, pusiste "01/10/2017"

Solamente confirma cuál es la fecha que se debe poner.


Desafortunadamente en tus ejemplos no veo las filas ni las columnas, así que debo asumir que todo empieza en la columna A y en la fila 1.

Lo que va a hacer la macro, cada que la ejecutes, es calcular todos los resultados del campo F_InicioCALC, es decir, borra toda la columna y la vuelve a poner, ya que pueden existir registros nuevos.

Bueno, intenta lo siguiente ejecuta la siguiente macro. Cambia "tabla" y "AltaVehiculos" por los nombres de tus hojas. Crea una nueva hoja y la llamas "Temp"

Sub Poner_Fecha()
'Por.Dante Amor
    '
    Set h1 = Sheets("Tabla")            'hoja con la tabla donde quieres actuar
    Set h2 = Sheets("AltaVehiculos")    'hoja alta vehiculos
    Set h3 = Sheets("Temp")             'hoja temporal
    '
    h1.Range("F2:F" & Rows.Count).ClearContents
    h3.Cells.Clear
    h1.Columns("A").Copy h3.Range("A1")
    u3 = h3.Range("A" & Rows.Count).End(xlUp).Row
    h3.Range("A1:A" & u3).RemoveDuplicates Columns:=1, Header:=xlYes
    '
    u3 = h3.Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To u3
        wmin = CDate("31/12/9999")
        matricula = h3.Cells(i, "A")
        Set r = h1.Columns("A")
        Set b = r.Find(matricula, lookat:=xlWhole)
        If Not b Is Nothing Then
            celda = b.Address
            Do
                'detalle
                If wmin > h1.Cells(b.Row, "D") Then
                    wmin = h1.Cells(b.Row, "D")
                    fila = b.Row
                End If
                Set b = r.FindNext(b)
            Loop While Not b Is Nothing And b.Address <> celda
        End If
        '
        'fecha recepción
        fecrec = ""
        Set b = h2.Columns("A").Find(matricula, lookat:=xlWhole)
        If Not b Is Nothing Then
            fecrec = h2.Cells(b.Row, "G")
        End If
        h1.Cells(fila, "F") = fecrec
    Next
    MsgBox "Fin"
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Hola Dante, gracias por tan rápida respuesta.

Antes de probar la macro, decirte que la fecha correcta es "02/10/2017". Cuando la pegué en el ejemplo me equivoqué y puse mal "01/10/2017".

¿Puedo probar la macro o necesitabas confirmar antes este dato?

Gracias.

Prueba la macro.

Solamente actualiza los nombres de las hojas, espero que todas las hojas tengan en la columna "A" la matrícula y que los encabezados estén en la fila 1 y los datos empiecen en la fila 2.

Respuesta
1

No entiendo muy bien lo que expones, pero prueba a poner condicional para que te de el resultado si te pone en la casilla que tiene o no conductor asignado y te devuelva la operación que quieres.

Suerte amigo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas