条件格式应用于范围而不是单个单元格

时间:2016-10-14 20:31:05

标签: excel vba excel-vba excel-formula

以下代码用于格式化单元格

  • 如果输入的值为No和
  • 如果sshDevices数组中列出了同一行和前一些列中的单元格的值

    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
    

现在我只是将deviceType的值与数组中的第二个元素进行比较。如果设备类型匹配且内容为否,则格式化正常。问题是当内容为“否”且设备类型不匹配时,列中的所有单元格都会丢失其格式。例如:

我在第8行输入“No”,并且单元格的格式正确为粉红色背景: enter image description here

然后我对第9列和第10列做同样的事情: enter image description here

但是当我到达10时,我在单元格中输入“No”但现在前一个单元格“ubuntu”的值与数组的位置1的值不匹配,所以我希望该单元格不具有粉红色的背景,但是当我输入“No”时,所有以前的单元格都会松开背景: enter image description here

条件格式设置如下所示(列字母为'I'): enter image description here

enter image description here

我不知道我的问题是说明(rng As Range)还是我设置条件格式规则的方式。想法?

1 个答案:

答案 0 :(得分:0)

如果sshProblem在常规模块中,则默认情况下任何Cells / Range将引用ActiveSheet,而不一定是您正在调用该函数的工作表。

此外,此处ActiveCell没有用 - 如果您想引用调用公式的单元格,请使用Application.Caller

最后,您可以使用Application.Match来测试数组中是否包含值。

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