选择具有OR的案例

时间:2017-05-22 13:58:56

标签: vba

我试图设置一个条件格式,如果我的单元格中的值不等于item1或item2或item3,那么它会突出显示它。代码突出显示我的单元格,即使该值等于其中一个项目。所以我有一个可以选择的项目列表,但如果该值不等于列表中的某个项目,那么它会突出显示它。这是我目前的代码:

import * as jQuery from 'jquery';
import * as knobObj from 'jquery-knob';

3 个答案:

答案 0 :(得分:1)

以逗号分隔:

Case Is <> item1, item2, item3, item4, item5, item6, item7, item8, _
           item9, item10, item11, item12

但是使用不同的数据结构可能更好,这样您就不需要继续添加item个变量了:

Dim coll as New Collection

coll.Add Me.Range("l5").Value2
coll.Add Me.Range("m5").Value2
coll.Add Me.Range("n5").Value2
coll.Add Me.Range("o5").Value2
coll.Add Me.Range("p5").Value2
coll.Add Me.Range("q5").Value2
coll.Add Me.Range("r5").Value2
coll.Add Me.Range("l7").Value2
coll.Add Me.Range("m7").Value2
coll.Add Me.Range("n7").Value2
coll.Add Me.Range("o7").Value2
coll.Add Me.Range("p7").Value2

然后使用类似描述here的函数来测试集合中是否存在该值。

If Len(v) > 0 Then
    If Not colItmExists(coll, v) Then
        'Do something, or not...
    End If

功能:

Function colItmExists(col As Collection, itm) As Boolean
    Dim i, ret As Boolean
    For i = 1 To col.Count
        If col(i) = itm Then
            ret = True
            Exit For
        End If
    Next
    colItmExists = ret
End Function

答案 1 :(得分:1)

尝试这样的事情。该方法仍然有些缺陷(因为您循环遍历单元格),但它应该可以满足您的需求。

这背后的方法很简单,如果单元格值与现有标准之一匹配则不执行任何操作。如果它与它们中的任何一个都不匹配,它将默认为Case Else,它将NewColor设置为3。

另一件值得注意的事情是NewColor从未在原始版本中重置为xlNone。这可能会导致问题(因为当单元格的len为0时,它只返回到xlNone。

最后,我清理了代码名称和结构。尝试使变量名称更具描述性,并完全限定所有内容(不要依赖Double foo = bar.Range("baz"),因为这将不可避免地让你失望)。

Sub Reformat()
Dim TargetRange As Range
Set TargetRange = Intersect(Target, Me.Range("d24:d109"))

Application.EnableEvents = False
Dim cell As Range
Dim NewColor As Variant
If Not material Is Nothing Then
    For Each cell In material.Cells
        If Len(cell.value) > 0 Then
            Select Case cell.value
                Case Is = Me.Range("L5").value
                Case Is = Me.Range("M5").value
                Case Is = Me.Range("N5").value
                Case Is = Me.Range("O5").value
                Case Is = Me.Range("P5").value
                Case Is = Me.Range("Q5").value
                Case Is = Me.Range("R5").value
                Case Is = Me.Range("L7").value
                Case Is = Me.Range("M7").value
                Case Is = Me.Range("N7").value
                Case Is = Me.Range("O7").value
                Case Is = Me.Range("P7").value
                Case Else
                    NewColor = 3
            End Select
        Else
            NewColor = xlNone
        End If
        cell.Interior.ColorIndex = NewColor
        NewColor = xlNone
    Next cell
End If
Application.EnableEvents = True
End Sub

答案 2 :(得分:0)

我想我终于追查了这个问题。值得注意的是,在我解释之前,您将来希望尝试单步执行代码。断点,'Debug.Print'和F8有很大的不同。

在这种情况下,您的纸卷ID与您的输入值不同。您在L7中的掷骰ID为70030908,请注意两侧的空白。如果我做'Debug.Print ws.Range(“L7”)。值= 70030908`我得到假。这是因为,虽然两者看起来大致相同,但它们并不相同。再次注意第一个数字两边的空格。要解决此问题,请使用显式类型转换:

Dim TargetRange As Range
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Componentlog")
Set TargetRange = Intersect(Target, ws.Range("D24:D" & ws.Rows.Count))

Application.EnableEvents = False
Dim cell As Range
Dim NewColor As Variant

If Not TargetRange Is Nothing Then
    For Each cell In TargetRange.Cells
        If Len(cell.Value) > 0  and IsNumeric(cell.Value) Then
            Select Case CDbl(cell.Value)
                Case CDbl(ws.Range("L5").Value)
                Case CDbl(ws.Range("M5").Value)
                Case CDbl(ws.Range("N5").Value)
                Case CDbl(ws.Range("O5").Value)
                Case CDbl(ws.Range("P5").Value)
                Case CDbl(ws.Range("Q5").Value)
                Case CDbl(ws.Range("R5").Value)
                Case CDbl(ws.Range("L7").Value)
                Case CDbl(ws.Range("M7").Value)
                Case CDbl(ws.Range("N7").Value)
                Case CDbl(ws.Range("O7").Value)
                Case CDbl(ws.Range("P7").Value)
                Case Else
                    NewColor = 3
            End Select
        Else
            NewColor = xlNone
        End If
        cell.Interior.ColorIndex = NewColor
        NewColor = xlNone
    Next cell
End If
Application.EnableEvents = True

这样,我们强制输入值为Double,并强制将checked值设为Double。 CDBL很乐意使用"1234"之类的字符串,并将其转换为1234。在您需要的情况下,它将确保输入值和检查值都能匹配。

然后宏运行得很好。