编辑 VBA UDF 以求和括号中的数字,同时忽略括号中的单词
Posted
技术标签:
【中文标题】编辑 VBA UDF 以求和括号中的数字,同时忽略括号中的单词【英文标题】:Edit VBA UDF to sum numbers in parenthesis while ignoring words in parenthesis 【发布时间】:2018-05-22 22:00:04 【问题描述】:我有一个 UDF,它会在给定单元格中查找括号内的数字,然后对给定单元格中括号内的所有数字求和,它在 90% 的情况下都可以正常工作,但是当括号内的内容不是一个数字,即一个单词或短语,它将返回#VALUE!我正在尝试解决此问题,以便它会忽略括号内的单词等。也出于某种原因,有一个“。”括号后使得它使括号中的数字在“。”之前当它们不应该被忽略时被忽略。
上述问题的截图
函数如下
Public Function Addum(rng As Range) As Double
Dim s As String, L As Long, temp As String
Dim CH As String
s = rng.Value
L = Len(s)
For i = 1 To L
CH = Mid(s, i, 1)
If CH Like "[0-9]" Or CH = "." Or CH = "(" Or CH = ")" Then
temp = temp & CH
Else
temp = temp & " "
End If
Next i
temp = Application.WorksheetFunction.Trim(temp)
arr = Split(temp, " ")
For Each a In arr
If Left(a, 1) = "(" Then
a = Mid(a, 2, Len(a) - 2)
If IsNumeric(a) Then
Addum = Addum + CDbl(a)
End If
End If
Next a
End Function
这个问题不同于Excel: Sum numbers inside a text block in a cell 因为当括号内有单词并且有“。”时,我要求它工作。在括号之后。
提前感谢您提供的任何帮助!
【问题讨论】:
@ScottCraner - 这个问题是发布代码的来源 @TimWilliams 和其他两个答案中的任何一个都将忽略文本。 其中一个答案使用了正则表达式,我在 mac 上工作时遇到问题,另一个是数组公式,在此设置中也不起作用 @ScottCraner - 授予。看来 OP 正试图弄清楚如何修复他们拥有的代码...... 我重新打开了但是应该问一下,你有什么尝试自己调整代码的? 【参考方案1】:Public Function Addum(rng As Range) As Double
Dim s As String, temp As String, i As Long
Dim CH As String, inParens As Boolean, q As String
s = rng.Value
For i = 1 To Len(s)
CH = Mid(s, i, 1)
If CH = "(" Then
inParens = True
q = ""
ElseIf CH = ")" Then
inParens = False
temp = temp & " " & q
Else
If inParens Then q = q & _
IIf(CH Like "[0-9]" Or CH = ".", CH, " ")
End If
Next i
temp = Application.WorksheetFunction.Trim(temp)
arr = Split(temp, " ")
For Each a In arr
If IsNumeric(a) Then Addum = Addum + CDbl(a)
Next a
End Function
【讨论】:
这比我的方法要好得多............我从来没有考虑过测试是否在括号之间 @TimWilliams 有没有办法让它忽略日期,即 (9 /4) 最终会在最终答案中添加 13,而 (9/4/16) 会在最终答案中添加 29回答。 – 海登衬衫 是的,有可能 - 为什么不试一试?【参考方案2】:这是一个后期绑定regexudf。
Function sumNums(str As String) As Double
Dim n As Long
Static rgx As Object, cmat As Object
'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
If rgx Is Nothing Then
Set rgx = CreateObject("VBScript.RegExp")
End If
sumNums = 0
With rgx
.Global = True
.MultiLine = False
.Pattern = "\(\d+(\.\d1,2)?\)"
If .Test(str) Then
Set cmat = .Execute(str)
'sum the matches
For n = 0 To cmat.Count - 1
sumNums = sumNums + Abs(CDbl(cmat.Item(n)))
Next n
End If
End With
End Function
对于excel-vba-mac 与regex 有问题的excel-vba-mac,这是我能想到的最简单的方法。
Option Explicit
Public Function Addum(str As String) As Double
Dim i As Long, j As Long, tmp As Variant
tmp = Split(str, Chr(40))
For i = LBound(tmp) + 1 To UBound(tmp)
If IsNumeric(Split(tmp(i), Chr(41))(0)) Then _
Addum = Application.Sum(Addum, Split(tmp(i), Chr(41))(0))
Next i
End Function
【讨论】:
以上是关于编辑 VBA UDF 以求和括号中的数字,同时忽略括号中的单词的主要内容,如果未能解决你的问题,请参考以下文章
当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?