Vba 如何在自动筛选范围内找到最小值?

Vba 如何在自动筛选范围内找到最小值?,vba,sorting,excel,Vba,Sorting,Excel,我有一个列,有两个值范围,特别是0-30000和60000+,我需要从中提取60000范围内最小的两个值 到目前为止,我找到的唯一方法是使用AutoFilter生成要提取的所需数据子集。我的问题是Autofilter函数不返回对某个范围的引用。如果有,我可以使用SMALL函数来获取我要查找的值 如何从过滤后的数据中过滤和提取两个最小值?我放弃了使用自动过滤的想法。相反,我使用了SMALL和循环的组合 Cells(2, secIdCol).Select Set valsRange = Range(

我有一个列,有两个值范围,特别是0-30000和60000+,我需要从中提取60000范围内最小的两个值

到目前为止,我找到的唯一方法是使用
AutoFilter
生成要提取的所需数据子集。我的问题是Autofilter函数不返回对某个范围的引用。如果有,我可以使用
SMALL
函数来获取我要查找的值


如何从过滤后的数据中过滤和提取两个最小值?

我放弃了使用自动过滤的想法。相反,我使用了
SMALL
和循环的组合

Cells(2, secIdCol).Select
Set valsRange = Range(Selection, Selection.End(xlDown))

For Each val In valsRange
    If val.Value < 599999 Then
        val.Value = "" // I don't save changes 
        val1 = Application.WorksheetFunction.Small(valsRange, 1)
        val2 = Application.WorksheetFunction.Small(valsRange, 2)
    End If
Next val
单元格(2,secIdCol)。选择
设置valsRange=范围(选择,选择.结束(xlDown))
对于valsRange中的每个val
如果值<599999,则
val.Value=”“//我不保存更改
val1=Application.WorksheetFunction.Small(valsRange,1)
val2=Application.WorksheetFunction.Small(valsRange,2)
如果结束
下一个val

我放弃了使用自动筛选的想法。相反,我使用了
SMALL
和循环的组合

Cells(2, secIdCol).Select
Set valsRange = Range(Selection, Selection.End(xlDown))

For Each val In valsRange
    If val.Value < 599999 Then
        val.Value = "" // I don't save changes 
        val1 = Application.WorksheetFunction.Small(valsRange, 1)
        val2 = Application.WorksheetFunction.Small(valsRange, 2)
    End If
Next val
单元格(2,secIdCol)。选择
设置valsRange=范围(选择,选择.结束(xlDown))
对于valsRange中的每个val
如果值<599999,则
val.Value=”“//我不保存更改
val1=Application.WorksheetFunction.Small(valsRange,1)
val2=Application.WorksheetFunction.Small(valsRange,2)
如果结束
下一个val

我认为您不一定需要VBA。您是否考虑过使用ctrl+shift输入的数组公式:

   =MIN(IF(A1:A7>2999,A1:A7))

我认为你不一定需要VBA。您是否考虑过使用ctrl+shift输入的数组公式:

   =MIN(IF(A1:A7>2999,A1:A7))

这里有一种不使用
SMALL
工作表功能的不同方法:

With Worksheets("Sheet1")
    Dim lastRow As Long
    lastRow = .Cells(2, secIdCol).CurrentRegion.Rows.Count + 1

    Dim rowIndex As Long
    Dim currentValue As Long
    Dim val1 As Long
    Dim val2 As Long

    ' Set val1 to maximum possible long value
    val1 = 2147483647
    For rowIndex = 2 To lastRow
        currentValue = CLng(.Cells(rowIndex, secIdCol).Value)
        If (currentValue > 59999) Then
            If (currentValue < val1) Then
                val2 = val1
                val1 = currentValue
            End If
        End If
    Next rowIndex
End With

MsgBox val1 & " | " & val2
与工作表(“表1”)
最后一排一样长
lastRow=.Cells(2,secIdCol).CurrentRegion.Rows.Count+1
变暗,变长
将当前值变长
暗淡的val1一样长
昏暗的山谷2一样长
'将val1设置为可能的最大长值
val1=2147483647
对于rowIndex=2到lastRow
currentValue=CLng(.Cells(rowIndex,secIdCol).Value)
如果(当前值>59999),则
如果(当前值<值1),则
val2=val1
val1=当前值
如果结束
如果结束
下一行索引
以
MsgBox val1&“|”和val2

这里有一种不同的方法,不使用
SMALL
工作表功能:

With Worksheets("Sheet1")
    Dim lastRow As Long
    lastRow = .Cells(2, secIdCol).CurrentRegion.Rows.Count + 1

    Dim rowIndex As Long
    Dim currentValue As Long
    Dim val1 As Long
    Dim val2 As Long

    ' Set val1 to maximum possible long value
    val1 = 2147483647
    For rowIndex = 2 To lastRow
        currentValue = CLng(.Cells(rowIndex, secIdCol).Value)
        If (currentValue > 59999) Then
            If (currentValue < val1) Then
                val2 = val1
                val1 = currentValue
            End If
        End If
    Next rowIndex
End With

MsgBox val1 & " | " & val2
与工作表(“表1”)
最后一排一样长
lastRow=.Cells(2,secIdCol).CurrentRegion.Rows.Count+1
变暗,变长
将当前值变长
暗淡的val1一样长
昏暗的山谷2一样长
'将val1设置为可能的最大长值
val1=2147483647
对于rowIndex=2到lastRow
currentValue=CLng(.Cells(rowIndex,secIdCol).Value)
如果(当前值>59999),则
如果(当前值<值1),则
val2=val1
val1=当前值
如果结束
如果结束
下一行索引
以
MsgBox val1&“|”和val2

Nope,主要原因是我将其用作更大的数据清理宏的一部分。另一个需要注意的方面是,我正在寻找600000范围内的两个最小值。atm公式将返回300000范围内的最小值,主要原因是我使用它作为更大数据清理宏的一部分。另一个需要注意的方面是,我正在寻找600000范围内的两个最小值。atm公式将返回300000范围内的最小值