UDF на основе регулярных выражений. Это основано на представленной в тексте валюте, т. Е. В ячейке указан доллар США / евро и т. Д.
Option Explicit
Public Function GetCurrencySum(ByVal rng As Range, ByVal aCurrency As String) As Variant
Dim inputString As String, arr()
If rng.Columns.Count > 1 Then
GetCurrencySum = CVErr(xlErrNA)
Exit Function
End If
Select Case rng.Count
Case 1
ReDim arr(0): arr(0) = rng.Value
Case Else
arr = rng.Value
End Select
inputString = Join(Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Index(arr, 0, 1)), "~") & "~"
Dim matches As Object, match As Object
With CreateObject("VBScript.RegExp")
.Global = True
.MultiLine = True
.Pattern = "[+-]?" & aCurrency & ".*?(?=~)"
On Error GoTo errhand:
If .TEST(inputString) Then
Set matches = .Execute(inputString)
For Each match In matches
GetCurrencySum = GetCurrencySum + CDbl(Replace$(match, aCurrency, vbNullString))
Next
Exit Function
End If
GetCurrencySum = 0
Exit Function
End With
errhand:
GetCurrencySum = CVErr(xlErrNA)
End Function
В листе:
Regex:
Попробуйте здесь .
[+-]?JPY.*?(?=~)
/
gm
Соответствует одному символу, представленному в списке ниже [+-]?
?
Квантификатор - сопоставляет от нуля до одного раза столько раз, сколько возможно, возвращая при необходимости (жадный)
+-
соответствует одному символу в списке +-
(с учетом регистра)
JPY
соответствует буквам JPY
буквально (с учетом регистра) '
.*?
соответствует любому символу (кроме ограничителей строки)
*?
Квантификатор - Сопоставляет от нуля до неограниченного количества раз, насколько это возможно, с расширением по мере необходимости (ленивый)
Позитивный взгляд вперед (?=~)
Утверждают, что приведенное ниже регулярное выражение совпадает
~
соответствует символу ~
буквально (с учетом регистра)
Если в ячейке есть другой текст, вы можете попробовать:
Public Function GetCurrencySum(ByVal rng As Range, ByVal aCurrency As String) As Variant
Dim inputString As String, arr()
If rng.Columns.Count > 1 Then
GetCurrencySum = CVErr(xlErrNA)
Exit Function
End If
Select Case rng.Count
Case 1
ReDim arr(0): arr(0) = rng.Value
Case Else
arr = rng.Value
End Select
inputString = Join(Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Index(arr, 0, 1)), "~") & "~"
Dim matches As Object, match As Object
With CreateObject("VBScript.RegExp")
.Global = True
.MultiLine = True
.Pattern = "[\-\+]?" & aCurrency & "\s[\d,.]+"
On Error GoTo errhand:
If .test(inputString) Then
Set matches = .Execute(inputString)
For Each match In matches
GetCurrencySum = GetCurrencySum + CDbl(Replace$(Replace$(match, aCurrency, vbNullString), "~", vbNullString))
Next
Exit Function
End If
GetCurrencySum = 0
Exit Function
End With
errhand:
GetCurrencySum = CVErr(xlErrNA)
End Function
Попробуйте здесь .