Analizar una cadena para agregar a una matriz

0

Digamos que tengo una cadena larga en una celda

A: 1/2/15 perro de escuela 20/09/19

B: (3 espacios) 1/8/16 School Cat 10/10/10

Quiero capturar 1/2/15 y 1/8/16

El problema es que la primera cadena está separada por 1 espacio, la segunda cadena está separada por 3 espacios

Entonces para mi

myStringArr = Split(myString,” “) 
MsgBox myStringArr(1)

myStringArr(1) = 1/2/15

Solo funciona para la primera cadena, no para la segunda cadena

¿Qué podría usar en lugar de la condición de "espacio único" para analizar la cadena y capturar la primera fecha cada vez

Arrendajo
fuente
Suponiendo que tiene cadenas que comienzan con datos de Fechas, puede usar la función Trim VBA para eliminar los espacios iniciales de las cadenas y luego seguir su enfoque.
patkim
También puedes usar expresiones regulares para ello. stackoverflow.com/questions/22542834/…
Máté Juhász

Respuestas:

1

Esto es bastante simple, solo si la estructura de la cadena es así.

dim tmp() as Variant
dim left_date, right_date as string
for each DatesinString in StringArray
    tmp = split(LTrim(DatesinString), " ")
    left_date = tmp(0)
    right_date = tmp(Ubound(tmp))

next DatesinString
dmb
fuente
0

Aquí hay una solución VBA usando Regex. La función definida por el usuario toma dos parámetros: referencia de celda y número de coincidencia. El método regex Execute devuelve todos los patrones coincidentes, y la función devuelve la coincidencia apropiada según lo solicitado (en caso de que desee devolver la segunda fecha en la cadena de entrada). La fecha coincidente se devuelve como un valor de fecha, pero esto podría modificarse para que se devuelva como una cadena eliminando la función CDate ().

Function ExtractDate(rng As Range, matchNum As Integer) As Variant
    Dim matches As Object
    Dim target As Variant
    Dim regex As Object

    Set regex = CreateObject("VBScript.RegExp")

    With regex
        .Pattern = "(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/[0-9]{2}"
        .Global = True
    End With

    Set matches = regex.Execute(rng.Value)

    If matchNum > 0 And matchNum <= matches.Count Then
        target = CDate(matches.Item(matchNum - 1).Value)
    Else
        target = CVErr(xlErrNA)
    End If

    ExtractDate = target
End Function

Ejemplo de uso: =ExtractDate(A1,2)

Esto devolverá la segunda fecha encontrada en la cadena en la celda A1

Rob Gale
fuente