2016-12-19 5 views
3

Ich habe mehrmals gelesen, dass GoTo in Codes vermieden werden sollte, aber ich muss regelmäßig Schleifen erstellen und wenn ein Element mir einen Fehler gibt, wird der Code gestoppt.Wie kann ich VBA vermeiden?

Im folgenden Fall muss ich Zellenwerte vergleichen, aber ich bekomme einen Fehler, wenn ich in der Zelle String gibt.

Haben Sie eine andere Option, um den GoTo für den folgenden Code zu vermeiden?

Danke!

Sub Conditional() 

     Dim x As Integer 



     For x = 1 To 31 



      On Error GoTo na 


      If Sheets("Sheet1").Cells(8 + x, 5) >= 0.95 Then 

       Sheets("Sheet2").Shapes("Shape " & x).Fill.ForeColor.RGB = RGB(0, 176, 80) 

      ElseIf Sheets("Sheet1").Cells(8 + x, 5) < 0.95 Then 

       Sheets("Sheet2").Shapes("Shape " & x).Fill.ForeColor.RGB = RGB(255, 0, 0) 

      End If 

      GoTo nextx 

na: 

      Sheets("Sheet2").Shapes("Shape " & x).Fill.ForeColor.RGB = RGB(0, 0, 0) 
      On Error GoTo -1 

nextx: 
     Next x 

End Sub 
+0

Korrekte Fehlerbehandlung/Fehlerbehandlung ist möglicherweise die beste Option. –

Antwort

3

In diesem Fall, wenn Sie für die Zeichenfolge in der Zelle überprüfen wollen, ist es wie folgt aus:

Sub Conditional() 

    Dim x As Long 

    For x = 1 To 31 
     If IsNumeric(Sheets("Sheets1").Cells(8 + x, 5)) Then 
      If Sheets("Sheet1").Cells(8 + x, 5) >= 0.95 Then 

       Sheets("Sheet2").Shapes("Shape " & x).Fill.ForeColor.RGB = RGB(0, 176, 80) 

      ElseIf Sheets("Sheet1").Cells(8 + x, 5) < 0.95 Then 

       Sheets("Sheet2").Shapes("Shape " & x).Fill.ForeColor.RGB = RGB(255, 0, 0) 

      End If 
     End If 
    Next x 
End Sub 

Generell sollte goto Fehler zu kontrollieren, wie On Error GoTo ErrorHandler mit nicht nur verwendet werden für Ausgüsse.

+0

'IsNumeric()' kann unter bestimmten Umständen fehlschlagen und 'True' (=" es ist eine Zahl ") für etwas zurückgeben, das nicht wirklich eine Zahl ist. Zum Beispiel würde 'IsNumeric (" 1..23 ")' 'True' zurückgeben. Während 'SpecialCells (.., xlNumbers)' würde _real_ Zahlen zurückgeben. Siehe meine Antwort unter – user3598756

+0

Können Sie '? Isnumeric (Bereich (" A3 "))' 'versuchen und mir sagen, was Sie bekommen, wenn Sie' 1..23' in die Zelle setzen? – Vityata

+0

es gibt 'True' zurück – user3598756

1

da Sie einige Formatierungen tun abhängig von Zellen Typ (text oder numbers), dann könnten Sie SpecialCells() Methode von Range-Objekt verwenden und eine Funktion geben Sie wie folgt vor:

Function GetCells(rng As Range, cellType As XlCellType, cellValues As XlSpecialCellsValue, outputRng As Range) As Boolean 
    On Error Resume Next '<--| ignore subsequent errors, if any 
    Set outputRng = rng.SpecialCells(cellType, cellValues) '<--| get a sub-range out of passed range as filtered by passed arguments 
    GetCells = Not outputRng Is Nothing '<--| returns 'True' if range has been properly set 
End Function 

und es ausnutzen wie folgt :

Sub Conditional() 
    Dim myCells As Range, cell As Range 

    With Sheets("Sheet 1").Range("E9:E39") '<--| reference your sheet relevant range   
     If GetCells(.Cells, xlCellTypeConstants, xlNumbers, myCells) Then '<--| if any cells whose value is a "constant" "number" in your range 
      For Each cell In myCells '<--| loop through those filtered cells 
       Sheets("Sheet2").Shapes("Shape " & cell.row - 8).Fill.ForeColor.RGB = IIf(cell.Value >= 0.95, RGB(0, 176, 80), RGB(255, 0, 0)) '<--| format your shapes as per corresponding current cell 
      Next cell 
     End If 

     If GetCells(.Cells, xlCellTypeConstants, xlTextValues, myCells) Then '<--| if any cells whose value is a "constant" "text" in your range 
      Sheets("Sheet2").Shapes("Shape " & cell.row - 8).Fill.ForeColor.RGB = RGB(0, 0, 0) '<--| format your shapes as per corresponding current cell 
     End If 
    End With 
End Sub 
Verwandte Themen