VBA Excel-在VBA

时间:2018-03-09 08:45:09

标签: excel-vba vba excel

我想在不使用VBA中的常量

的情况下复制以下excel公式
 =MAX(A9:A13)
 =MAX(A4:A8,A14:A18)

其中选择开始和结束(A9)和(A13)是动态单元格(不限于A列)并存储在变量startVar和endVar中。

For = MAX(A9:A13)我做了以下代码

 startVar = "A9"
 endVar = "A14"

 Range(startVar, endVar).Select
 Range("B1").Value = Application.Max(Selection)

使用上面的代码,如何在仍然使用变量startVar和endVar的同时复制= MAX(A4:A8,A4:A18)?

4 个答案:

答案 0 :(得分:1)

Range("B1").Value = WorksheetFunction.MAX(Range(StartVar & ":" & EndVar))

WorksheetFunction集合允许您将大多数Excel函数用作VBA函数。

答案 1 :(得分:1)

尝试两个不连续范围的联盟。

Range("B1").Value = Application.Max(Union(Range("A4:A8"), Range("A14:A18")))
'alternate
Range("B1").Value = Application.Max(Range("A4:A8, A14:A18"))

dim maxarr as variant
maxarr = array(4, 8, 14, 18)
Range("B1").Value = Application.Max(Range(cells(maxarr(0), "A"), cells(maxarr(1), "A")), _
                                    Range(cells(maxarr(2), "A"), cells(maxarr(3), "A")))

答案 2 :(得分:1)

只要您使用有效的范围地址,这将有效。

startVar = "A4:A8"
endVar = "A14:A18"

If InStr(startVar & endVar, ":") <> 0 Then sep  = "," Else sep = ":"
Range("B1").Value2 = Application.Max(Range(startVar & sep & endvar))

答案 3 :(得分:0)

对于数字和Range值,WorksheetFunction.Max将适用于多个参数。

否则,一个人必须自己编写它,这就是我的解决方案,它适用于具有两个参数和其他类型的IntegerDoubleStringRange(可能免费)扩展为> 2个参数):

'https://stackoverflow.com/a/63013689/1915920
Function Max(a As Variant, Optional b As Variant) As Variant
    If TypeName(a) = "Range" Then Max = WorksheetFunction.Max(a, b): Exit Function
    If a > b Then Max = a Else Max = b
End Function


'https://stackoverflow.com/a/63013689/1915920
Function Min(a As Variant, Optional b As Variant) As Variant
    If TypeName(a) = "Range" Then Min = WorksheetFunction.Min(a, b): Exit Function
    If a < b Then Min = a Else Min = b
End Function

测试代码:

Sub test_Max()

    'max int
    Debug.Assert Max(1, 2) = 2
    Debug.Assert Max(2, 1) = 2
    Debug.Assert Max(1, 1) = 1
    
    'max double
    Debug.Assert Max(1, 2.3) = 2.3  

    'max string
    Debug.Assert Max("a", "b") = "b"

    'max ranges
    Dim wb As Workbook:  Set wb = Application.Workbooks.Add
    With wb.Sheets(1)
        .range("A1") = 1
        .range("B1") = 2
        .range("C1") = Max(.range("A1"), .range("B1"))
        Debug.Assert .range("C1") = 2
        .range("A2") = 1
        .range("B2") = 2.3
        .range("C2") = Max(.range("A2"), .range("B2"))
        Debug.Assert .range("C2") = 2.3
        .range("C3") = Max(.range("A1", "B2"))
        Debug.Assert .range("C3") = 2.3
    End With
    wb.Close False

    'min
    Debug.Assert Min(2, 1) = 1
    Debug.Assert Min(1, 1) = 1
End Sub