Добрый день! Прошу помочь в следующем вопросе. Есть строка в текстовом формате с текстом вида
Код
50+845-2,5%-70
Как можно преобразовать строку, чтобы
Код
-2,5%
изменилось на
Код
*0,975
? Перед числом с процентом может быть как + так и -, само число может быть как целое, так и дробное. При поиске на форуме встречались функции uuu, которые делают схожие действия, но моих знаний не хватает для того, чтобы переделать под свои нужды.
Для полной картины вкратце опишу всю работу. Пользователь вводит данные в строку вида
Код
40+800коля-40вася+100-80+10-4%+800+3%
Возможности заставить вводить нормально нет) Далее для удаления русских букв я использую функцию: [vba]
Код
Function uuu$(t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "[А-ЯЁ]+" uuu = .Replace(t, "") End With End Function
[/vba]Потом для произведения арифметических операций функцию: [vba]
Код
Public Function fnEvaluate( _ ByRef rng As Range) fnEvaluate = Application.Evaluate(Replace(rng.Value, ",", ".")) End Function
[/vba]Но эта фукция если видит %, то делит радом стоящее число на 100, и соответственно не верный итог
Добрый день! Прошу помочь в следующем вопросе. Есть строка в текстовом формате с текстом вида
Код
50+845-2,5%-70
Как можно преобразовать строку, чтобы
Код
-2,5%
изменилось на
Код
*0,975
? Перед числом с процентом может быть как + так и -, само число может быть как целое, так и дробное. При поиске на форуме встречались функции uuu, которые делают схожие действия, но моих знаний не хватает для того, чтобы переделать под свои нужды.
Для полной картины вкратце опишу всю работу. Пользователь вводит данные в строку вида
Код
40+800коля-40вася+100-80+10-4%+800+3%
Возможности заставить вводить нормально нет) Далее для удаления русских букв я использую функцию: [vba]
Код
Function uuu$(t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "[А-ЯЁ]+" uuu = .Replace(t, "") End With End Function
[/vba]Потом для произведения арифметических операций функцию: [vba]
Код
Public Function fnEvaluate( _ ByRef rng As Range) fnEvaluate = Application.Evaluate(Replace(rng.Value, ",", ".")) End Function
[/vba]Но эта фукция если видит %, то делит радом стоящее число на 100, и соответственно не верный итог
встречались функции uuu, которые делают схожие действия
Попробуйте так [vba]
Код
Function uuu$(t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "[+-]\d{1,2},?\d?%" uuu = .Replace(t, "*0,975") End With End Function
[/vba]
Цитата
встречались функции uuu, которые делают схожие действия
Попробуйте так [vba]
Код
Function uuu$(t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "[+-]\d{1,2},?\d?%" uuu = .Replace(t, "*0,975") End With End Function
Спасибо! Теперь понятно как найти число возле % со знаком + или - Но в формуле у Вас оно жестко заменятся на 0,975. А необходимо заменить на: если +x%, то на *(x/100+1) если -x%, то на *-(x/100-1) где x число перед процентом. Подскажете?
Спасибо! Теперь понятно как найти число возле % со знаком + или - Но в формуле у Вас оно жестко заменятся на 0,975. А необходимо заменить на: если +x%, то на *(x/100+1) если -x%, то на *-(x/100-1) где x число перед процентом. Подскажете?Chikitonik
Сообщение отредактировал Chikitonik - Пятница, 25.08.2017, 16:17
Function uuu$(ByVal t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "([+-]\d{1,2},?\d?)%" Set objMatches = .Execute(t) For i = 0 To objMatches.Count - 1 Set objMatch = objMatches.Item(i) t = Replace(t, objMatch.Value, "*" & CStr(1 + CDbl(objMatch.SubMatches(0)) / 100)) Next uuu = t End With End Function
[/vba]
Так? [vba]
Код
Function uuu$(ByVal t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "([+-]\d{1,2},?\d?)%" Set objMatches = .Execute(t) For i = 0 To objMatches.Count - 1 Set objMatch = objMatches.Item(i) t = Replace(t, objMatch.Value, "*" & CStr(1 + CDbl(objMatch.SubMatches(0)) / 100)) Next uuu = t End With End Function
Function uuu$(t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "\+(\d{1,2},?\d?)%" If .test(t) Then uuu = .Replace(t, "*($1/100+1)") End If .Pattern = "-(\d{1,2},?\d?)%" If .test(t) Then uuu = .Replace(t, "*-($1/100-1)") End If End With End Function
[/vba]
[vba]
Код
Function uuu$(t$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "\+(\d{1,2},?\d?)%" If .test(t) Then uuu = .Replace(t, "*($1/100+1)") End If .Pattern = "-(\d{1,2},?\d?)%" If .test(t) Then uuu = .Replace(t, "*-($1/100-1)") End If End With End Function
Kuzmich, ваш код значительно проще для моего понимания, и с -x% он работает как надо, но с +x% почему-то не работает. Притом, что если закомментировать строки где обрабатывается значение с -x%, то работает)))
Kuzmich, ваш код значительно проще для моего понимания, и с -x% он работает как надо, но с +x% почему-то не работает. Притом, что если закомментировать строки где обрабатывается значение с -x%, то работает)))Chikitonik
Function Мяв$(s$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "([+-]\d{1,2},?\d?)%" If .test(s) Then Мяв = .Replace(s, "*" & 1 + CDbl(.Execute(s)(0).SubMatches(0)) / 100) End If End With End Function
[/vba] [offtop][p.s.]Тёзка, одной ложкой хлебали? [/p.s.][/offtop]
[vba]
Код
Function Мяв$(s$) With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "([+-]\d{1,2},?\d?)%" If .test(s) Then Мяв = .Replace(s, "*" & 1 + CDbl(.Execute(s)(0).SubMatches(0)) / 100) End If End With End Function
[/vba] [offtop][p.s.]Тёзка, одной ложкой хлебали? [/p.s.][/offtop]RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Пятница, 25.08.2017, 16:49
Твой код найдет все вхождения по паттерну - но заменит-то на что? Да-да - на преобразованное значение из первого вхождения... а ведь значения могут быть разными: Строка: 10+10+1%-100-2% Мяв: 10+10*1,01-100*1,01 uuu: 10+10*1,01-100*0,98
Андрей, никак не одной ложкой
Твой код найдет все вхождения по паттерну - но заменит-то на что? Да-да - на преобразованное значение из первого вхождения... а ведь значения могут быть разными: Строка: 10+10+1%-100-2% Мяв: 10+10*1,01-100*1,01 uuu: 10+10*1,01-100*0,98AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Пятница, 25.08.2017, 20:29
Подскажите, еще, пожалуйста, такой момент.. У меня есть две функции, хочу объединить их в одну, но не получается. При вычислении пишет ошибку всегда. как только не пробовал.
[vba]
Код
Public Function fnEvaluate( _ ByRef rng As Range) 'производит математическое вычисление 'ее необходимо объединить с uuu fnEvaluate = Application.Evaluate(Replace(rng.Value, ",", ".")) End Function
Function uuu$(t$)
'преобразует строку где есть процент 'если +x%, то на *(x/100+1) 'если -x%, то на *-(x/100-1) 'где x число перед процентом. With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "([+-]\d{1,2},?\d?)%" Set objMatches = .Execute(t) For i = 0 To objMatches.Count - 1 Set objMatch = objMatches.Item(i) t = Replace(t, objMatch.Value, "*" & CStr(1 + CDbl(objMatch.SubMatches(0)) / 100)) Next uuu = t End With
'убирает все русские буквы из текста With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "[А-ЯЁ]+" uuu = .Replace(t, "") End With
End Function
[/vba]
Подскажите, еще, пожалуйста, такой момент.. У меня есть две функции, хочу объединить их в одну, но не получается. При вычислении пишет ошибку всегда. как только не пробовал.
[vba]
Код
Public Function fnEvaluate( _ ByRef rng As Range) 'производит математическое вычисление 'ее необходимо объединить с uuu fnEvaluate = Application.Evaluate(Replace(rng.Value, ",", ".")) End Function
Function uuu$(t$)
'преобразует строку где есть процент 'если +x%, то на *(x/100+1) 'если -x%, то на *-(x/100-1) 'где x число перед процентом. With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "([+-]\d{1,2},?\d?)%" Set objMatches = .Execute(t) For i = 0 To objMatches.Count - 1 Set objMatch = objMatches.Item(i) t = Replace(t, objMatch.Value, "*" & CStr(1 + CDbl(objMatch.SubMatches(0)) / 100)) Next uuu = t End With
'убирает все русские буквы из текста With CreateObject("VBScript.RegExp"): .Global = True: .ignorecase = True .Pattern = "[А-ЯЁ]+" uuu = .Replace(t, "") End With