Necesito una Macro que utilice IF con dos condiciones

Estoy programando una macro que me calcule lo siguiente:

Tengo diferentes fechas asociadas a un código, tal como se ve en la imagen en las columnas A (código) y B (fecha). Necesito que la macro me asigne para cada código de la columna D (son los mismos de la columna A luego de quitar duplicados), el valor de la fecha mas reciente que SUPERE mi fecha límite, ingresada en la columna H fila 2. Hasta el momento esto lo estoy logrando con el código que adjunto al final de la descripción. Sin embargo cuando un código de la columna A no contiene fechas que superen mi fecha limite (es decir no cumplen con mi condición impuesta en el IF), la macro deja de trabajar y no avanza a la siguiente celda para realizar el mismo trabajo con el código siguiente.

La siguiente macro funciona bien mientras todos los códigos de la columna A tengan almenos una fecha que supere la fecha limite y de esta manera cumpla la condición.

Lo que necesito es que cuando no se cumpla la condición (por ejemplo con el código 569) la macro siga trabajando para calcular la fecha del siguiente código.

La macro que tengo es la siguiente:

Sub FormulaFechaVencimiento()

nBase = ThisWorkbook.Name

x = 2
y = 2

Do While Workbooks(nBase).Worksheets("Hoja1").Cells(y, 1) <> ""

If Workbooks(nBase).Worksheets("Hoja1").Cells(x, 4) = Workbooks(nBase).Worksheets("Hoja1").Cells(y, 1) And Workbooks(nBase).Worksheets("Hoja1").Cells(y, 2) > Workbooks(nBase).Worksheets("Hoja1").Cells(2, 8) Then
Workbooks(nBase).Worksheets("Hoja1").Cells(x, 5) = Workbooks(nBase).Worksheets("Hoja1").Cells(y, 2)
x = x + 1
Else
y = y + 1

End If
Loop

1 Respuesta

Respuesta
1

Puede ser sin utilizar for:

Sub Macro2()
    ua = Range("A" & Rows.Count).End(xlUp).Row
    ud = Range("D" & Rows.Count).End(xlUp).Row
    With Range("E2:E" & ud)
        .FormulaR1C1 = _
            "=IF(SUMPRODUCT(MAX((R2C1:R" & ua & "C1=RC4)*(R2C2:R" & ua & "C2>R2C8)*(R2C2:R" & ua & "C2)))=0," & _
            """"", SUMPRODUCT(MAX((R2C1:R" & ua & "C1=RC4)*(R2C2:R" & ua & "C2>R2C8)*(R2C2:R" & ua & "C2))))"
        .Value = .Value
    End With
End Sub

Lo que hace es poner una fórmula en la columna D para obtener la fecha máxima y que sea mayor a la fecha de la celda H2.


O puede ser con For, pero debes utilizar 2, uno para recorrer las celdas de la columna D y otra para recorrer las celdas de la columna A

Sub Poner_Fecha()
    For i = 2 To Range("D" & Rows.Count).End(xlUp).Row
        For j = 2 To Range("A" & Rows.Count).End(xlUp).Row
            If Cells(j, "A").Value = Cells(i, "D").Value Then
                If Cells(j, "B").Value > Range("H2") Then
                    Cells(i, "E").Value = Cells(j, "B").Value
                End If
            End If
        Next
    Next
End Sub

[' Si es lo que necesitas. No olvides valorar la respuesta. 

¡Gracias!

Estoy probando con la segunda macro que me enviaste, sin embargo al aplicarlo en la planilla de cuadro de pagos real (que contiene 52.000 fechas aprox), el programa se queda pegado.

¿Existirá alguna manera de hacer más eficiente el código?

Gracias de todas maneras.

Estimado Dante Amor

Adicionalmente, la macro me esta arrojando la fecha más lejana que cumple las condiciones, y yo necesito la fecha más reciente. Es decir la primera fecha que supere mi fecha límite.

¿Cómo se podrá solucionar esto?

Muchas gracias de antemano.

Si los datos están ordenados por clave y fecha, entonces después de esta línea:

Cells(i, "E").Value = Cells(j, "B").Value

Pon esta línea

Exit for

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas