我已经研究这个问题一段时间了,我能够使用多个单元格解决这个问题并最终获得平均值。但我无法构建一个单一的公式来计算平均值。
数据将是动态的,从 2 到超过 8。想法是我可以将数据粘贴到一个单元格中,而平均值将在另一个单元格中计算。
如前所述,我能够使用许多单独的单元格和 vba 来分解它,但正在考虑使用单个单元格使电子表格清晰以完成这项工作。
使用此作为示例数据集:
ABC 106.375/DF 106.99/G 106.5/JK 99.5/
输出:平均值 = 104.84125
只是试图检索数据中的第三个数字已经使我的公式变得一团糟和不必要的复杂化。=MID(G3,LEN(LEFT(G3,FIND("/",G3)-1))+LEN(MID(G3,LEF(LEFT(G3,FIND("/",G3)-1))+2 ,FIND("/",G3,LEFT(LEFT(G3,FIND("/",G3)-1)))-2))+3,FIND("/",G3,LEN(LEFT(G3,FIND) ("/",G3)-1))+LEN(MID(G3,LEF(LEFT(G3,FIND("/",G3)-1))+2,FIND("/",G3,LEN(LEFT) (G3,FIND("/",G3)-1)))-2))+3)-(LEF(LEFT(LEFT(G3,FIND("/",G3)-1))+LEN(MID(G3, LEN(LEFT(G3,FIND("/",G3)-1))+2,FIND("/",G3,LEF(LEFT(G3,FIND("/",G3)-1)))-2 ))+2)-1)
我感到如此有限,以至于我无法保留变量,而且我什至无法将所有数字放在一起来计算平均值。
这是一个基于正则表达式的用户定义函数。
Option Explicit
Function avgNumsOnly(str As String, _
Optional delim As String = ", ")
Dim n As Long, nums() As Variant
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
avgNumsOnly = vbNullString
With rgx
.Global = True
.MultiLine = False
.Pattern = "\d*\.?\d+"
If .Test(str) Then
Set cmat = .Execute(str)
'resize the nums array to accept the matches
ReDim nums(cmat.Count - 1)
'populate the nums array with the matches
For n = LBound(nums) To UBound(nums)
nums(n) = CDbl(cmat.Item(n))
Next n
'average the nums array
avgNumsOnly = Application.Average(nums)
End If
End With
End Function
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句