2016-09-15 3 views
0

Ich möchte, dass dieser Makro den Bereich C6: N6 auswählt, eine Formatbedingung anwendet, Schritt 7 usw. bis zum Ende meiner Liste. Wenn ich es ausführe, bringt es mir einen Fehler bezüglich der Objekte.Anwenden der bedingten Formatierung auf Variablenbereich

Ich glaube, mein Problem auf den folgenden Teil ist:

For i = 6 To lastRow Step 7 
    Range(C & i, N & i).Select 

So kann ich die Bereiche variabel machen möchten. Unten ist mein Code:

Sub test1() 
' Coluna C 

Dim lastRow As Long 
lastRow = Cells(Rows.Count, 1).End(xlUp).Row ' Pega ultima celula com valores na coluna C 

For i = 6 To lastRow Step 7 
    Range(C & i, N & i).Select 'what am i missing? 

     With Selection.Interior 
     .Pattern = xlNone 
     .TintAndShade = 0 
     .PatternTintAndShade = 0 
    End With 
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _ 
     Formula1:="=0" 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .Color = 255 
     .TintAndShade = 0 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 


Next i 


End Sub 
+0

Ihr Code berücksichtigt sowohl 'C' als auch' N' als Variablen, wenn sie als Literale betrachtet werden sollen. Dazu müssen Sie sie in doppelte Anführungszeichen setzen ('' '). Versuchen Sie, sie zu' Range ("C" & i, "N" & i) zu ersetzen. Wählen Sie ". Und warum nicht mit dem gesamten Bereich auf einmal arbeiten Stattdessen könntest du das 'For' entfernen und einfach mit etwas wie' Range ("C6", "N" & lastRow) arbeiten. Wähle " –

+0

Wie habe ich das nicht gesehen? Hehe. Funktioniert super, danke! – Serveira

+0

@ VictorMoraes - eigentlich empfehle ich Serveira [vermeiden '.Select'] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) vollständig. Es wird sparen (Aber ich stimme deinem allgemeinen Punkt zu, mit dem Bereich auf einmal zu arbeiten) – BruceWayne

Antwort

0

Statt diese in Kommentare zu halten, hier ist eine Antwort auf Ihr Problem.
Ihr Code berücksichtigt sowohl C als auch N als Variablen, wenn sie als Literale betrachtet werden sollen. Dazu müssen Sie sie in doppelte Anführungszeichen setzen ("). Also statt

Range(C & i, N & i).Select 

benötigen Sie

Range("C" & i, "N" & i).Select 

tun Es gibt auch ein Problem mit Ihrer lastRow Zuordnung. Basierend auf Ihre Kommentare Sie die letzte Zelle mit Werten aus Spalte C, die Spalte 3 ist erhalten möchten, aber Sie übergeben den falschen Index für colum hier:

lastRow = Cells(Rows.Count, 1).End(xlUp).Row ' Pega ultima celula com valores na coluna C 

Stattdessen sollten Sie

verwenden
lastRow = Cells(Rows.Count, 3).End(xlUp).Row ' <-- column C is index 3 

ich füge dies, weil Sie Fragen, wenn Sie Ihre Spalte A oder hat nicht richtig gefüllt finden möglicherweise nicht die gleiche Menge an Daten wie die gewünschten Spalte C

Außerdem wie von BruceWayne stark vorgeschlagen (off topic: nice username, übrigens), sollten Sie avoid .Select vollständig in Ihrem Code. Sie können mit With Blöcken ähnlich wie dem, was Sie bereits tun, arbeiten und auch den richtigen Verweis auf Ihre Zellen und Bereiche verwenden, anstatt sich auf das aktive Arbeitsblatt zu verlassen. Damit erhalten Sie einen Code, der dem folgenden ähnelt:

Sub test1() 
' Coluna C 

    Dim lastRow As Long 
    With ThisWorkbook.Worksheets("YourSheetName") 
     lastRow = .Cells(.Rows.Count, 3).End(xlUp).row ' Pega ultima celula com valores na coluna C 

     For i = 6 To lastRow Step 7 
      With .Range("C" & i, "N" & i) 

       With .Interior 
        .Pattern = xlNone 
        .TintAndShade = 0 
        .PatternTintAndShade = 0 
       End With 
       .FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _ 
        Formula1:="=0" 
       .FormatConditions(.FormatConditions.Count).SetFirstPriority 
       With .FormatConditions(1).Interior 
        .PatternColorIndex = xlAutomatic 
        .Color = 255 
        .TintAndShade = 0 
       End With 
       .FormatConditions(1).StopIfTrue = False 
      End With 

     Next i 
    End With 

End Sub 
+0

Das sieht gut aus, danke! Wie es ist war nur eine Woche, seit ich angefangen habe, mich an Code zu orientieren, ist es für mich unvermeidlich, '' Select' zu verwenden, es sieht so viel einfacher aus, ahah. Wie ich sehe, ist es am besten, es vollständig vom Anfang an zu vermeiden, also werde ich mir deinen Code genau ansehen und sehen, wie er von meinem verbessert wird. Danke vielmals! – Serveira

Verwandte Themen