基于正则表达式的 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
在工作表中:
正则表达式:
试试here。
[+-]?JPY.*?(?=~)
/
gm
匹配下面列表中的单个字符[+-]?
? 量词 - 匹配 0 到 1 次,尽可能多次,根据需要回馈(贪婪)
+- 匹配列表中的单个字符 +-(区分大小写)
JPY 与字符 JPY 逐字匹配(区分大小写) '
.*? 匹配任何字符(行终止符除外)
*? Quantifier — 匹配零次到无限次,尽可能少,根据需要扩展(惰性)
正向预测(?=~)
断言下面的正则表达式匹配
~ 匹配字符 ~ 字面意思(区分大小写)
如果单元格中有其他文本,那么您可以尝试:
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
试试here。