Como buscar una fecha en un rango

Cuando deseo buscar un texto en un rango y seleccionar la celda en la que aparece, utilizo el siguiente código:

Range("A2:AX37").Select
    Selection.Find(What:="Hola", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Select

Y funciona perfectamente. Ahora bien, si lo que deseo es buscar una fecha (en el rango mencionado hay columnas de fecha con formato dd/mm/aa y otras de texto), utilizando el mismo código me da el error siguiente: "error 91. Variable de objeto o bloque with no definido"

el código que uso es el mismo, pero cambio el valor a buscar así:

Range("A2:AX37").Select
    Selection.Find(What:="08/03/17", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Select

¿Alguien podría ayudarme a solucionarlo? Había pensado en utilizar buscarv, pero esto me obliga a ir de una en una por las columnas de fecha (ahora solo hay 6, pero puede llegar a haber más y no me interesa ralentizar tanto el proceso...)

2 Respuestas

Respuesta
1

.08.03.17

Buenos días,

En este punto conviene recordar que MS Excel almacena las fechas como un numero entero que representa la cantidad de días transcurridos desde esa fecha y el 01/01/1900, pero lo muestra como 08/03/17. Si borraras el formato a la celda que lo contiene verías 42802.

Dicho esto, puedes usar la función DATEVALUE (ó FECHANUMERO() en la planilla) que convierte un texto que parece fecha a una fecha válida para MS Excel.

En ese caso, la instrucción que usas podría ser como la siguiente:

Range("A2:AX37").Find(What:=DATEVALUE("08/03/17"), After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Select

.

Ante todo gracias por tu pronta respuesta. Lo he intentado, pero me arroja el error 13 en tiempo de ejecución "No coinciden los tipos". He comprobado que los formatos de celdas coincidan, y lo he vuelto a probar, pero sin resultado...

¿Se te ocurre algún otro modo?

Gracias una vez más por tu ayuda.

.

Es curioso porque a mi me funcionó correctamente.

Prueba con este modo simplificado:

Range("A2:AX37").Find(What:=DateValue("08/03/17")).Select

Desde luego, puede ocurrir que no exista esa fecha, en cuyo caso deberías capturar el error y avisarlo.

Sería así:

On Error Resume Next
Range("A2:AX37").Find(What:=DateValue("08/03/17")).Select
If Err.Number <> 0 Then
    MsgBox "Esa fecha no está en el rango indicado", vbCritical, "NO ENCONTRADA"
End If
Err.Clear
On Error GoTo 0

Saludos

Fer

.

Hola otra vez. Pues... tampoco. Me aparece siempre el mensaje advirtiendo que esa fecha no está en el rango indicado, pero sí que está... concretamente en la primera fila del rango...

¿Puede ser por tener otras columnas con un formato general? Quiero decir que la primera columna tiene formato general, la segunda, tercera y cuarta tienen formato personalizado "00" y la quinta y sexta formato fecha "dd/mm/aa"...

Ya no sé por dónde tirar...

Hola otra vez. Acabo de comprobar lo siguiente:

La fecha que busco está concretamente en la celda S2. Ahora bien, esa celda (en realidad todas las de la columna, aumentando el numeral - M3, M4...-) toma el valor como resultado de una fórmula que es la siguiente:

=SI(Y(M2<>"";N2<>"";O2<>"");FECHA(O2;N2;M2);"")

Tiene el formato, como ya he dicho antes, de fecha "dd/mm/aa", pero, parece que no lo identifica como tal.

Si pongo esa misma fecha en una celda en la que no hay ninguna fórmula, lo encuentra sin problemas.

¿Puede ser ese el problema? y, de ser así, ¿Habría forma de solucionarlo?

Gracias una vez más por tu ayuda.

Hola de nuevo. Por fin está solucionado. El problema era, en efecto la fórmula que había puesto en la celda. La solución, sencilla (en mi caso he utilizado el código que me ha pasado Dante Amor puesto que me resultaba más útil para lo que pretendía, pero la solución sería la misma con el tuyo -supongo... XD)

Simplemente, en lugar de poner:

Set b = r.Find(What:=buscando, LookIn:=xlFormulas, LookAt:=xlPart)

he puesto

Set b = r.Find(What:=buscando, LookIn:=xlValues, LookAt:=xlPart)

y ahora sí, funciona perfectamente.

Me gustaría poder votar tus respuestas con un excelente, pero no me permite votarla otra vez. Muchísimas gracias por tu ayuda.

Ah! pues sí, si que puedo...

.

Ok, JP

Me alegro de que tengas resuelto el problema.

Efectivamente, faltaba saber que la fecha era resultante de una fórmula. Siempre pensé que eran fechas como dato.

Por no ver la planilla real, a veces, uno asume cosas como esas y las rutinas no funcionan.

Abrazo
Fer

.

Respuesta
1

H   o  l a:

No importa si en la celda tienes formato de fecha "dd/mm/yy", lo que importa es que en la celda tengas una fecha. Si entonces tienes una fecha, el valor a buscar debería ser "08/03/2017", es decir, debes buscar la fecha completa, pero de la siguiente forma:

Sub Buscar()
'---
'   Por.Dante Amor
'---
    valor = "08/03/2017"
    If IsDate(valor) Then
        buscando = CDate(valor)
    Else
        buscando = valor
    End If
    Set r = Range("A2:AX37")
    Set b = r.Find(What:=buscando, LookIn:=xlFormulas, LookAt:=xlPart)
    If Not b Is Nothing Then
        b.Select
    Else
        MsgBox "La fecha no existe"
    End If
End Sub

Lo que hace la macro es verificar si el valor a buscar es una fecha, si es una fecha entonces convierte ese valor a fecha y lo pone en la variable "buscando", si no es una fecha, entonces simplemente pasa el valor a la variable "buscando"

En el método find se busca con la variable "buscando".


Prueba la macro con cualquier fecha, con algún texto "hola" o con algún número 5, por ejemplo.

Revisa los resultados y me comentas

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas