使用函数将excel公式转换为VBA
我在Excel中有一个FormulaArray,这是
{=MAX(IF($DB$2:$DI$2<F10,$DB$2:$DI$2))}
它完美的工作。 “F10”等于55,则“$ DB $ 2:$ DI $ 2”是介于41-102之间的值的范围。 然后我创build了一个vba函数并将其应用于excel中作为公式
=ClosestLessThan(F10,$DB$2:$DI$2)
但结果是#VALUE!“,我无法找出正确的方法,这是我所尝试的。
Function ClosestLessThan(searchNumber As Double, rangeOfValues As Range) As Double Dim rng As Range If rangeOfValues < searchNumber Then Set rng = rangeOfValues End If ClosestLessThan = Application.WorksheetFunction.Max(rng) End Function
你最大的问题之一是这条线:
If rangeOfValues < searchNumber Then
虽然Range
对象的默认值是.Value
,但VBA无法为多单元格Range
对象解释.Value
。
另一个问题是你称之为的方式。 In =ClosestLessThan(F10,$DB$2:$DI$2)
F10
是单元格引用(Range对象),但是将该参数分配给double
数据types。
试试这个:
Function ClosestLessThan(searchNumber As Range, rangeOfValues As Range) As Double Dim rng As Range For each rng in rangeOfValues If rng < searchNumber.Value Then Dim rngSearch as Range If rngSearch is Nothing Then Set rngSearch = rng Else Set rngSearch = Union(rng, rngSearch) End If End If Next ClosestLessThan = Application.WorksheetFunction.Max(rngSearch) End Function
和你一样打电话: =ClosestLessThan(F10,$DB$2:$DI$2)
这是我怎么去做的。
Function ClosestLessThan(dblRefVal As Double, rangeOfValues As Range) As Double Dim rng As Range For Each rng In rangeOfValues If rng.Value < dblRefVal And rng.Value > ClosestLessThan Then ClosestLessThan = rng.Value Next End Function
你的函数不工作的原因是因为它试图一次比较完整的范围,然后使用MAX函数。
Function ClosestLessThan(searchNumber As Double, rangeOfValues As Range) As Double Dim min As Double min = -1 For Each cell In rangeOfValues If cell.value < searchNumber And cell.value > min Then min = cell.value End If ' Debug.Print cell.value Next cell ClosestLessThan = min End Function