Escribí una función simple para extraer la fecha de las celdas. Tengo algunas celdas que contienen cadenas "5-Oct-2018" y otras celdas que contienen "2018/10/10 Textos aleatorios". Quiero truncar los textos aleatorios y también convertir el resto de cadenas en fechas con el mismo formato.

Dado que los textos aleatorios solo aparecen cuando la cadena tiene> 10 caracteres o más, decidí truncar todo a la derecha.

Escribí lo siguiente, pero sigue atascado en esta línea "FnDateExtract = Format (CDate (RawExtract)," aaaa / mm / dd ")" que dice Type Mismatch. ¿Qué estoy haciendo mal?

Function FnDateExtract(fnFile, fnTab, fnRow, fnColumn) As Date
    Dim RawExtract As String
    With Workbooks(fnFile).Worksheets(fnTab)
        RawExtract = .Cells(fnRow, fnColumn).Text
        If Len(RawExtract) > 10 Then RawExtract = Left(RawExtract, 10)
        FnDateExtract = Format(CDate(RawExtract), "yyyy/mm/dd")
    End With
End Function
1
André Tân 16 oct. 2018 a las 16:05

2 respuestas

La mejor respuesta

Su función se ve bien, solo necesita hacer algunos cambios menores:

Function FnDateExtract(fnFile, fnTab, fnRow, fnColumn) As Date
    Dim RawExtract As String
    With Workbooks(fnFile).Worksheets(fnTab)
        RawExtract = Left(CStr(.Cells(fnRow, fnColumn).Text), 10)
        FnDateExtract = CDate(Format(RawExtract, "yyyy/mm/dd"))
    End With
End Function

Se movió CDate() fuera de la función Format() para establecer el tipo de retorno en Date

También tenga en cuenta que puede usar InStr(*string*, " ") - 1 en lugar de 10 con la función Left() para tomar la cadena de fecha. Puede ser más preciso en determinadas situaciones.

3
Kubie 16 oct. 2018 a las 13:49

Parece que tiene datos que no se pueden convertir en fechas. Eso significa que debe hacer que su código sea más robusto. Una primera versión podría verse así

Function FnDateExtract(fnFile, fnTab, fnRow, fnColumn) As Date
Dim RawExtract As String
    With Workbooks(fnFile).Worksheets(fnTab)
        RawExtract = .Cells(fnRow, fnColumn).Text
        If Len(RawExtract) > 10 Then RawExtract = Left(RawExtract, 10)

        If IsDate(RawExtract) Then
            FnDateExtract = CDate(Format(RawExtract, "yyyy/mm/dd"))
        Else
            FnDateExtract = vbEmpty
        End If

    End With

End Function

En una versión más mejorada, uno definiría correctamente los parámetros, tal vez así

Function FnDateExtract(ByVal fnFile As String, ByVal fnTab As String, _
                    ByVal fnRow As Long, ByVal fnColumn As Long) As Date

La función aún se puede interrumpir fácilmente ya que asume que tiene un libro de trabajo llamado fnFile con una hoja fnTab. La forma más fácil (quizás también rápida y sucia) de manejar esto es agregar un controlador de errores.

Entonces la segunda versión podría verse así

Function FnDateExtract(ByVal fnFile As String, ByVal fnTab As String, _
                    ByVal fnRow As Long, ByVal fnColumn As Long) As Date
Dim RawExtract As String

On Error GoTo EH

    With Workbooks(fnFile).Worksheets(fnTab)
        RawExtract = .Cells(fnRow, fnColumn).Text
        If Len(RawExtract) > 10 Then RawExtract = Left(RawExtract, 10)
        If IsDate(RawExtract) Then
            FnDateExtract = CDate(Format(RawExtract, "yyyy/mm/dd"))
        Else
            FnDateExtract = vbEmpty
        End If
    End With

    Exit Function

EH:
    FnDateExtract = vbEmpty

End Function
1
Storax 16 oct. 2018 a las 14:16