WorksheetFunction.CountIfs дает мне ошибку несоответствия типа (ошибка № 13)

Я пытаюсь выполнить функцию CountIfs, где выполняются два критерия. Первая строка — «Утверждено», а вторая — Дата утверждения в отчетном месяце. CountIfs работает, когда существует только первый критерий, но когда я добавляю второй, я получаю ошибку несоответствия типа, и я не знаю, почему.

Код:

' Declarations
Dim sRoutine As String 'Routine’s Name
Dim lngStatus As Long
Dim lngLastRow As Long
Dim intRptMnth  As Integer
Dim intRptYr    As Integer
Dim lngAppvDate  As Long

' Initialize Variables
lngLastRow = FindLastRow(strPSR_File, strCCL, 1)
lngStatus = Worksheets(strCCL).Range(FindLoc(strPSR_File, strCCL,"status")).Column
lngAppvDate = Worksheets(strCCL).Range(FindLoc(strPSR_File, strCCL,"Approved Date")).Column

intRptMnth = CInt(CalcRptMnthNum)
intRptYr = CalcRptYr

' Procedure
With Worksheets(strCCL)
CalcPCR_MTD_Cnt = Application.WorksheetFunction.CountIfs( _
    Worksheets(strCCL).Range(Cells(2, lngStatus), Cells(lngLastRow, 
    lngStatus)), _
    "=Approved", _
'********ERRORS HERE*****
    Month(Worksheets(strCCL).Range("n2:n3")), _
    intRptMnth)
'************************
End With

Поставьте точку/точку . перед Cells в этой формуле и повторите.

JNevill 17.01.2019 22:51

@ JNevil Обновлена ​​строка до "Worksheets(strCCL).Range(.Cells(2, lngStatus), .Cells(lngLastRow, lngStatus))" - по-прежнему получается тот же результат

Chris 17.01.2019 22:55

Также добавьте объявление ваших переменных вверху. Dim lngStatus as Long (если они еще не установлены). Гарантия того, что в этой переменной (и других подобных) есть числовое значение, а не диапазон.

JNevill 17.01.2019 22:58

@ JNevil Я отредактировал фрагмент кода, чтобы показать свои объявления, извините, мне нужно было добавить это раньше

Chris 17.01.2019 23:01
Worksheets(strCCL).Range("n2:n3") возвращает двумерный массив 1x2. Month() ожидает один Date.
GSerg 17.01.2019 23:04

@GSerg Я думал, что это может быть проблемой. У вас есть рекомендация о том, как я могу сравнить даты в этом диапазоне с указанным значением? ИДК, как еще я мог сделать то, что я пытаюсь. Кстати, я новичок в VBA, поэтому, вероятно, есть лучший способ сделать это.

Chris 17.01.2019 23:14

Создайте вариантный массив значений и выполните цикл, используя переменную в качестве счетчика.

Scott Craner 17.01.2019 23:21

@ScottCraner Есть ли способ сделать это в CountIfs? Или вы рекомендуете мне воссоздать функциональность CountIfs с помощью пользовательской функции?

Chris 17.01.2019 23:27

Забавно, что функция задокументировано неправильно. Документация предполагает наличие одного диапазона и 29 параметров, которые являются фильтрами для этого диапазона. На самом деле есть пары параметров (один диапазон, один фильтр, снова), как и для листовая версия.

GSerg 17.01.2019 23:28

@GSerg Я тоже это заметил, когда пытался решить проблему

Chris 17.01.2019 23:29

Вы можете заключить даты в скобки, если они меньше или равны концу месяца intRptMnth и больше или равны 1 того же месяца в countifs. Но еще одну вещь я заметил. Countifs требует, чтобы диапазоны были одинакового размера. Ваш первый диапазон является переменным, а второй установлен. Они должны быть одинакового размера.

Scott Craner 17.01.2019 23:30

@ScottCraner Спасибо за рекомендацию. Это сработало. Я обновлю код, чтобы показать правильную функцию

