Приветствую всех! Прошу помощи гуру в решении следующей задачи. Нужно извлечь цифры из текста, и перемножить их между собой. а далее вывести результаты на лист поячеечно. Если стоимость дана в валюте, перевести в рубли, используя коэффициент пересчёта. Моя идея такая: извлечь цифры, загнать их в массив, далее перемножить элементы массива и умножить на курс валюты(если цена не в рублях). а потом выкинуть результаты на лист. Однако, забуксовал на первоначальном этапе...не могу сформировать массив, уже голову сломал. Чую, что дело в неверном задании условий цикла, но не могу подобрать верный вариант. Пример прилагаю.
Приветствую всех! Прошу помощи гуру в решении следующей задачи. Нужно извлечь цифры из текста, и перемножить их между собой. а далее вывести результаты на лист поячеечно. Если стоимость дана в валюте, перевести в рубли, используя коэффициент пересчёта. Моя идея такая: извлечь цифры, загнать их в массив, далее перемножить элементы массива и умножить на курс валюты(если цена не в рублях). а потом выкинуть результаты на лист. Однако, забуксовал на первоначальном этапе...не могу сформировать массив, уже голову сломал. Чую, что дело в неверном задании условий цикла, но не могу подобрать верный вариант. Пример прилагаю.Xpert
Sub Мяу() Dim ar, objRegExp As Object, SubMatches As Object, i& ar = Range(Cells(2, "C"), Cells(Rows.Count, "B").End(xlUp)).Value Set objRegExp = CreateObject("VBScript.RegExp") With objRegExp .Global = True .Pattern = "\d+" For i = 1 To UBound(ar) Set SubMatches = .Execute(ar(i, 1)) If SubMatches.Count = 2 Then ar(i, 2) = SubMatches(0) * SubMatches(1) If InStr(1, ar(i, 1), "долл", 1) Then ar(i, 2) = ar(i, 2) * 70 ElseIf InStr(1, ar(i, 1), "евр", 1) Then ar(i, 2) = ar(i, 2) * 80 End If End If Next End With Cells(2, "B").Resize(UBound(ar), 2).Value = ar End Sub
[/vba]
[vba]
Код
Sub Мяу() Dim ar, objRegExp As Object, SubMatches As Object, i& ar = Range(Cells(2, "C"), Cells(Rows.Count, "B").End(xlUp)).Value Set objRegExp = CreateObject("VBScript.RegExp") With objRegExp .Global = True .Pattern = "\d+" For i = 1 To UBound(ar) Set SubMatches = .Execute(ar(i, 1)) If SubMatches.Count = 2 Then ar(i, 2) = SubMatches(0) * SubMatches(1) If InStr(1, ar(i, 1), "долл", 1) Then ar(i, 2) = ar(i, 2) * 70 ElseIf InStr(1, ar(i, 1), "евр", 1) Then ar(i, 2) = ar(i, 2) * 80 End If End If Next End With Cells(2, "B").Resize(UBound(ar), 2).Value = ar End Sub
когда-то давно выкладывал UDF, извлекающую из ячеек выделенного диапазона целые числа и загоняющую их в массив,с которым потом можно работать обычными формулами листа.
[vba]
Код
Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray ДИАПАЗОН()) '--------------------------------------------------------------------------------------- ' Author : Alex_ST, v__step, nerv ' URL : http://www.excelworld.ru/forum/3-1012-97065-16-1401961860 ' Topic : Функция (UDF) "ИЗВЛЕЧЬ_ЦЕЛЫЕ" ' Purpose : Создать массив из целых чисел, извлечённых из текста произвольно расположенных ячеек ' Notes : К полученному массиву можно применять любые стандартные формулы листа '--------------------------------------------------------------------------------------- Dim rArea, rCell, sStr$, oMatches, i&, Arr() On Error GoTo xlErrEXIT For Each rArea In ДИАПАЗОН For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value) sStr = sStr & " " & rCell Next rCell Next rArea With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\d+": Set oMatches = .Execute(sStr): End With If oMatches.Count = 0 Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrNA): Exit Function ' вернуть ошибку #Н/Д если чисел нет ' If oMatches Is Nothing Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrNA): Exit Function ' вернуть ошибку #Н/Д если чисел нет ReDim Arr(1 To oMatches.Count) For i = 0 To oMatches.Count - 1: Arr(i + 1) = CLng(oMatches(i).Value): Next i ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr xlErrEXIT: If Err Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue) ' вернуть ошибку #ЗНАЧ! если была ошибка End Function
[/vba]
посмотрите, может можно к Вашей задаче прикрутить?
когда-то давно выкладывал UDF, извлекающую из ячеек выделенного диапазона целые числа и загоняющую их в массив,с которым потом можно работать обычными формулами листа.
[vba]
Код
Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray ДИАПАЗОН()) '--------------------------------------------------------------------------------------- ' Author : Alex_ST, v__step, nerv ' URL : http://www.excelworld.ru/forum/3-1012-97065-16-1401961860 ' Topic : Функция (UDF) "ИЗВЛЕЧЬ_ЦЕЛЫЕ" ' Purpose : Создать массив из целых чисел, извлечённых из текста произвольно расположенных ячеек ' Notes : К полученному массиву можно применять любые стандартные формулы листа '--------------------------------------------------------------------------------------- Dim rArea, rCell, sStr$, oMatches, i&, Arr() On Error GoTo xlErrEXIT For Each rArea In ДИАПАЗОН For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value) sStr = sStr & " " & rCell Next rCell Next rArea With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\d+": Set oMatches = .Execute(sStr): End With If oMatches.Count = 0 Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrNA): Exit Function ' вернуть ошибку #Н/Д если чисел нет ' If oMatches Is Nothing Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrNA): Exit Function ' вернуть ошибку #Н/Д если чисел нет ReDim Arr(1 To oMatches.Count) For i = 0 To oMatches.Count - 1: Arr(i + 1) = CLng(oMatches(i).Value): Next i ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr xlErrEXIT: If Err Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue) ' вернуть ошибку #ЗНАЧ! если была ошибка End Function
[/vba]
посмотрите, может можно к Вашей задаче прикрутить?Alex_ST
Уважаемый RAN, подскажите, пожалуйста, почему код [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B2:B" & Cells(Rows.Count).End(xlUp).Row)) Is Nothing Then Мяу End Sub
[/vba] работает не совсем корректно? Дело в том, что Мяу запускается исключительно при внесении изменений в ячейку B2, при изменении любых других ячеек столбца B, ничего не происходит...
Уважаемый RAN, подскажите, пожалуйста, почему код [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B2:B" & Cells(Rows.Count).End(xlUp).Row)) Is Nothing Then Мяу End Sub
[/vba] работает не совсем корректно? Дело в том, что Мяу запускается исключительно при внесении изменений в ячейку B2, при изменении любых других ячеек столбца B, ничего не происходит...Xpert