Изменить формат даты [MS Word] - PullRequest
0 голосов
/ 22 сентября 2018

Мне нужен макрос для изменения формата даты и времени в Word

С: [11:47, 21.09.2017]

До: 21.09.2017, 11: 47 -

У меня есть документ с более чем 9000 строк, которые нужно изменить.Это вообще возможно?Я прочитал несколько вещей, которые позволяют мне изменить дату, но ничего, что позволяет мне изменять дату и время.

Любая помощь будет высоко ценится

Спасибо

То, что у меня есть:

Sub GetDateAndReplace()
Dim FoundOne As Boolean

Selection.HomeKey Unit:=wdStory, Extend:=wdMove
FoundOne = True ' loop at least once

Do While FoundOne ' loop until no date is found
    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "([0-9]{2,2})[:]([0-9]{2,2})[,]([0-9]{1,2})[/]([0-9]{1,2})[/]([0-9]{4})"
        .Format = True
        .Forward = True
        .MatchWildcards = True
    End With

    Selection.Find.Execute Replace:=wdReplaceNone

    ' check the find to be sure it's a date
    If IsDate(Selection.Text) Then
        Selection.Text = Format(Selection.Text, " dd/mm/yyyy, hh:mm")
        Selection.Collapse wdCollapseEnd
    Else ' not a date - end loop
        FoundOne = False
    End If
Loop

End Sub

Но я получаю эту ошибку

Ошибка времени выполнения «6003»: текст «Найти» содержит шаблонСлишком сложное выражение соответствия.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Я провел немного больше исследований и обнаружил ограничение поиска / замены в Word (я использую Office 365, Word 2016).

В предыдущем ответе не учитывался тот факт, что вы также перемещаете внутриДата.

Когда я построил запрос на поиск, в котором дата также транспонировалась по мере необходимости, я получил

"([) (*) (,) (@) (*) (/) (*) (/) (*) (]) "

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

Учитывая текст 123456789A, тогда ищем

"(1) (2) (3) (4) (5) (6) (7) (8) (9)"

отлично работает, но

"(1) (2) (3) (4) (5) (6) (7) (8) (9) (A)"

выходит из строя.

В вашем конкретном случае мы можем уменьшить количество полей поиска до 9, изменив (,) на просто, задав запрос на поиск

"([) (*), (@)(*) (/) (*) (/) (*) (]) "

Это означает, что теперь вы можете перестроить дату с помощью инструкции замены

" \ 6 //\ 4 // \ 8, \ 1 - "

Если вы не смогли упростить свой поиск до 9 полей поиска или меньше, вам потребуется выполнить несколько поисков.В вашем случае первым будет транспонировать время и дату, используя поиск / замену, представленную в предыдущем ответе, а вторым - транспонировать в пределах даты.

В качестве отступления, если вы не можете гарантировать, что естьвсегда один или несколько пробелов после запятой, вы должны выполнить начальный поиск / замену, чтобы добавить пробел после запятой.Это связано с тем, что нет поля поиска, которое работает с 0 или более символами, и предлагаемый запрос поиска будет работать с одним или несколькими пробелами, но не при отсутствии пробелов.

Вы заметите, что в моем запросе поиска яне искать цифры, только разделители.Это означает, что функция «Найти / заменить» будет одинаково хорошо работать с датами, которые имеют названия месяцев, а не номера месяцев, например, 21 / сентябрь / 2017 г.замените и вместо этого используйте методы range while / moveuntil, поскольку у вас есть четко определенное поле, ограниченное [и].Затем можно использовать функцию разделения VBA для создания двух массивов из текста диапазона.Первый разделил бы строку на время и дату, разделив на ',', а второй разделил бы, чтобы получить дату на день, месяц, год, разделив на '/'

0 голосов
/ 23 сентября 2018

Вам действительно не нужны все эти скобки и группирующие скобки вокруг выражений.Тебе даже не нужен макрос.Попробуйте три wildcard операции поиска / замены, где:

Find = ([0-9]{1,2}:[0-9]{2}, )([0-9]/[0-9]{1,2}/[0-9]{4})
Replace = \10\2
Find = ([0-9]{1,2}:[0-9]{2}, [0-9]{2}/)([0-9]/[0-9]{4})
Replace = \10\2
Find = ([0-9]{1,2}:[0-9]{2}), ([0-9]{2}/)([0-9]{2}/)([0-9]{4})
Replace = \3\2\4, \1

Примечание: Если вы используете региональные настройки даты не на английском языке, вам нужно изменить {1,2} до {1; 2}.

Если вы действительно хотите макрос, вы можете использовать:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Forward = True
    .Format = False
    .Wrap = wdFindContinue
    .MatchWildcards = True
    .Text = "([0-9]{1,2}:[0-9]{2}, )([0-9]/[0-9]{1,2}/[0-9]{4})"
    .Replacement.Text = "\10\2"
    .Execute Replace:=wdReplaceAll
    .Text = "([0-9]{1,2}:[0-9]{2}, [0-9]{2}/)([0-9]/[0-9]{4})"
    .Execute Replace:=wdReplaceAll
    .Text = "([0-9]{1,2}:[0-9]{2}), ([0-9]{2}/)([0-9]{2}/)([0-9]{4})"
    .Replacement.Text = "\3\2\4, \1"
    .Execute Replace:=wdReplaceAll
  End With
End With
Application.ScreenUpdating = True
End Sub
...