2017-01-02 2 views
0

Ich bin ziemlich neu in VBA und habe es schwer, den folgenden Codeblock zu debuggen. Mein Ziel ist es, einige der Zeilen (etwa 5% von ihnen) im aktiven Arbeitsblatt basierend auf dem Inhalt der Zellen in Spalte 7 farblich zu kennzeichnen. Fehlercode ist Laufzeitfehler '1004': Anwendungsdefinierter oder objektdefinierter Fehler. Jede Hilfe oder Hinweise würden sehr geschätzt werden.Farbcodieren des Arbeitsblatts mit For .. Next Loop und Select Case?

Edit: lastRow funktioniert gut in anderen Blöcken des Codes, und es wird früher im Programm deklariert und zugewiesen, so dass ich derzeit nicht vermuten, dass es das Problem ist.

' Color code data based on strings or numbers found in column 7 
    Dim lastRow as Integer 
    lastRow = 9,000 
    Dim blockStatus As Variant 

    For blockRow = 3 To lastRow 
' the following row triggers runtime error  
    blockStatus = ActiveWorkbook.ActiveSheet.Range(Cells(blockRow, 7)).Value 
     Select Case blockStatus 
      Case Is = "ADMIN*" 
      Range(Cells(blockRow, 1), Cells(blockRow, 11)).Font.Bold = True 
      Case Is = "OTHER*" 
      Range(Cells(blockRow, 1), Cells(blockRow, 11)).Font.Color = RGB(192, 0, 0) 
      Case Is = "*@*" 
      Range(Cells(blockRow, 1), Cells(blockRow, 11)).Font.Color = RGB(0, 176, 80) 
      Case Else 
     End Select 
    Next blockRow 
+0

Sie müssen *** *** lastRow *** einen Wert zuweisen. Deshalb sterben die 'Cells()'. –

+0

Entschuldigung, ich habe den Code hier bearbeitet, um das zu lösen. In dem vollständigen Makroprogramm wird lastRow deklariert und zugewiesen, bevor das Programm zu diesem Block gelangt. – FrogLegs

+0

Versuchen Sie BlockStatus = ActiveWorkbook.ActiveSheet.Range (Cells (BlockRow, 7)) zu ändern. Wert zu BlockStatus = ActiveSheet.Cells (BlockRow, 7) – Absinthe

Antwort

0

Absinth Kommentar löst Ihre Fehler (die Parameter für einen Bereich kann entweder eine Adresse oder zwei Zellen sein).

Ich glaube, warum Ihr Code dann nicht tut, was Sie erwarten, ist, dass Sie Ihre Case Anweisung ausführen eine Like Operation auf den genannten Strings.

Wenn ja, Ihren Code wie folgt ändern:

With ActiveSheet 
    For blockRow = 3 To lastRow 
     blockStatus = .Cells(blockRow, 7).Value 
     With .Range(.Cells(blockRow, 1), .Cells(blockRow, 11)) 
      Select Case True 
       Case blockStatus Like "ADMIN*" 
        .Font.Bold = True 
       Case blockStatus Like "OTHER*" 
        .Font.Color = RGB(192, 0, 0) 
       Case blockStatus Like "*@*" 
        .Font.Color = RGB(0, 176, 80) 
       Case Else 
      End Select 
     End With 
    Next blockRow 
End With 

(Anmerkung:. Es ist nicht möglich, ein Case Like "ADMIN*" zu tun, weshalb ich das eher nicht intuitiv benutzt habe Select Case True mit Case Aussagen wie Case blockStatus Like "ADMIN*")