2016-06-10 2 views
0

Я есть лист данных, который содержит год в колонке, месяц в колонке B, день в колонке C и общее количество в гя получаю Тип Несовпадение ошибки

Я пытаюсь создать функцию, которая суммирует месяц сегодня статистика из d столбца

Function countMessagesbyDate(xYear As Integer, xMonth As Integer, xDay As Integer) As Integer 

    Dim wsData As Worksheet 
    Dim LastRow As Long 
    Dim tMessages As Integer 
    Dim rowYear As Range 
    Dim rowMonth As Range 
    Dim rowDay As Range 
    Dim rowMessages As Range 
    Dim rCell As Range 
    Dim i As Integer 

    Application.ScreenUpdating = False 

    Set wsJData = ThisWorkbook.Sheets("daily_report") 
    Set rowYear = wsData.Range("A1").End(xlDown).Row 
    Set rowMonth = wsData.Range("B1").End(xlDown).Row 
    Set rowDay = wsData.Range("C1").End(xlDown).Rows 
    Set rowMessages = wsData.Range("D1:").End(xlDown).Rows 

    tMessages = 0 
    i = 0 

    For Each rCell In rowYear 
     i = i + 1 
     If rCell.Value = xYear And rowMonth.Offset(i) = xMonth And rowDay.Offset(i) < Day(Today) Then 
      tMessages = tMessages + rowMessages.Offset(i).Value 
     End If 
    Next rCell 

    countMessagesbyDate = tMessages 

    End Function 

Я получаю тип missmatch при попытке установить диапазоны. Не могли бы вы помочь?

Заранее спасибо

+0

Сообщите об ошибке –

+0

Если вы используете xlDown, я думаю, вы получите много строк. Должно ли быть xlRight? Или лучше что-нибудь вроде wsData.Rows (1)? –

+0

какой линия пожалуйста? Поместите «Option Explicit» в верхней части модуля. Помогает. –

ответ

1

Вы объявляете эту переменную:

Dim wsData As Worksheet

, но тогда вы установите эту переменную:

Set wsJData = ThisWorkbook.Sheets("daily_report")

Затем вы пытаетесь вызвать переменную, Dim 'd, но проблема в том, что она пуста.

Так что если вы измените wsJData на wsData, ваш код, вероятно, будет работать.

2

Вы заявили: -

я типа missmatch при попытке установить диапазоны

Вы объявили rowYear как диапазон (Dim rowYear As Range), но затем подают ряд к нему не диапазон, следовательно, несоответствие. Set rowYear = wsData.Range("A1").End(xlDown).Row будет содержать номер строки, а не диапазон.

Чтобы это исправить или изменить объявление: -

Dim rowYear As Long 

или изменить значение переменной: -

Set rowYear = wsData.Range("A1").End(xlDown).Range 
+0

В последнем случае вы можете опустить «Range» – user3598756

+0

Спасибо, что исправили ошибку, но она вернула значение «0» для tMessages – daba

+0

@daba Рад, что я мог бы ответить на него. Ваш комментарий - это другой вопрос, который вы хотите задать, так как вам нужно будет показать нам свой новый код и дать более подробное описание новой проблемы. –

1

Простой COUNTIFS() сделает это за вас, а ваш UDF ,

Если вы очень заинтересованы в использовании UDF, почему вы не используете Countifs() в своем UDF, а не зацикливаете по каждой ячейке.

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