2016-10-14 5 views
0

Der folgende Code bestimmt wird, um die Zellebedingte Formatierung auf einen Bereich Anwenden anstelle der Einzelzelle

  • zu formatieren, wenn der eingegebene Wert No ist und
  • Wenn der Wert der Zelle in derselben Reihe und bevor einige Spalten in dem sshDevices Array

    Function sshProblem(rng As Range) As Boolean 
    
    Dim portStatus As String 
    portStatus = rng.Value 
    
    Dim deviceType As String 
    deviceType = Cells(ActiveCell.Row, 3).Value 
    
    Dim sshDevices As Variant 
    sshDevices = Array("linux", "vmw", "docker", "unix") 
    
    If StrComp(portStatus, "No") = 0 Then 
        If StrComp(deviceType, sshDevices(1)) = 0 Then 
        sshProblem = True 
        End If 
    End If 
    
    End Function 
    

aufgeführt Denn jetzt bin ich nur den Wert von device vergleichen gegen das zweite Element im Array. Die Formatierung funktioniert ordnungsgemäß, wenn der Gerätetyp übereinstimmt und wenn der Inhalt Nein ist. Das Problem ist, dass wenn der Inhalt Nein ist und der Gerätetyp nicht übereinstimmt, alle Zellen in der Spalte ihr Format verlieren. Zum Beispiel:

Ich trete „Nein“ in Zeile 8 und die Zelle richtig mit rosaem Hintergrund formatiert ist: enter image description here

Dann mache ich das gleiche mit den Spalten 9 und 10: enter image description here

Aber wenn Ich komme zu 10, ich gebe "Nein" in die Zelle ein, aber jetzt stimmt der Wert der vorherigen Zelle "ubuntu" nicht mit dem Wert von Position 1 des Arrays überein, also würde ich erwarten, dass die Zelle keinen rosa Hintergrund hat, jedoch alle frühere Zellen verlieren ihren Hintergrund, wenn ich "Nein" eingib: enter image description here

Die Einstellungen für bedingte Formatierung wie folgt aussehen (die Spalte Buchstaben ‚I‘): enter image description here

enter image description here

Ich weiß nicht, ob mein Problem (rng As Range) wird behauptet oder wenn es die Art, wie ich die Einrichtung Regel für bedingte Formatierung Ideen?

Antwort

0

Wenn sshProblem in einem regulären Modul ist, verweisen alle Zellen/Bereiche standardmäßig auf das ActiveSheet, nicht unbedingt auf das Blatt, von dem Sie die Funktion aufrufen.

Auch ActiveCell ist nichts hier - wenn Sie die Zelle aus, wo die Formel verweisen möchten genannt wird, verwenden Application.Caller

Schließlich können Sie Application.Match zu testen, ob ein Wert in einem Array enthalten ist.

Function sshProblem(rng As Range) As Boolean 

    Dim portStatus As String, sht As WorkSheet 
    Dim rw as Long 

    Set sht = rng.WorkSheet 
    portStatus = rng.Value 

    Dim deviceType As String 

    rw = Application.Caller.Row 

    deviceType = sht.Cells(rw, 3).Value 

    Dim sshDevices As Variant 
    sshDevices = Array("linux", "vmw", "docker", "unix") 

    If StrComp(portStatus, "No") = 0 Then 
     sshProblem = Not IsError(Application.Match(deviceType, sshDevices, 0)) 
    End If 

End Function 
+0

Vielen Dank. Ich habe mir das Application.Caller.Row ausgeliehen und es anstelle von ActiveCell eingefügt, gespeichert und es erneut versucht, kein Glück. Dann habe ich die 2 If-Anweisung mit Ihrem "Not IsError (Application.Match (deviceType, sshDevices, 0))" Teil ersetzt und das hat den Trick gemacht. Du schaukelst. –

Verwandte Themen