2015-02-12 2 views
-1

У меня есть плоский файл (текстовый файл), имеющий непрерывные данные. Мне нужно написать макрос, чтобы подтвердить дату в этом тексте (со смещения 7 до 15). Функция Is Date() требует, чтобы входной сигнал находился в формате year/mm/dd, но все, что у меня есть, - это плоский файл, как указано выше. есть ли какое-либо решение для этого в пакетном сценарии или макросе excel. пожалуйста помоги.Проверка даты в текстовом файле с использованием макросов vba

Текстовый файл выглядит следующим образом:

aaaaa 20130202 rt bbbbb 20080210 lt cccccc 20150815 gf 
+0

Просьба указать пример текста в файле и то, что вы хотите определить как правильную или неправильную дату? Также, что вы хотите сделать с этим файлом, просто проверьте его на наличие ошибок или загрузите в Excel для дальнейшего анализа? В последнем случае функция рабочего листа может выполнить эту работу. – nekomatic

+0

текстовый файл выглядит следующим образом: – shruthi

+0

ааааа 20130202 к.т. BBBBB 20080210 л CCCCCC 20150815 гс – shruthi

ответ

0

Моя первая мысль пошла в регулярные выражения (RegEx) в качестве возможного решения этой проблемы, так как извлечение даты могут быть в противном случае проблематичными.

Там какая-то большая информация о том, как использовать регулярные выражения в Excel здесь: How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops

я ударил вместе быстро подпрограмму, чтобы проверить простое регулярное выражение, ищущее формат даты вы представили. Это предполагает, что в тестируемой строке нет других числовых символов. Вам нужно будет добавить ссылку на регулярные выражения MS VB (приведенная выше ссылка показывает, как). ПРИМЕЧАНИЕ. Я намеренно установил ошибочную дату «20121313» для проверки функциональности.

Sub doDates() 

    Dim strInput As String 
    Dim strPattern As String 
    Dim strDate As String 
    Dim regEx As New RegExp 

    strInput = "aaaaa 20121313 rt bbbbb 20080210 lt cccccc 20150815 gf" 

    strPattern = "([0-9]){4}([0-9]){2}([0-9]){2}" 

    With regEx 
     .Global = True 
     .MultiLine = False 
     .IgnoreCase = False 
     .Pattern = strPattern 
    End With 

    Set collResult = regEx.Execute(strInput) 

    For Each testDate In collResult 
     strDate = Mid(testDate, 5, 2) & "/" & Right(testDate, 2) & "/" & Left(testDate, 4) 
     If Not IsDate(strDate) Then 
      MsgBox ("Bad date found: """ & strDate & """") 
      Exit Sub 
     End If 
    Next 

    MsgBox ("All dates test ok") 

End Sub 
+0

oh, а strPattern = "([0-9]) {8}" работает так же хорошо – Porcupine911

0

Преобразовать в YYYY-MM-DD затем тест:

strLine = "cccccc 20150815 gf" 
strDate = Mid$(strLine, 8, 4) & "-" & Mid$(strLine, 12, 2) & "-" & Mid$(strLine, 14, 2) 

If IsDate(strDate) Then ... 
+0

Пример OP предполагает, что первое поле не всегда одинаковой ширины - возможно, потребуется использовать 'split', чтобы получить поле даты в своей строке, а затем применить к нему этот ответ. – nekomatic

+0

ya ... это помогло. Спасибо – shruthi

Смежные вопросы