我的数据表包含A列中的年份,B列中的月份,C列中的日期以及d中的总计数
我正在尝试创建一个函数,该函数将每月的数据与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 :(得分:2)
你说: -
尝试设置范围
时出现类型不匹配
您已将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
答案 1 :(得分:1)
您声明此变量:
Dim wsData As Worksheet
但是你设置了这个变量:
Set wsJData = ThisWorkbook.Sheets("daily_report")
然后你试着调用你Dim
'的变量,但问题是它是空的。
因此,如果您将wsJData
更改为wsData
,您的代码可能会有效。
答案 2 :(得分:1)
一个简单的Countifs()会为你而不是你的UDF做。
如果您非常热衷于使用UDF,为什么不在UDF中使用Countifs()而不是遍历每个单元格。