2016-08-25 1 views
1

Как это сделать, не устанавливая диапазон в excel? В идеале это будет храниться внутри (и временно) в VBA только ради расчета. Очевидно, что текущий код не будет работать, поскольку FormulaArray применяется только к объектам диапазона.VBA: Получите Min и Max от выбора диапазона при игнорировании NA

Dim lower As Double 
    lower.FormulaArray = "=RoundDown(Min(If(Not(ISNA(objSelection)), objSelection)), 0)" 
    Dim upper As Double 
    upper.FormulaArray = "=RoundUp(Max(If(Not(ISNA(objSelection)), objSelection)), 0)" 

ответ

1

Если вы хотите разрешить формулы прямо в переменную типа двойного, используйте Excel Application object позвонить ROUNDDOWN, ROUNDUP и AGGREGATE функции напрямую.

Dim lower As Double, upper As Double, objSelection As Range 

Set objSelection = Selection 

'trim any full row or column selections down to the used range 
Set objSelection = Intersect(objSelection.Parent.UsedRange, objSelection) 

lower = Application.RoundDown(Application.Aggregate(15, 6, objSelection, 1), 0) 
upper = Application.RoundUp(Application.Aggregate(14, 6, objSelection, 1), 0) 
Debug.Print lower 
Debug.Print upper 
+0

Работает отлично (и с несмежными диапазонами). Благодаря! – rocketman

3

Вы бы удалить Vba часть из цитат и конкатенации строк вместе с &:

Dim lower As Double 
lower = ActiveSheet.Evaluate("=RoundDown(Min(If(ISNUMBER(" & Selection.Address & "), " & Selection.Address & ")), 0)") 
Dim upper As Double 
upper = ActiveSheet.Evaluate("=RoundUp(Max(If(ISNUMBER(" & Selection.Address & "), " & Selection.Address & ")), 0)") 
+0

Я получаю «Недопустимый отбор» на нижнем. Это потому, что lower не является объектом Range? Я думал, что FormulaArray работает только с объектами Range? – rocketman

+0

Плохо, я отказался от формулы не декларации. См. Edit @rocketman –

+0

Кажется, что не работает, когда я выбираю непересекающиеся диапазоны, хотя ... – rocketman

Смежные вопросы