重写 Sumproduct 公式。删除或忽略字母字符 - VBA 已插入
Rewrite Sumproduct formula. Strip or ignore alpha characters - VBA inserted
我决定重写我的问题以简化我的问题。我在 Stack 上遇到了我的第一个 post 关于我现在遇到的同样问题。那时我将所有 INDIRECT
添加到这个原始问题的代码中。
我一直无法使链接 post 中提到的“*”通配符起作用。也许非英语 Excel 在这里发挥作用?
最简单的形式,你能帮我重写这段代码吗(不工作):
Range("namedRange").FormulaR1C1 = "=SUMPRODUCT(SUBSTITUTE(R10C:R[-1]C,""S"",""""))"
要执行以下操作:
- 用
blank
替换所有“S'es”(求和时“4S”会读作“4”)
- 忽略所有空白单元格和包含除“S”以外的其他文本的单元格。 “4T”应该被忽略。
- 对范围内的数字求和
- (单元格值永远不会是“4SK”,所以可以失败)
我可能可以编写一个函数来执行上述所有操作。但现在我被困住了,我的 Google 结果让我变得不明智。任何帮助仍然会非常感激
根据您编辑的问题进行了编辑
我认为 UDF 更易于维护。
我使用了正则表达式,因为您的要求似乎正在发生变化,这将使将来修改它时更加灵活。
您需要做的就是将要处理的范围作为参数传递给函数;您可以使用 VBA 或直接在工作表上执行此操作。
这是 returns 所有单元格的总和,这些单元格要么是数字,要么只有一个 S
。
如果单元格中可能有多个 S
,则将 .Global
参数更改为 True
。
它允许不连续的范围。
如果您的范围始终是连续的,则可以消除外循环。
Option Explicit
Function sumPlusS(rg As Range) As Long
Dim vData, w, s As String, a As Range
Dim mySum As Long
Const sPat As String = "S"
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = False 'looking only for a single letter, change to True if could have multiple S's
.ignorecase = False 'case sensitive
.Pattern = sPat
End With
'read into variant array for processing
For Each a In rg.Areas 'allow for non-contiguous ranges
vData = a
'iterate through the array and sum the values
For Each w In vData
s = RE.Replace(w, "")
If IsNumeric(s) Then mySum = mySum + Val(s)
Next w
Next a
sumPlusS = mySum
End Function
我决定重写我的问题以简化我的问题。我在 Stack 上遇到了我的第一个 post 关于我现在遇到的同样问题。那时我将所有 INDIRECT
添加到这个原始问题的代码中。
我一直无法使链接 post 中提到的“*”通配符起作用。也许非英语 Excel 在这里发挥作用?
最简单的形式,你能帮我重写这段代码吗(不工作):
Range("namedRange").FormulaR1C1 = "=SUMPRODUCT(SUBSTITUTE(R10C:R[-1]C,""S"",""""))"
要执行以下操作:
- 用
blank
替换所有“S'es”(求和时“4S”会读作“4”) - 忽略所有空白单元格和包含除“S”以外的其他文本的单元格。 “4T”应该被忽略。
- 对范围内的数字求和
- (单元格值永远不会是“4SK”,所以可以失败)
我可能可以编写一个函数来执行上述所有操作。但现在我被困住了,我的 Google 结果让我变得不明智。任何帮助仍然会非常感激
根据您编辑的问题进行了编辑
我认为 UDF 更易于维护。
我使用了正则表达式,因为您的要求似乎正在发生变化,这将使将来修改它时更加灵活。
您需要做的就是将要处理的范围作为参数传递给函数;您可以使用 VBA 或直接在工作表上执行此操作。
这是 returns 所有单元格的总和,这些单元格要么是数字,要么只有一个 S
。
如果单元格中可能有多个 S
,则将 .Global
参数更改为 True
。
它允许不连续的范围。
如果您的范围始终是连续的,则可以消除外循环。
Option Explicit
Function sumPlusS(rg As Range) As Long
Dim vData, w, s As String, a As Range
Dim mySum As Long
Const sPat As String = "S"
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = False 'looking only for a single letter, change to True if could have multiple S's
.ignorecase = False 'case sensitive
.Pattern = sPat
End With
'read into variant array for processing
For Each a In rg.Areas 'allow for non-contiguous ranges
vData = a
'iterate through the array and sum the values
For Each w In vData
s = RE.Replace(w, "")
If IsNumeric(s) Then mySum = mySum + Val(s)
Next w
Next a
sumPlusS = mySum
End Function