在Excel中,如何计算最大数量的范围呢?

我有这个数据集在excel列; 我想知道大部分数据在哪里都是阴云密布的,例如这个集合的大约100个值在2018.5到2020之间。但是这是手工工作。 什么可以是search这些价值的公式。 我尝试使用平均&标准。 偏差,但他们有一些缺陷,并不总是准确的。 而且范围必须尽可能的窄,比方说,如果我的数值总数等于150,那么超过60%-70%,即这些数值的90-105应该低于这个确定的范围。

2025 2023.75 2023 2020.15 2020.3 2018.35 2017.5 2017.95 2016 2019.45 2020 2022.4 2022.25 2018.2 2018.05 2019.3 2022 2021.45 2021.45 2019.8 2020 2019.25 2019.35 2019.85 2019.4 2018.25 2019.55 2020 2020 2020.05 2020 2020 2021 2019.8 2019.8 2020 2020.05 2019.9 2021 2019.1 2019.1 2015.5 2015.5 2018.5 2017.25 2018.85 2018.85 2018.85 2017.05 2019 2020.05 2020 2020 2020 2019.7 2019.65 2019.65 2020 2019 2018.05 2020 2019.4 2020 2020.05 2017.4 2020 2020 2020 2019.95 2019.95 2019.95 2018 2019.85 2019.85 2019.7 2020 2020 2020 2020 2020 2019.75 2019.6 2019.75 2019.75 2019.95 2019.95 2019.95 2020 2020 2020 2020 2019.35 2019.35 2019.95 2019.95 2020 2019.95 2020 2020 2020 2021.7 2020 2021 2020 2020 2020 2020 2019.95 2020 2019.85 2019.8 2019 2019.8 2019.8 2019.8 2020 2019.9 2019.9 2020 2020 2019.8 2019.3 2019.85 2020 2019.1 2018 2017.5 2015.05 2009 2008 2011.5 2011 2011 2014.65 2011 2010 2009.05 2005.65 2005 1998.1 2000 1999 2001.7 2000.95 2002 2005 2006.7 2004.4 2004.85 2006.8 2007.45 2006 2010 2012.5 2012.2 2008.8 2007.4 2007.55 2005.35 2005.4 2006.9 2008.05 2003.85 2002.6 2004.85 2002.35 2006 2006 

工作表function是不可能的。 你需要创build一个表格(有一个维度为下切,一个维为上切,删除最低/最高,直到你得到了你的范围…但你需要这样做,每次大小的变化(和公式会是…不要考虑它… (仍然假设你需要整个范围)

你可以用公式来做:(A中的所有值:A)

 C1: 0.7 (at least x % values need to be included / 1 = 100%) C2: =MAX(IF(MIN(SMALL(A:A,ROUNDUP(COUNTIF(A:A,"<>")*C1,0)+ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))-1)-SMALL(A:A,ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))))=(SMALL(A:A,ROUNDUP(COUNTIF(A:A,"<>")*C1,0)+ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))-1)-SMALL(A:A,ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1)))),SMALL(A:A,ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))),0)) C3: =MAX(IF(MIN(SMALL(A:A,ROUNDUP(COUNTIF(A:A,"<>")*C1,0)+ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))-1)-SMALL(A:A,ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))))=(SMALL(A:A,ROUNDUP(COUNTIF(A:A,"<>")*C1,0)+ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))-1)-SMALL(A:A,ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1)))),SMALL(A:A,ROUNDUP(COUNTIF(A:A,"<>")*C1,0)+ROW(INDIRECT("1:"&ROUNDDOWN(COUNTIF(A:A,"<>")*(1-C1),0)+1))-1))) 

C2/C3中的公式是数组公式,必须用Ctrl + Shift + Enter确认

C2将显示较低值, C3显示较高值。 您可以通过=COUNTIF(A:A,"<>")获得使用的值的数量,并使用=ROUNDUP(COUNTIF(A:A,"<>")*C1,0)计算计算的数量。


