Допустим, у меня есть длинная строка в ячейке

A: 1/2/15 Школьная собака 20.09.199

B:(3 пробела)1/8/16 School Cat 10/10/10

Я хочу захватить 1/2/15 и 1/8/16

Проблема в том, что первая строка отделена 1 пробелом Вторая строка отделена 3 пробелом

Так для меня

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

myStringArr(1) = 1/2/15

Работает только для первой строки, а не для второй

Что я мог бы использовать вместо условия «один пробел» для разбора строки и захвата 1-й даты каждый раз

2 ответа2

1

Это очень просто, только если структура строки такая.

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
0

Вот решение VBA с использованием Regex. Пользовательская функция принимает два параметра: ссылку на ячейку и номер совпадения. Метод Execute regex возвращает все совпадающие шаблоны, а функция возвращает соответствующее совпадение в соответствии с запросом (если вы хотите вернуть вторую дату во входной строке). Соответствующая дата возвращается как значение даты, но ее можно изменить, чтобы она возвращалась в виде строки, удалив функцию 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

Пример использования: =ExtractDate(A1,2)

Это вернет вторую дату, найденную в строке в ячейке A1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .