2016-06-24 2 views
0

Я пытаюсь использовать CountIfWorksheetFunction, чтобы показать, сколько значений выше и ниже заданного значения. Единственный улов, я использую фильтр до этого, и диапазоны, которые используются, являются сломанными диапазонами. Я только что узнал, что функция CountIf может принимать только твердый диапазон. Есть ли альтернатива этому или, возможно, обходной путь? Мой диапазон довольно непоследователен и имеет много перерывов.Альтернатива функции рабочего листа CountIf

ElseIf CWYes = True Then 
     Worksheets("Modified Item Extract").Range("$A$1:$CL$293662").AutoFilter Field:=1, Criteria1:="" & PBH.Value 
    Dim y As Double 
    Dim z As Double 
      PricePerKG = POCost 
      Set ws = ActiveWorkbook.Worksheets("Modified Item Extract") 
      Set relevant_array = ws.Range(ws.Range("B2"), ws.Range("B2").End(xlDown)).SpecialCells(xlCellTypeVisible) 

      y = WorksheetFunction.PercentRank(relevant_array, POCost) 
      Percentile = Format(y, "0.00%") 
       If y > 0.7 Then Warning = "WARNING: your price is above the 70th percentile of items in the same PBH" 
       If y < 0.3 Then Warning = "WARNING: your price is below the 30th percentile of items in the same PBH" 
       If y > 0.3 And y < 0.7 Then Warning = "Carry on: your price is between the 30th and 70th percentile of items in the same PBH" 
       If y = 0 Then MsgBox "The price you provided is out of the range of the PBH" 

      Set ws = ActiveWorkbook.Worksheets("Modified Item Extract") 

      Set relevant_range = ws.Range(ws.Range("B2"), ws.Range("B2").End(xlDown)).SpecialCells(xlCellTypeVisible) 
      MsgBox relevant_range.Address 
      z = WorksheetFunction.CountIf(relevant_range, "<" & POCost) 
      PriceAbove = z 
+0

Вы уже используете VBA? Если вы используете CountIf в VBA - можете ли вы показать код, в котором вы его используете? –

+0

@NicholasPatton Я добавил свой код – cam

+0

избежать фильтра с помощью countif. – cyboashu

ответ

0

Одним из вариантов является петлей через клетки:

For each relevant_cell in relevant_range 
    If relevant_cell < POCost Then PriceAbove = PriceAbove + 1 
Next 

Другим вариантом является просто фильтровать набор данных снова:

Set ws = ActiveWorkbook.Worksheets("Modified Item Extract") 

    With ws 

     With .Range("$A$1:$CL$293662") 
      .AutoFilter Field:=1, Criteria1:="" & PBH.Value 
      .AutoFilter Field:=2, Criteria1:="<" & POCost 
     End With 

     Dim PriceAbove As Double 
     Price Above = .Range(.Range("B2"),.Range("B2").End(xlDown)).SpecialCells(xlCellTypeVisible).Rows.Count 

    End With 
+0

Тогда я бы использовал WorksheetFunction.Count на весь диапазон POCost, чтобы подсчитать, сколько в этом столбце? – cam

+0

@cam - Я смущен? где «полный диапазон POCost» вступает в игру? Это не где в вашем коде выше. 'POCost' является только ссылкой в ​​качестве критерия для выполнения против' COUNTIF' –

+0

. Теперь я включил полный код выше. Я попытался удержать некоторых, чтобы не путать людей. Тем не менее, POCost - это в значительной степени то, что я оцениваю, и это то, что находится в столбце B (что я фильтрую), столбец A - это PBH (который является идентификационным числом разных категорий POCosts и тем, что я фильтрую первым). – cam