2010-11-19 9 views
1

Ich bekomme Laufzeitfehler 13. Typenkonflikt Aber ich kann nicht herausfinden, warum. Irgendeine Hilfe?Getting "Fehler: Typ nicht übereinstimmen" in VBA

Sub Separate_with_OR_without_comission() 

Dim I As Integer 
Dim WRng As Range 
Dim NoRng As Range 
Dim NameRgn As Range 
Dim TotalCRng As Range 

Set WRng = Range("with_comission") 
Set NoRng = Range("without_comission") 
Set NameRgn = Range("total_comission_name") 
Set TotalCRng = Range("ttotal_comission") 

For I = 1 To NameRgn.Rows.Count 
    If TotalCRng.Rows(I) > 0 Then   // ERROR HERE 
     WRng.Rows(I) = NameRgn.Rows(I) 
    End If 
    If TotalCRng.Rows(I) < 1 Then   // AND HERE 
     NoRng.Rows(I) = NameRgn.Rows(I) 
    End If 
Next I 
End Sub 

Wenn ich versuche, andere Testzellen zu verwenden, ist in Ordnung, das Problem ist mit denen, .... aber sie sind Zahlen in „ttotal_comission“ warum VBA nimmt es als etwas anderes?

+0

Was vergleichen Sie hier "TotalCrng.Rows (I)> 0" der Index der Zeile oder ein Zellwert? – Arseny

Antwort

3

Das Problem ist, dass Rows(I) ein Range-Objekt zurückgibt, nicht ein Integer-Wert. Sie sollten Ihre Aussagen vollständig wie folgt qualifizieren: TotalCRng.Rows(I).Cells(1, 1).Value oder möglicherweise TotalCRng.Cells(1, 1).Value. Geschrieben, wie es ist, wird Excel den Wert aus Zeilen (I) zurückgeben, wenn es sich um eine einzelne Zelle handelt. In diesem Fall wird die value -Eigenschaft des Bereichs aufgerufen, aber ansonsten wird der Type Mismatch-Fehler angezeigt, den Sie sehen, weil Sie es sind Versuch, einen Bereich mit einer Ganzzahl zu vergleichen.

Beispiel:

'no error 
Debug.Print Sheet1.Range("B1") 

'type mismatch error 
Debug.Print Sheet1.Range("B1:B12") 

auch zu beachten, dass nur die obere linke Zelle eines fusionierten Bereich tatsächlich einen Wert zurückgeben.

2

könnten Sie verwenden ein Konstrukt wie folgt verwenden:

for each c in range("rangeName1") 
    'if the source range is 3 columns to the right, same row' 
    c = c.offset(0,3).value 
next c 
0

Wenn Sie versuchen, den Wert der Zellen in jeder Zeile zu überprüfen, müssen Sie die Zellen durchlaufen und die Werte einzeln vergleichen.

Wenn die Bereiche nur einzelne Spalten sind, können Sie jede Zelle für denselben Effekt durchschleifen, anstatt eine Schleife durch jede Zeile zu führen.

For I = 1 To NameRgn.Rows.Count 
    For j = 1 to NameRgn.rows(I).cells.count 
    If TotalCRng.Rows(I).cells(j).value > 0 Then   // ERROR HERE 
     WRng.Rows(I).cells(j) = NameRgn.Rows(I).cells(j) 
    End If 
    If TotalCRng.Rows(I).cells(j).value < 1 Then   // AND HERE 
     NoRng.Rows(I).cells(j) = NameRgn.Rows(I).cells(j) 
    End If 
    Next j 
Next I 
Verwandte Themen