2016-06-10 45 views
0

Ich bin haben Datenblatt, das Jahr in einer Spalte, Monat in B-Säule, Tag in C-Säule und die Gesamtzahl in d enthältich Type Mismatch Fehler

Ich versuche Funktion zu erstellen, den Monat heute summiert Werte aus d Spalte

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 

Ich bekomme Typ missmatch beim Versuch, Bereiche einzustellen. Können Sie bitte helfen?

Vielen Dank im Voraus

+0

Beitrag der Fehler –

+0

Wenn Sie xlDown verwenden, ich glaube, Sie viele Reihe bekommen. Sollte es xlRight sein? Oder besser some wie wsData.Rows (1)? –

+0

welche Zeile bitte? Setzen Sie 'Option Explicit' oben im Modul. Es hilft. –

Antwort

1

Sie erklären diese Variable:

Dim wsData As Worksheet

aber dann setzen Sie diese Variable:

Set wsJData = ThisWorkbook.Sheets("daily_report")

Dann Sie versuchen, die Variable, die Sie Dim anrufen 'd, aber das Problem ist, dass es leer ist.

Also, wenn Sie wsJData-wsData ändern, wird der Code wahrscheinlich funktionieren.

2

Sie sagten: -

I Typen missmatch erhalten, wenn Bereiche

Sie haben rowYear als Bereich erklärt zu setzen versuchen (Dim rowYear As Range), aber dann eine Nummer es keinen Bereich zugeführt wird, daher das Missverhältnis. Set rowYear = wsData.Range("A1").End(xlDown).Row wird die Zeilennummer nicht den Bereich liefern.

Um dies zu beheben, entweder die Erklärung ändern: -

Dim rowYear As Long 

oder die Einstellung der Variablen ändern: -

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

Im letzteren Fall können Sie "Bereich" – user3598756

+0

weglassen Danke, dass der Fehler behoben, aber es gab den Wert "0" für tMessages – daba

+0

@daba Froh, ich könnte es beantworten. Ihr Kommentar ist eine andere Frage für Sie zu fragen, wie Sie uns Ihren neuen Code müssen und mehr Beschreibung auf die neue Ausgabe geben. –

1

Ein einfaches COUNTIFS() wird es statt Ihrer UDF für Sie tun .

Wenn Sie sehr daran interessiert sind, UDF zu verwenden, warum verwenden Sie nicht Countfs() in Ihrer UDF, anstatt jede Zelle zu durchlaufen. bitte

Verwandte Themen