VBA Excel中非连续范围的最小值

时间:2014-08-26 23:00:24

标签: excel-vba vba excel

我希望使用Excel VBA找到非连续范围的最小值。范围不连续的主要原因是我希望用户能够选择范围。不幸的是,我还没能找到适合我情况的任何东西。

具体地,对于以下两组数据,用户可以选择单元格A1:A5,命中控制,然后选择单元格A7:A11。宏应该返回列C中所选单元格中所有单元格的最小值(在本例中为所有单元格)。

     A     B
1    1    0.1
2    2    2.0 
3    3    3.0
4    4    4.0 
5    5    5.0

6    6    0.05
7    7    0.2
8    8    0.3
9    9    0.4
10   10   0.5   

以下是我一直在使用的内容,但它只返回范围的第一个连续部分的最小值。

Sub testa()

Dim RngA, out As Range
Dim MSA As Single


    Set RngA = Range(Selection.Address)
    MsgBox RngA.Address
    MSA = WorksheetFunction.Min(RngA.Offset(0, 1).Value)

    Set out = Worksheets("summary").Range("C13")

    out = MSA

End Sub

MsgBox只是为了验证是否正确选择了范围。它似乎是正确的($ A1:$ A5,$ A7:& A11)。输出,位于"摘要" sheet,仅返回第一个数据块的最小值,0.10。结果应为0.05(细胞B7)。

我想过运行一个循环来找到范围的每个部分的最小值,但是我不确定如何分割" Selection.Address。"有没有人建议如何让宏返回整个非连续范围的最小值?

1 个答案:

答案 0 :(得分:1)

MIN工作表函数适用于非连续范围,我无法重现您的问题。以下代码按预期工作:

Sub test_min_in_non_contiguous_range()
    Dim area As Range: Set area = ActiveSheet.Range("$A$1:$A$3, $A$5:$A$11")
    Debug.Print Application.WorksheetFunction.Min(area)
End Sub

如果你遇到麻烦,请告诉我:))

编辑: 刚刚意识到你的代码中存在什么问题。

MSA = WorksheetFunction.Min(RngA.Offset(0, 1).Value)

应该是

MSA = WorksheetFunction.Min(RngA.Offset(0, 1))