2016-08-09 13 views
2

Ich Schleife in einem Array und überprüfen Zellenwerte, aber manchmal kann es passieren, dass die Zelle überprüft wird "# DIV/0!", dann bricht mein Makro. Wie man es ändert? Ich habe zwei Dinge ausprobiert, aber keinen positiven Effekt.Select Case Fehler 2007

vRange = Range(Cells(ShiftRow, 4), Cells(ShiftRow - 3, TheLastColumn)).Value 

Dim i As Integer 

For i = 4 To TheLastColumn 
    Select Case vRange(4, i) 
     Case Is = "#DIV/0!" 
      vRange(1, i) = "" 
     Case Is = "1" 
      vRange(1, i) = vRange(3, i) 
     Case Is = "2" 
      vRange(1, i) = vRange(3, i - 1) 
     Case Is = "3" 
      vRange(1, i) = vRange(3, i - 2) 
     Case Is = "I" 
      vRange(1, i) = vRange(3, i) 
     Case Is = "II" 
      vRange(1, i) = vRange(3, i - 1) 
     Case Is = "III" 
      vRange(1, i) = vRange(3, i - 2) 
     Case Else 
      vRange(1, i) = "" 

    End Select 
Next i 

Ich habe auch versucht: Case CVErr(xlErrDiv0).

+1

können Sie die Werte von 'vRange' im Fenster" Locals "überprüfen? Es scheint, als ob deine Schleife etwas wie "Für i = 1 bis UBound (vRange, 2)" sein sollte? 'Case CVErr (xlErrDiv0)' sollte der richtige Weg sein, also könnte der Fehler etwas anderes sein. – Slai

+0

Was passiert, wenn Sie 'If IsError (vRange (4, i)) und vRange (4, i) =" "' vor Ihrem Select Case? –

+0

@maers. Versuchen Sie die Fehlerabfrage in meiner Antwort unter –

Antwort

1

CStr([#DIV/0!]) gibt die Zeichenfolge "Error 2007" so können Sie diese den Code wie

ändern
vRange = Range(Cells(ShiftRow - 3, 4), Cells(ShiftRow, TheLastColumn)).Value ' the second cell is usualy the bottom right, but Excel takes care of that 
Dim i As Integer 

For i = 4 To UBound(vRange, 2) 
    Select Case CStr(vRange(4, i)) 
     Case "1", "I":  vRange(1, i) = vRange(3, i) 
     Case "2", "II": vRange(1, i) = vRange(3, i - 1) 
     Case "3", "III": vRange(1, i) = vRange(3, i - 2) 
     Case "Error 2007": vRange(1, i) = "" ' optional because Case Else can handle it 
     Case Else:   vRange(1, i) = "" 
    End Select 
Next i 
+0

Ich bin kein Experte (offensichtlich), aber es scheint wie die beste Lösung. Vielen Dank. – maers

0

Zellen, die einen Fehler enthalten, geben eine different data type (Variante des Untertypfehlers) als Nicht-Fehlerzellen zurück. Dies erschwert den Vergleich.

Ein Ansatz besteht darin, eine Case-Anweisung in eine andere zu verschachteln. Der äußere Fall prüft auf den Zellentyp (Fehler/Nicht-Fehler). Der innere Fall entscheidet, was zu tun ist, basierend auf dem Nicht-Fehler-Wert. Ich habe die TypeName function verwendet, um zu bestimmen, mit welchem ​​Datentyp ich arbeite.

Dieses Beispiel funktioniert mit der aktiven Zelle. Aktualisieren Sie die zu testenden Werte.

Sie könnten dieses Sub verbessern, indem Sie einen zweiten inneren Fall hinzufügen, der nach verschiedenen Fehlercodes sucht.

+0

Auch nützlich, danke! – maers

1

Versuchen zu stoppen die Fehler mit dem On Error Resume Next, und fügen Sie den folgenden Code anstelle des Select Case:

Dim i As Integer 

On Error Resume Next 
For i = 4 To TheLastColumn 

    Select Case vRange(4, i) 
     Case Is = "#DIV/0!" 
      If err.Number = 13 Then ' this is Error number 13 when deviding by zero 
       vRange(1, i) = "" 
       err.Clear 
      End If 

     Case Is = "1" 
      vRange(1, i) = vRange(3, i) 
     Case Is = "2" 
      vRange(1, i) = vRange(3, i - 1) 
     Case Is = "3" 
      vRange(1, i) = vRange(3, i - 2) 
     Case Is = "I" 
      vRange(1, i) = vRange(3, i) 
     Case Is = "II" 
      vRange(1, i) = vRange(3, i - 1) 
     Case Is = "III" 
      vRange(1, i) = vRange(3, i - 2) 
     Case Else 
      vRange(1, i) = "" 

    End Select 

Next i 
+0

Danke! Sowohl Sie als auch Remi hatten eine ähnliche Idee, ich werde mit einem von ihnen gehen. – maers

+0

@maers lassen Sie mich wissen, ob es für Sie funktioniert –