Конвертировать месяц в формате String в число в макросах Word - PullRequest
2 голосов
/ 10 марта 2019

Я работаю с макросом Word, который должен преобразовать дату в другой формат.

вход: 10 марта 2019 года

ожидаемый выход: 10/03/2019

Проблема заключается в том, что месяц даты указан в строке (10 de Marzo de 2019). Я не могу найти способ конвертировать эту дату в дд / мм / ГГГГ.

Все, что я нашел, конвертируется из дд-мм-ГГГГ в текстовую дату

Приведенный выше код работает для преобразования из дд / мм / гггг в дату с указанием строки месяца или других форматов, но он никогда не входит в функцию isDate (). Если я удалю функцию isDate (), формат не будет выполнен.

Это то, что я имею до сих пор:

Sub ChangeDates()

FoundOne = True ' loop at least once

Do While FoundOne ' loop until no date is found
    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "([0-9]{1,2}) de (*) de ([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")
        Selection.Font.Color = wdColorLightOrange
        Selection.Collapse wdCollapseEnd
    Else ' not a date - end loop
        FoundOne = False
    End If
Loop

End Sub

Есть ли способ достичь этого? Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 11 марта 2019

Попробуйте:

Sub Demo()
Application.ScreenUpdating = False
Dim i As Long
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<[0-9]{1,2} de <*> de [0-9]{4}>"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute
  End With
  Do While .Find.Found
    Select Case LCase(Split(.Text, " de ")(1))
      Case "enero": i = 1
      Case "febrero": i = 2
      Case "marzo": i = 3
      Case "abril": i = 4
      Case "mayo": i = 5
      Case "junio": i = 6
      Case "julio": i = 7
      Case "agosto": i = 8
      Case "septiembre": i = 9
      Case "octubre": i = 10
      Case "noviembre": i = 11
      Case "diciembre": i = 12
      Case Else: i = 0
    End Select
    Select Case i
      Case 0
      Case Else: .Text = Split(.Text, " de ")(0) & "/" & Format(i, "00") & "/" & Split(.Text, " de ")(2)
    End Select
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub
1 голос
/ 10 марта 2019

Чтобы Word-VBA распознал дату, данные должны соответствовать системным настройкам даты. Например, если настройки системы указаны на английском и американском языках, дата в вопросе не будет признана действительной, будут считаться только даты на английском и американском языках.

Код VBA должен включать логику для разбора текстового содержимого как даты на определенном языке. Затем необходимо либо преобразовать это значение в дату, совпадающую с системной датой, чтобы работала функция Format ИЛИ также потребовалось бы также позаботиться о преобразовании формата.

0 голосов
/ 12 марта 2019

Я пробовал @macropod и, несмотря на то, что он не работает для меня, я знаю, что его решение действительно (возможно, некоторые проблемы с языком в Word), некоторые изменения должны заставить его работать, так что не стесняйтесь использовать его тоже.

Я пошел с предложением @Cindy Meister, и это код.Недостаток этого подхода заключается в том, что вам нужно выполнить два поиска вместо одного, но преимущество заключается в том, что вы используете встроенную функцию Word Format и можете изменить формат в любое время.

Private Sub FechasEnTexto()

'We take the date to english format (dd M, Y)
With ActiveDocument.Range.Find
     .Text = "([0-9]{1,2}) de (*) de ([0-9]{4})"
     .Replacement.Text = "\1 \2, \3"
     .Forward = True
     .MatchWildcards = True
     .Execute replace:=wdReplaceAll
End With


'Here we look for the english format, and proceed to apply the format desired.   
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]{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")
        Selection.Collapse wdCollapseEnd
    Else ' not a date - end loop
        FoundOne = False
    End If
Loop


End Sub
0 голосов
/ 10 марта 2019

Николас, возможно, используя NumberFormat перед вашим оператором IF.Таким образом, вы устанавливаете формат так, чтобы выражение IsDate читалось как True, поэтому ваше условие IF будет выполнено.

Selection.NumberFormat = "dd-mm-yyyy"
If IsDate(Selection.Text) Then
    Selection.Text = Format(Selection.Text, "dd-mm-yyyy")
    Selection.Font.Color = wdColorLightOrange
    Selection.Collapse wdCollapseEnd
Else ' not a date - end loop
    FoundOne = False
End If
...