2015-01-12 1 views
0

Я пытался закодировать функцию countif в цикле, однако у меня возникают небольшие проблемы с выходами. Вместо того, чтобы читать число при вычислении, функция продолжает выводить «true» или «false». Возможно, в моем коде есть ошибка, но в прошлом я использовал множество функций countif, не испытывая такой проблемы. Как вы можете видеть ниже, я попытался написать функцию двумя разными способами, но оба они не работали или не выводили «истинные» или «ложные».countif выводя «true» или «false», а не число vba

Пожалуйста, помогите.

Sub CorrectSets() 

Dim Cell As Range 

Range("B100000").End(xlUp).Select 
LastRow = ActiveCell.Row 

For Each Cell In Range("S2:S" & LastRow) 
    StartTime = Cell.Offset(0, -12) 
    Shift = Cell.Offset(0, -14) 
    SortedOp = Cell.Offset(0, -17) 
    DOW = Cell.Offset(0, -5) 
    'Cell.Value = CountIF(E2:E & LastRow, Shift, N2:N & LastRow ,DOW, B2:B & LastRow,SortedOp, G2:G & LastRow, " < " & StartTime) 
    Cell.Value = "=CountIF(E2:E" & LastRow & ", " & Shift & ", N2:N" & LastRow & "," & DOW & ",  B2:B" & LastRow & "," & SortedOp & ", G2:G" & LastRow & ", " < " " & StartTime & ")" 
Next Cell 
+1

Вы уверены, что не хотите использовать функцию 'COUNTIFS', а не функцию' COUNTIF', учитывая количество аргументов, которые вы передаете? – Gareth

+0

Да, очень немой. Позвольте мне посмотреть, поможет ли это. – ksmit144

+0

@ Gareth К сожалению, все еще выводя «true» или «False» – ksmit144

ответ

2

Если вы хотите поставить СЧЕТЕЛА()Формулы в Cell затем:

Cell.Formula = "=CountIF(E2:E &............... 

Если вы хотите поставить эту формулу результата в Cell затем:

Cell.Value = Application.Worksheetfunction.CountIF(E2:E &.................... 
+0

Существует также «Application.Evaluate (« COUNTIFS (...) »), но я не рекомендую его, не указывая имена рабочих листов в адресах ячеек и ячеек. – Jeeped

+0

@ Jeeped ... Я согласен с тобой ..... много работы, получая точную строку для * Evaluate() * –

+0

@ Студент Гэри. Я попытался изменить формулу на 'Cell.Value = WorksheetFunction.CountIfs (E2: E "& LastRow &", "=" "& Shift &", N2: N "& LastRow &", "=" "& DOW &", B2: B "& LastRow &", "=" " & SortedOp & ", G2: G" & LastRow & "," <"" и StartTime & ")', но теперь он говорит, что ожидает скобок, где он не должен. – ksmit144

1

Вы должны использовать

Cell.Formula = "=CountIFs..." 

или

Cell.Value = WorksheetFunction.CountIfs... 

См official documentation.

Plus:

  1. Чтобы найти последнюю строку, содержащую данные в колонке (B в данном случае) использовать

    Dim ws as Worksheet 
    Set ws = ActiveSheet 
    Dim LastRow as Long 
    LastRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row 
    

    ws является ссылкой на рабочий лист интереса (ActiveSheet в моем пример). См. this answer.

  2. Вы предпочитаете полностью квалифицировать свои диапазоны и избегать использования Select, если это строго необходимо. С кодом размещен выше,

    Range("B100000").End(xlUp).Select 
    

    не могут быть необходимы.

  3. При использовании Cell.Formula = "=CountIFs...", это может быть удобно использовать

    Dim frm as String 
    frm = "=CountIFs..." 
    Cell.Formula = frm 
    

    для облегчения отладки.

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