2016-06-10 160 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()。