我已经在这个问题上研究了一段时间了,我能够使用多个单元将其分解,并最终获得平均值。但是我无法构造一个公式来计算平均值。
数据将是动态的,从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,LEN(LEFT(G3,FIND(“ /”,G3)-1))+ 2 ,FIND(“ /”,G3,LEN(LEFT(G3,FIND(“ /”,G3)-1)))-2)))+ 3,FIND(“ /”,G3,LEN(LEFT(G3,FIND (“ /”,G3)-1))+ LEN(MID(G3,LEN(LEFT(G3,FIND(“ /”,G3)-1))+ 2,FIND(“ /”,G3,LEN(LEFT (G3,FIND(“ /”,G3)-1)))-2)))+ 3)-(LEN(LEFT(G3,FIND(“ /”,G3)-1))+ LEN(MID(G3, LEN(LEFT(G3,FIND(“ /”,G3)-1))+ 2,FIND(“ /”,G3,LEN(LEFT(G3,FIND(“ /”,G3)-1)))-2 ))+ 2)-1)
我感到自己非常有限,以至于我无法保留变量,甚至在什么时候都无法将所有数字拉在一起以计算平均值。
答案 0 :(得分: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