2015-01-05 3 views
0

У меня есть недельный лист с разметкой с 5 различными категориями в столбцах b, e, h, k, & n, в котором я создаю новую копию оригинального листа каждую неделю и вводим да или нет на эту неделю. Я хочу скомпилировать все эти оценки на сводном листе, чтобы лист 1 подсчитывал количество «у» в листах «лист2» ​​через «последний» в каждом соответствующем столбце. Затем я могу разделить количество листов в этом диапазоне, чтобы получить процент от y, введенный в каждом столбце b, e и т. Д. Я довольно новичок в создании функций и использовании vba, поэтому я действительно борется.Countif на нескольких листах с критериями/параметрами

Сложная часть: я хотел бы, чтобы функция могла принимать следующие аргументы/параметры: на каком листе начать отсчет, на каком листе прекратить подсчет, что считать (в этом случае у, но может измениться в моей следующей книге или если я добавлю новую категорию), какую ячейку считать, поскольку я хочу считать одну ячейку на каждом листе, так что b7 является компиляцией только b7 в диапазоне листов.

Это была моя слабая попытка:

Function mycountif(start As Variant, last As Variant, Cell As Variant, criteria As Variant) 'define name and parameters 

Dim count As Integer 

count = 0 

For Each Worksheet In Worksheet.range(start, last) 
count = count + Application.WorksheetFunction.CountIf(range(Cell), criteria) 

Next Worksheet 

mycountif = count 

End Function 

Я новичок в обществе так, пожалуйста, дайте мне знать, если есть что-нибудь еще мне нужно уточнить.

Благодарим вас за помощь, которую вы можете оказать.

+0

Можете ли вы опубликовать скриншот примера листа? –

ответ

0

Не зная, что остальная часть вашего кода, как, и при условии, что часть вам нужна помощь на это то, что писал выше:

Попробуйте это, чтобы получить ваши WS рассчитывать работать.

Несколько замечаний о вашем коде:

  • У вас есть функции, но он не установлен, чтобы вернуть ничего. Вам нужно указать, что он возвращает после аргументов.

пример:

Function mycountif(args1, arg2, arg3, arg4) As Long 
  • Long Тип лучше для подсчета, чем целое.
  • Чтобы пропустить таблицы, вам нужно объявить переменную, которую вы используете, ws, в качестве рабочего листа, затем прокрутите листы и используйте оператор IF, чтобы выборочно использовать их, а не только перебирать те, которые соответствуют критерии, все петли проверяют каждый.
  • Я должен предположить, что вы передаете в него действительные переменные и знаете, почему и как вы их используете.

Пример:

Function mycountif(start As Variant, last As Variant, Cell As Variant, criteria As Variant) As Long 

'define name and parameters 
Dim ws As Worksheet 
Dim count As Long 

    count = 0 

    For Each ws In Worksheets 
     If ws.Index >= start And ws.Index <= last Then 
      count = count + Application.WorksheetFunction.CountIf(Range(Cell), criteria) 
     End If 
    Next ws 

    mycountif = count 

End Function 

Вы также можете проверить имена листов. Например, если у вас есть sheet1, sheet2, sheet3.

'Convert the result of extracting the right character from the ws.Name into sheetNum As Long. 
    sheetNum = CLng(Right(ws.name, 1)) 
'Then test the sheetNum 

Другим вариантом было бы добавить тег на каждый рабочий лист, который вы хотите использовать, а затем проверить его. 'Если ws.Tag = something Then'

Here is a link to all the available Worksheet Properties вы можете получить доступ.

0

Вы находитесь рядом с for each, но, к сожалению, вы не можете это сделать.
Перемещая все листы и переключая счетчик (и затем выключая) между листами, вы можете решить, какие из них следует пересчитать.
Нам также нужно следить за количеством листов, которые мы включаем в наш счет, поэтому мы можем получить среднее затем.

Это то, что я придумал:

Option Explicit 

Function MultiCountIf(criteria, CommonRange As String, StartSheet As String, EndSheet As String) As Variant 
Dim LoopVar As Long 
Dim Tot As Long 
Dim CountThis As Boolean 
Dim NumSheets As Long 

Tot = 0 
CountThis = False 
NumSheets = 0 

For LoopVar = 0 To Sheets.Count 
    If Sheets(LoopVar).Name = StartSheet Then CountThis = Not CountThis 
    If CountThis Then 
     NumSheets = NumSheets + 1 
     Tot = Tot + WorksheetFunction.CountIf(Sheets(LoopVar).Range(CommonRange), criteria) 
    End If 
    If Sheets(LoopVar).Name = EndSheet Then CountThis = Not CountThis 
Next LoopVar 

If NumSheets = 0 Then 
    MultiCountIf = CVErr(xlErrDiv0) 
Else 
    MultiCountIf = Tot/NumSheets 
End If 
End Function 
Смежные вопросы