2016-09-20 1 views
2

Ich erhalte einen Typenkonfliktfehler in meinem VBA-Makro. Hier ist der wesentliche Teil meiner Code:Typenkonflikt in For-Schleife einschließlich Tests der Werte der Arbeitsblattzelle

Public Function CalculateSum(codes As Collection, ws As Worksheet) As Double 

On Error GoTo ErrorHandler 

If ws Is Nothing Then 
    MsgBox ("Worksheet is necessery") 
    Exit Function 
End If 


Dim balanceColumnIndex, codesCulumnIndex As Integer 
Dim searchStartRow, searchEndRow As Integer 
balanceColumnIndex = 17 
codesColumnIndex = 4 
searchStartRow = 7 
searchEndRow = ws.Cells(ws.Rows.Count, codesColumnIndex).End(xlUp).Row 

Dim result As Double 
result = 0# 

For counter = searchStartRow To searchEndRow 
    If Len(ws.Cells(counter, codesColumnIndex)) > 0 And Len(ws.Cells(counter, balanceColumnIndex)) > 0 And _ 
    IsNumeric(ws.Cells(counter, codesColumnIndex).Value) And IsNumeric(ws.Cells(counter, balanceColumnIndex).Value) Then 
     If Contains(codes, CLng(ws.Cells(counter, codesColumnIndex).Value)) Then 
      result = result + ws.Cells(counter, balanceColumnIndex).Value 
      ''' ^^^ This line throws a type-mismatch error 
     End If 
    End If 
Next counter 


CalculateSum = result 

ErrorHandler: 
Debug.Print ("counter: " & counter & "\ncode: " & ws.Cells(counter, codesColumnIndex).Value & "\namount: " & ws.Cells(counter, balanceColumnIndex).Value) 

End Function 

Nun, was passiert, ist, dass ein Typ-Fehlanpassungsfehler occures auf der Linie, wo aktuelle Zeile Balance zu result obwohl hinzugefügt:

  • searchEndRow gleich 129 Zähler, und irgendwie gleich 130
  • Zellen unter dem aktuellen Adresse sind leer, aber irgendwie hielt sie Pass-Test für Länge und numerische Werte (ich an dieser Stelle zu debuggen, IsNumeric(ws.Cells(counter, codesColumnIndex).Value) kehrt true!

Jetzt bin ich einfach verwirrt und ich weiß nicht, was ich tun soll. Bitte helfen Sie.

+2

Die in einem 'für ... bis ... 'verwendete Variable ist immer die Grenze + 1 nach der Schleife. Das ist normal. – litelite

+2

'Cells.Value' gibt eine Variante zurück. Wenn es leer ist, kann es als Zahl (0) ausgegeben werden und ist somit numerisch. Auch das ist normal. – litelite

+0

@litelite, aber warum passiert Len (ws.Cells (counter, codesColumnIndex))> 0 Test? –

Antwort

1

Wie die Kommentatoren festgestellt haben, ist Cells(...).Value ein Variant. Dies bedeutet, dass Operatoren nicht auf wie erwartet angewendet werden können. Bei Tests, die Len oder andere Zeichenfolgenoperationen verwenden, wird ausdrücklich in eine Zeichenfolge konvertiert. Versuchen Sie beispielsweise anstelle von Len(ws.Cells(...))Len(CStr(ws.Cells(...).Value)). Auf diese Weise wissen Sie, dass Ihnen das Ergebnis liefert, das Sie erwarten.

In ähnlicher Weise, wo Sie result hinzufügen, verwenden Sie result = result + CDbl(ws.Cells(...).Value), um sicherzustellen, dass Sie Double Werte zusammen hinzufügen.

Um Ihre Frage zu Fehlern zu beantworten, die auf verschiedenen Computern unterschiedlich auftreten, habe ich am häufigsten festgestellt, dass es sich um die spezifischen Daten handelt. Wie einer der Kommentatoren darauf hingewiesen hat, ist Empty tatsächlich numerisch, da es implizit in 0 konvertiert wird! Als Ergebnis ist IsNumeric(Empty)True. Verwenden Sie CStr Wachen gegen das in Ihrem Code, da IsNumeric(CStr(Empty)) = IsNumeric("") = False. Die Verwendung von IsNumeric(CStr(...)) verhindert, dass Sie versuchen, 0# + "" hinzuzufügen, was ein Typenkonflikt ist. Vielleicht hat der Benutzer eine leere Zelle, die Sie nicht in Ihren Testdaten haben, und das verursacht das Problem. Das ist nicht die einzige Möglichkeit, nur diejenige, der ich am meisten begegnet bin.

Verwandte Themen