Chris 17.01.2019 23:40

@Chris, если у вас все заработало, поместите новый код в качестве ответа и самостоятельно ответьте на вопрос. Не указывайте рабочий код в вопросе.

Scott Craner 17.01.2019 23:42

@ScottCraner Я пытался, но это не позволило мне ответить на вопрос. Я попробую снова.

Chris 17.01.2019 23:42

Спасибо всем за помощь

Chris 17.01.2019 23:45

Вероятно, вам следует отменить последние два редактирования, чтобы вернуть его к жизнеспособному вопросу. Сейчас код в вопросе работает. Он должен показать нерабочий код.

Scott Craner 17.01.2019 23:49

@ScottCraner Я откатил код к оригиналу, чтобы показать ошибку. Спасибо за помощь

Chris 18.01.2019 17:19
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
17
80
2

Ответы 2

Исправленный код:

' Declarations
 Dim sRoutine As String 'Routine’s Name
 Dim lngStatus As Long
 Dim lngLastRow As Long
 Dim intRptMnth  As Integer
 Dim intRptYr    As Integer
 Dim lngAppvDate  As Long

' Initialize Variables
lngLastRow = FindLastRow(strPSR_File, strCCL, 1)
lngStatus = Worksheets(strCCL).Range(FindLoc(strPSR_File, strCCL, "status")).Column
lngAppvDate = Worksheets(strCCL).Range(FindLoc(strPSR_File, strCCL, "Approved Date")).Column

intRptMnth = CInt(CalcRptMnthNum)
intRptYr = CalcRptYr

' Procedure
With Worksheets(strCCL)
CalcPCR_MTD_Cnt = Application.WorksheetFunction.CountIfs( _
    Worksheets(strCCL).Range(.Cells(2, lngStatus), .Cells(lngLastRow, lngStatus)), _
    "=Approved", _
    Worksheets(strCCL).Range(.Cells(2, lngAppvDate), .Cells(lngLastRow, lngAppvDate)), _
    "> = " & DateSerial(intRptYr, intRptMnth, 1), _
    Worksheets(strCCL).Range(.Cells(2, lngAppvDate), .Cells(lngLastRow, lngAppvDate)), _
    "<" & DateSerial(Year(Date), Month(Date), 1) _
    )
End With

Просто чтобы показать вариант метода массива:

Dim sRoutine As String 'Routine’s Name
Dim lngStatus As Long
Dim lngLastRow As Long
Dim intRptMnth  As Integer
Dim intRptYr    As Integer
Dim lngAppvDate  As Long

' Initialize Variables
lngLastRow = FindLastRow(strPSR_File, strCCL, 1)
lngStatus = Worksheets(strCCL).Range(FindLoc(strPSR_File, strCCL, "status")).Column
lngAppvDate = Worksheets(strCCL).Range(FindLoc(strPSR_File, strCCL, "Approved Date")).Column

intRptMnth = CInt(CalcRptMnthNum)
intRptYr = CalcRptYr

' Procedure
With Worksheets(strCCL)
    Dim apprv As Variant
    apprv = .Range(.Cells(2, lngStatus), .Cells(lngLastRow, lngStatus)).Value

    Dim dte As Variant
    dte = .Range(.Cells(2, lngAppvDate), .Cells(lngLastRow, lngAppvDate)).Value

    CalcPCR_MTD_Cnt = 0

    Dim i As Long
    For i = LBound(apprv, 1) To UBound(apprv, 1)
        If apprv(i, 1) = "Approved" And Month(dte(i, 1)) = intRptMnth And Year(dte(i, 1)) = intRptYr Then CalcPCR_MTD_Cnt = CalcPCR_MTD_Cnt + 1
    Next i

End With

Спасибо за ответ на вариант массива. Я не проверял это, чтобы убедиться, что это работает, но я ценю, что вы показали методологию.

Chris 18.01.2019 17:21

Другие вопросы по теме