使用函数将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