2016-11-13 3 views
1

Для расчета средневзвешенного я использую следующий простую пользовательскую функцию VBA код:VBA - использовать видимые ячейки только для средневзвешенного UDF

Function wgtavg(values As Range, weights As Range) 

    wgtavg = WorksheetFunction.SumProduct(values, weights)/WorksheetFunction.Sum(weights) 

End Function 

Я хочу функцию, которая учитывает только видимые ячейки - Может кто-нибудь предложить решение ?

редактировать: Я понял это:

Function wgtavg(values As Range, weights As Range) 

    counter = 0 
    xSumproduct = 0 
    xSum = 0 
    For Each xVal In values 
     counter = counter + 1 
    If xVal.Rows.Hidden = False Then 
    If xVal.Columns.Hidden = False Then 

     xSumproduct = xSumproduct + (xVal * weights(counter)) 
     xSum = xSum + weights(counter) 
    End If 
    End If 
     Next 

    wgtavg = xSumproduct/xSum 

End Function 

Кажется работать, но я не знаю, как интегрировать проверку видимости весов.

+0

слишком сложным, я имею в виду, что это слишком сложно развивать это самостоятельно. Если вы опубликуете что-то, я думаю, что смогу это понять. –

+0

Что вы хотите, чтобы вычисление было, если 'values' содержит 10 ячеек, из которых 1 и 3 скрыты, а' weightights 'содержит 9 ячеек, из которых 7, 8 и 9 скрыты? (Или несколько более простой пример, когда оба диапазона содержат одинаковое количество ячеек, но разные скрыты. Или еще более простой случай, когда оба диапазона содержат одинаковое количество не скрытых ячеек, но все еще в разных местах.) – YowE3K

+0

Оба аргументы, значения и веса должны содержать одинаковое количество ячеек. Если нет, то это ошибка. Как только один аргумент скрыт, продукт значения (this) weight * (this) не добавляется к функции. Мой опубликованный код работает только в том случае, если значения скрыты ... –

ответ

0

Используйте SpecialCells() метод

Function wgtavg(values As Range, weights As Range) 

    wgtavg = WorksheetFunction.SumProduct(values.SpecialCells(xlCellTypeVisible), weights.SpecialCells(xlCellTypeVisible))/WorksheetFunction.Sum(weights.SpecialCells(xlCellTypeVisible))) 

End Function 
+0

Протестировано. К сожалению, не работает –

0

Как насчет:

Function wgtavg(values As Range, weights As Range) As Double 
    Dim i As Long 
    For i = 1 To values.Count 
     If values(i).EntireRow.Hidden = False Then 
      wgtavg = wgtavg + values(i) * weights(i) 
     End If 
    Next i 

    wgtavg = wgtavg/Application.WorksheetFunction.Subtotal(109, weights) 
End Function 
+0

Это здорово, спасибо! Единственное, что функция subtotal работает только для строк, а не для столбцов. Поэтому, если вы скрываете столбец, промежуточный итог все равно берет полную сумму. –

0

Попробуйте это:

Function wgtavg(values As Range, weights As Range) As Variant 
    Dim counter As Long 
    Dim xSumproduct As Double 
    Dim xSum As Double 

    'Error if there are different numbers of values and weights 
    If values.Cells.Count <> weights.Cells.Count Then 
     wgtavg = CVErr(xlErrRef) 
     Exit Function 
    End If 

    'Initialise SumProduct and Sum (just in case Dim no longer does so) 
    xSumproduct = 0 
    xSum = 0 

    'Loop through each cell 
    For counter = 1 to values.Cells.Count 
     'Check to if value or weight is hidden 
     If Not (values(counter).Rows.Hidden Or _ 
       values(counter).Columns.Hidden Or _ 
       weights(counter).Rows.Hidden Or _ 
       weights(counter).Columns.Hidden) Then 

      'Error if either value or weight is error 
      If IsError(values(counter)) Or _ 
       IsError(weights(counter)) Then 
       wgtavg = CVErr(xlErrNA) 
       Exit Function 
      End If 

      'Error if either value or weight is not numeric 
      If Not (IsNumeric(values(counter).Value) And _ 
        IsNumeric(weights(counter).Value)) Then 
       wgtavg = CVErr(xlErrNA) 
       Exit Function 
      End If 

      'Maintain running total of SumProduct and Sum 
      xSumproduct = xSumproduct + values(counter).Value * _ 
             weights(counter).Value 
      xSum = xSum + weights(counter).Value 
     End If 
    Next 
    'Calculate weighted average 
    wgtavg = xSumproduct/xSum 
End Function 
+0

Я проверю это. Большое спасибо. –

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