2016-06-10 168 views
0

我有一个包含一列一年用C柱d数据表,一个月B中柱,日,总数我得到类型不匹配错误

我试图创建功能,总结一个月的今天来自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 

尝试设置范围时出现类型错配。你能帮忙吗?

在此先感谢

+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

在后一种情况下,你可以省略“范围” – user3598756

+0

谢谢,修正了错误,但它返回值为“0”的tMessages – daba

+0

@daba很高兴我能回答它。您的评论是您提出的另一个问题,因为您需要向我们展示您的新代码并提供有关新问题的更多说明。 –

1

简单COUNTIFS()会为你做它,而不是你的UDF的。

如果您非常热衷于使用UDF,那么为什么不在每个单元中循环遍历UDF中的Countifs()。