但是用这样的UDF还是可以这样做的:
打开VBA窗口( 按Alt + F11 )。 然后点击“插入”,然后点击“模块”。 复制/粘贴下面的代码到你的模块。

 Option Explicit Public Function getValRange(rng As Range, amountVal As Double) As String Set rng = Intersect(rng, rng.Parent.UsedRange) Dim cellsVal As Variant Dim cellsCount As Long For Each cellsVal In rng.Value If IsNumeric(cellsVal) And Len(cellsVal) > 0 Then cellsCount = cellsCount + 1 Next Dim cellsNow As Long cellsNow = cellsCount cellsVal = rng.Value amountVal = amountVal / 100 Dim AverageVal As Double Dim maxVal As Double Dim minVal As Double Dim valToDel As Double Dim x As Long, y As Long While (cellsNow / cellsCount) > amountVal AverageVal = Application.WorksheetFunction.Average(cellsVal) maxVal = Application.WorksheetFunction.Max(cellsVal) minVal = Application.WorksheetFunction.Min(cellsVal) If (maxVal - AverageVal) > (AverageVal - minVal) Then valToDel = maxVal Else valToDel = minVal End If For x = 1 To UBound(cellsVal) For y = 1 To UBound(cellsVal, 2) If cellsVal(x, y) = valToDel Then cellsVal(x, y) = "" Exit For End If Next y Next x cellsNow = cellsNow - 1 Wend maxVal = Application.WorksheetFunction.Max(cellsVal) minVal = Application.WorksheetFunction.Min(cellsVal) getValRange = minVal & " - " & maxVal End Function 

然后简单地把这个单元格放在里面:

 =getValRange(A1:A150,70) 

得到像2018.2 - 2021这样的string的最低和最高值。 (按您的号码计算)

它只是检查与平均值具有最大差异的值,然后将其排除。 重复此操作,直到单元格数目小于或等于设定的百分比。 然而,低于50%的百分比可能会失败。 对于这样的情况,你需要像“暴力”(可能有很长的计算时间)


要获得一定数量的值的最佳解决scheme,您可以使用这个:

 Public Function getValRange(rng As Range, amountVal As Double) As String If rng.Cells.Count < 2 Or amountVal <= 0 Or amountVal >= 100 Then Exit Function Set rng = Intersect(rng, rng.Parent.UsedRange) Dim cellsVal As Variant Dim allVal() As Variant ReDim allVal(1 To rng.Cells.Count) Dim i As Long 'get all values in in 1d-array For Each cellsVal In rng.Value If IsNumeric(cellsVal) And Len(cellsVal) > 0 Then i = i + 1 allVal(i) = cellsVal End If Next ReDim Preserve allVal(1 To i) 'sort 1d-array For i = 2 To UBound(allVal) If allVal(i) < allVal(i - 1) Then cellsVal = allVal(i) allVal(i) = allVal(i - 1) allVal(i - 1) = cellsVal i = 1 End If Next 'get value count to be used amountVal = Application.RoundUp((UBound(allVal) / 100) * amountVal, 0) Dim clsrange(1) As Variant 'get the closest range clsrange(0) = allVal(amountVal) - allVal(1) clsrange(1) = allVal(1) & " - " & allVal(amountVal) For i = 2 To UBound(allVal) - amountVal If (allVal(amountVal + i - 1) - allVal(i)) < clsrange(0) Then clsrange(0) = allVal(amountVal + i - 1) - allVal(i) clsrange(1) = allVal(i) & " - " & allVal(amountVal + i - 1) End If Next getValRange = clsrange(1) End Function 

一个完全不同的方法将使用sorting选项。 让我们假设列B:E是空的。 将列A复制到B ,然后对列B进行sorting。
获取你想要检查的细胞(现在可以说是50)。 在C1 ,将D1 =B1 =B50-B1 =B1D1中的=B50 。 然后复制下来,直到它到达空单元格的范围(有150个单元格,将在C101结束,自动填充简单的C1:E1下降,直到列E开始变空)。 现在列C使用条件格式,公式=C1=MIN(C:C) …然后检查格式化的单元格,它会告诉你在DE列中具有最小值和最大值的最小范围。