Macro Llenar una celda dependiendo de fecha

Amgips de TE, quisiera que me apoyen con esta consulta:

Tengo una hoja con muchas columnas, el detalle es que en vez de poner una fórmula, quisiera que mediante una macro llene una condición dependiendo de la fecha, por ahora funciona con esta fórmula:

=SI(O6="","SIN ESTADO",SI(HOY()>O6,"SIN VIGENCIA","VIGENTE"))

me muestra este resultado:

Quisiera que mediante una macro ejecute esa función, trabaja con las columnas 

N= Fecha inicio

O = Fecha fin

P = Condición

Y tengo una hoja con más de 30000 registros y a seguir creciendo =(

2 Respuestas

Respuesta
2

La siguiente macro colocala en un módulo. Luego la ejecutarás cuando la necesites (no indicaste si la querrás dentro de otra macro o a petición).

Lo que hace es buscar la última celda con datos en col O y hasta allí la rellenará.

Sub formulando()
'x Elsamatilde
'se coloca la fórmula en celda P6   --- Atención: ajustar ref
[P6].FormulaR1C1 = _
        "=IF(RC[-1]="""",""SIN ESTADO"",IF(TODAY()>RC[-1],""SIN VIGENCIA"",""VIGENTE""))"
'se arrastra la fórmula hasta la última celda con datos en col O
fini = Range("O" & Rows.Count).End(xlUp).Row
[P6].AutoFill Destination:=Range("P6:P" & fini), Type:=xlFillDefault
'asignar color de fuente -----ajustar a gusto
Range("P6:P" & fini).Font.Color = RGB(41, 255, 168)
End Sub

Hay comentarios en la macro para que ajustes a tu modelo y gusto.

Olvidé pasarlo a valores ;)

Sub formulando()
'x Elsamatilde

'se coloca la fórmula en celda P6 --- Atención: ajustar ref
[P6].FormulaR1C1 = _
"=IF(RC[-1]="""",""SIN ESTADO"",IF(TODAY()>RC[-1],""SIN VIGENCIA"",""VIGENTE""))"
'se arrastra la fórmula hasta la última celda con datos en col O
fini = Range("O" & Rows.Count).End(xlUp).Row
[P6].AutoFill Destination:=Range("P6:P" & fini), Type:=xlFillDefault
'deja solo valores
Range("P6:P" & fini).Copy
Range("P6:P" & fini).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Aplication.CutCopyMode = False

'asignar color de fuente -----ajustar a gusto
Range("P6:P" & fini).Font.Color = RGB(41, 255, 168)
End Sub

Podríamos abreviarla un poco también:

Sub formulando()
'x Elsamatilde
'se coloca la fórmula en celda P6   --- Atención: ajustar ref
[P6].FormulaR1C1 = _
        "=IF(RC[-1]="""",""SIN ESTADO"",IF(TODAY()>RC[-1],""SIN VIGENCIA"",""VIGENTE""))"
'se arrastra la fórmula hasta la última celda con datos en col O
fini = Range("O" & Rows.Count).End(xlUp).Row
[P6].AutoFill Destination:=Range("P6:P" & fini), Type:=xlFillDefault
'deja solo valores y asignar color de fuente -----ajustar a gusto
With Range("P6:P" & fini)
    .Copy
    .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    .Font.Color = RGB(41, 255, 168)
End With
Application.CutCopyMode = False
[P6].Select
End Sub

Sdos!

Muchas gracias Elsa, pero si, efectivamente me olvide de detallar algo, necesito que al insertar la fecha el estado cambie automáticamente la celda "P" y desde el worksheet tengo esta macro que actualiza otra celda poniendo la fecha en la celda "AH" si se realiza algún cambio en el rango indicado (B6:AG1000000), ¿el detalle es que quiero ejecutar la macro que me facilitaste y se cuelga el excel ='( como puedo solucionarlo?

Private Sub Worksheet_Change(ByVal Target As Range)
Application.MoveAfterReturn = False
If Target.Count = 1 Then
If Not Intersect(Target, Range("$B$6:$AG$1000000")) Is Nothing Then
Cells(Target.Row, "AH") = Date
End If
End If
Application.MoveAfterReturn = False

'AQUI LLAMO LA MACRO QUE ESTA EN UN MODULO

Call formulando

End Sub

y se cuelga... gracias.

Además del rango B:¿AG qué otra col debe evaluar la macro? En cuál colocarás la fecha: ¿N u O?

En realidad son 3:

1."P6:P" = "Condición" deber evaluar los 3 estados (Sin estado, vigente y sin vigencia)

2. "AH6:AH" = "Actualización" deberá llenarse en caso de que desde la columna A hasta la AG se haya realizado algún cambo.

3. "AI6:AI" = "Flag" deberá evaluar, si "P" es "Sin estado" o "Inhabilitado" es 0 si es "Vigente" o "Sin vigencia" es 1.

Gracias por la ayuda.

Además de haber cambiado totalmente la consulta inicial agregando 2 opciones más (otros expertos te la harían finalizar aquí y dejar consulta nueva) todavía no estás respondiendo en qué col se ingresará la fecha para luego darle la condición a P. Según tu consulta original tenés 2 col con fechas: N y O ... ¿cuál de ellas corresponde a la que le da la condición a P?

Mil disculpas, tienes toda la razón Elsa, la que validara la P es la O

muchas gracias. =)

Dejo la nueva macro. Utilizo la expresión Range("P" & Target. Row) para poder tener bien en claro qué col se está controlando y es más claro que colocar Cells(Target.Row, 16) x ej.

Nota: la macro se te tildaba porque al modificar la col P nuevamente se estaba ejecutando el evento Change... y así llegaba a un ciclo sin fin.

Private Sub Worksheet_Change(ByVal Target As Range)
'ajustada x Elsamatilde
Application.MoveAfterReturn = False
If Target.Count <> 1 Then Exit Sub
'se controla si hay cambio en col B:AG
If Not Intersect(Target, Range("$B$6:$AG$1000000")) Is Nothing Then
    'ante cualquier cambio se coloca fecha en AH
    Range("AH" & Target.Row) = Date
    'además, si el cambio es en col O se coloca texto en P
    If Target.Column = 15 Then
        'se impide que vuelva a ejecutarse este evento
        Application.EnableEvents = False
        'según el valor de O será el texto en P
        Range("P" & Target.Row).FormulaR1C1 = _
        "=IF(RC[-1]="""",""SIN ESTADO"",IF(TODAY()>RC[-1],""SIN VIGENCIA"",""VIGENTE""))"
        With Range("P" & Target.Row)
            .Copy
            .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False
            .Font.Color = RGB(41, 255, 168)
            Application.CutCopyMode = False
        End With
        'según el resultado en P se coloca valor en AI
        If Range("P" & Target.Row) = "SIN ESTADO" Then      'solo se evaluan los 3 textos colocados en condición anterior
            Range("AI" & Target.Row) = 0
        Else
            Range("AI" & Target.Row) = 1
        End If
        'se vuelven a habilitar los eventos
        Application.EnableEvents = True
    End If
End If
End Sub

Observa que hay una falla en tu solicitud, ya que estás comentando que P puede tener 3 valores posibles: SIN ESTADO, SIN VIGENCIA o VIGENTE.

Pero luego en AI deseas controlar si P tiene valores como INHABILITADO, cuando según condición anterior esto nunca se dará.

Por lo tanto si nuevamente cambiarás algo en esta solicitud te pediré que finalices esta consulta considerando lo entregado hasta aquí y dejes una nueva con todas las aclaraciones.

¡Gracias! Esta perfecto estimada Elsa, y si, tienes razón, existe otra opción que es inhabilitado, solo que eso por el momento lo haré manual ya que es una bd que se esta depurando la info y no queremos eliminar ningún registro, pero si prefiero inhabilitarlo y quede en el historial, así que todo esta excelente, muchas gracias, tema cerrado.


Felices vacaciones.

Respuesta
1

. 07.12.16 #VBA colocar estado por fecha

Buenas, Juan

La siguiente macro escribe esos textos, según la columna que le indiques.

Accede al Editor de VBA (Atajo: Alt + F11), allí inserta un módulo (Insertar-Módulo) y pega el siguiente código:

Sub PoneVIG()
ElRango = "O6:O60000" 'Escribe aquí el rango de FECHAS a evaluar
Application.ScreenUpdating = False
For Each LaCelda In Range(ElRango)
If Len(LaCelda.Offset(0, -1).Value) > 0 Then
    If Len(LaCelda.Offset(0, 0).Value) > 0 Then
        LaCelda.Offset(0, 1).Value = IIf(LaCelda.Offset(0, 0).Value < Date, "SIN VIGENCIA", "VIGENTE")
    Else
        LaCelda.Offset(0, 1).Value = "SIN ESTADO"
    End If
End If
Next
End Sub

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas