2016-06-20 12 views
0

In einigen Zellen meine Spalte dort erscheinen #VALUE! Worte und Formeln innen sind als Beispiel folgt:VBA Laufzeitfehler 13 Type Mismatch #VALUE

=IF(VALUE(RIGHT(CELL("nome.arquivo";A1);LEN(CELL("nome.arquivo";A1))-SEARCH("]";CELL("nome.arquivo";A1))))=1;1;1+INDIRECT(ADDRESS(329;COLUMN();;;VALUE(RIGHT(CELL("nome.arquivo";A1);LEN(CELL("nome.arquivo";A1))-SEARCH("]";CELL("nome.arquivo";A1))))-1))) 

Erwähnt Spalte ist CT. Nun, wenn ich versuche, die Zellen zu durchlaufen, wenn es zum ersten Mal zu #VALUE kommt! Ich erhalte eine Fehlermeldung:

Run Time Error 13, Type mismatch auf dieser Linie:

L = 9 
     Do While Cells(L, "CT").Value <> ""   '<========= HERE AN ERROR 
      L = L + 8 
     Loop 

Wie das beheben?

Antwort

1

Cells jede String Parameter nicht übernimmt, hat die Typenkonfliktfehler Sie bekommen nichts mit #VALUE zu tun/die Daten verarbeitet werden - weil der Code wird nie die Daten zu bewerten, da Cells zwei Integer Parameter will : dang das beißt mich jedes Mal - anscheinend Sie können String-Parameter in der Cells Funktion verwenden. Pfui.

So ist das Problem mit dem Vergleich der Wert "" - eine Zeichenfolge. #VALUE! ist keine gültige String-Funktion, so dass Sie dafür zur Rechenschaft ziehen müssen:

Dim theCell As Range 
Set theCell = Cells(L, "CT") 
If Not IsError(theCell.Value) Then 
    Do While Not IsEmpty(theCell.Value) 
     '... 
     L = L + 8 
    Loop 
End If 

Sie auch, dass die Funktionsaufruf richtig qualifizieren möchten:

Do While Not IsEmpty(ActiveSheet.Cells(L, "CT").Value) 

Auf diese Weise ist es explizite, dass Sie Betrachten einer Zelle im aktiven Arbeitsblatt; ein unqualifizierter Aufruf ist implizit dabei, und alles implizite ist möglicherweise verwirrend und fehleranfällig.

Sicherstellen, dass die Oberseite des Moduls sagt Option Explicit und dass L richtig erklärt wird:

Dim L As Long 

„L“ eine bedeutungslose Kennung ist, sollten Sie es nach der Benennung was Sie verwenden es für:

Dim currentRow As Long 
currentRow = 9 

Do While Not IsEmpty(ActiveSheet.Cells(currentRow, "CT")) 

Auf diese Weise wird Ihr Code viel einfacher zu lesen, zu folgen und zu verstehen.

+0

'Cells' akzeptiert zwei' Variant' Parameter und der zweite kann ein String sein (Spaltenname in der 'A1' Notation). 'Zellen (L," CT ") ist ein gültiger Anruf. – GSerg

+0

@GSerg Ich weiß, ich war gerade dabei, das zu bearbeiten ... beißt mich jedes Mal. Aber es ist hässlich. –

+0

Ich habe den gesamten Code getestet und funktioniert nicht - auch Typenkonfliktfehler. Ich habe diesen Weg gefunden, der gut funktioniert: Do While IsEmpty (Zellen (L, "CT"). Wert). Was denkst du über meinen Ansatz? –