Добрый день, форумчане.
Столкнулся с некоторой задачей, которую пока никак не могу решить - возможно Вам покажется проще:
есть некоторая функция (код ниже), которая приводит разномастные значения дат, кварталов к единому виду - "Q YYYY".
Т.е. если у меня прописано в ячейке 30.06.2017 - функция приводит это к значению 2 2017 - т.е. номер квартала и четырехзначный номер года. Аналогично с римским обозначением квартала и т.д.
До сей поры это все у меня работало прекрасно, пока не столкнулся с необходимостью добавить в функцию новые типы данных, а именно
3 месяца YYYY г.?(ода)?
6 месяцев YYYY г.?(ода)?
9 месяцев YYYY г.?(ода)?
Соответственно в функцию я добавил блок
Но функция все-равно не заменяет месяцы на квартал и на выходе я получаю для примера.
3 2017
6 2017
9 2017
Может кто-нибудь подскажет, что делаю не так?
Столкнулся с некоторой задачей, которую пока никак не могу решить - возможно Вам покажется проще:
есть некоторая функция (код ниже), которая приводит разномастные значения дат, кварталов к единому виду - "Q YYYY".
Т.е. если у меня прописано в ячейке 30.06.2017 - функция приводит это к значению 2 2017 - т.е. номер квартала и четырехзначный номер года. Аналогично с римским обозначением квартала и т.д.
До сей поры это все у меня работало прекрасно, пока не столкнулся с необходимостью добавить в функцию новые типы данных, а именно
3 месяца YYYY г.?(ода)?
6 месяцев YYYY г.?(ода)?
9 месяцев YYYY г.?(ода)?
Соответственно в функцию я добавил блок
Код |
---|
'Проверка наличия периодов бух.отчетности re.Pattern = "\D*\d месяц\D*(\d{2,4})\D*" If re.Test(tempString) Then re.Pattern = "9" If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1 re.Pattern = "6" If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1 re.Pattern = "3" If re.Test(tempString) Then tempString = re.Replace(tempString, "1") End If |
Но функция все-равно не заменяет месяцы на квартал и на выходе я получаю для примера.
3 2017
6 2017
9 2017
Может кто-нибудь подскажет, что делаю не так?
Код |
---|
Option Explicit Public Function RgxData(astring As Range) As String Dim re As RegExp, d As Date, s$ Dim tempString Set re = New RegExp re.Pattern = "(-|\г.+|\(|\)| )" re.Global = True re.IgnoreCase = True tempString = re.Replace(astring, "") 'Проверка наличия в строке даты re.Pattern = "\D*(\d\d?)\.(\d\d?)\.(\d{2,4})\D*" If re.Test(tempString) Then RgxData = DatePart("q", DateValue(re.Replace(tempString, "$1.$2.$3"))) & DatePart("yyyy", DateValue(re.Replace(tempString, "$1.$2.$3"))) d = CDate(tempString) - 1 s = DatePart("q", d) & " " & DatePart("yyyy", d) If s <> RgxData Then RgxData = s Exit Function End If 'Проверка наличия периодов бух.отчетности re.Pattern = "\D*\d месяц\D*(\d{2,4})\D*" If re.Test(tempString) Then re.Pattern = "9" If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1 re.Pattern = "6" If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1 re.Pattern = "3" If re.Test(tempString) Then tempString = re.Replace(tempString, "1") End If 'Проверка наличия в строке квартала написаного римской цифрой, буквами латиницы "I" и "V" re.Pattern = "\D*(i{1,3}(?!i)v?(?!v))\D*(кв)?\D+(\d{2,4})\D*" If re.Test(tempString) Then re.Pattern = "iv" If re.Test(tempString) Then tempString = re.Replace(tempString, "4"): GoTo 1 re.Pattern = "iii" If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1 re.Pattern = "ii" If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1 re.Pattern = "i" If re.Test(tempString) Then tempString = re.Replace(tempString, "1") End If 1: 'Проверка наличия в строке квартала написаного арабской цифрой re.Pattern = "\D*(\d)\D*(кв)?\D+(\d{2,4})\D*" If re.Test(tempString) Then RgxData = re.Replace(tempString, "$1 $3") Exit Function End If 'Проверка наличия в строке квартала написаного арабской цифрой re.Pattern = "\D*(\d{4})\D*" If re.Test(tempString) Then RgxData = re.Replace(tempString, "$1") Exit Function End If RgxData = "Период не определен!" End Function |