我想在不使用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)?
答案 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
将适用于多个参数。
否则,一个人必须自己编写它,这就是我的解决方案,它适用于具有两个参数和其他类型的Integer
,Double
,String
,Range
(可能免费)扩展为> 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