复杂如果声明VBA

时间:2016-09-26 16:54:22

标签: vba excel-vba if-statement for-loop excel

全部,

我有以下条件格式规则。如果单元格的条件格式为TRUE,我想用于将数据提取到另一个工作表(CM)。

然而,阅读几个论坛已经很明显,VBA无法检测条件格式化单元格何时为“TRUE”。

或者作为解决方法,我想将下面的语句放入if语句中。 (我的条件格式化语句)

我有两个条件格式语句 层次结构中的第一个是; (显示红色)

= AND(F1> D1,OR((S1 / D1)> = 1.15,T1> = 200000))

层次结构中的第二个是;(显示橙色)

= F1> D1

任何人都可以建议这样做的方式。 (我似乎很难将AND / OR语句放入VBA)

Dim LR As Long
LR = Range("A1048576").End(xlUp).Row
For X = 9 To LR Step 1
If Range("F" & X).Interior.ColorIndex = 3 OR Range("F" & X).Interior.ColorIndex = 45 Then

Dim LR1 As Long
LR1 = CM.Range("A1048576").End(xlUp).Row
RP.Range("B" & X, "D" & X).Copy
CM.Range("A" & LR1 + 1, "C" & LR1 + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

RP.Range("S" & X, "T" & X).Copy
CM.Range("D" & LR1 + 1, "E" & LR1 + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Else
End If
Next X

还有一种方法可以告诉IF语句的哪一部分是真的,因为我想在满足红色条件时勾选“严重”框,如果满足琥珀色条件则勾选“非严重”。

为上下文添加了图片 enter image description here

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

根据我的评论,您可以使用DisplayFormat获取条件格式颜色。

另外,建议只在想要值时跳过剪贴板并直接指定值:

Dim LR As Long
Dim LR1 As Long
LR = Range("A1048576").End(xlUp).Row
For x = 9 To LR Step 1
    If Range("F" & x).DisplayFormat.Interior.ColorIndex = 3 Or Range("F" & x).DisplayFormat.Interior.ColorIndex = 45 Then
        LR1 = CM.Range("A1048576").End(xlUp).Row
        CM.Range("A" & LR1 + 1, "C" & LR1 + 1).value = RP.Range("B" & x, "D" & x).value
        CM.Range("D" & LR1 + 1, "E" & LR1 + 1).value = RP.Range("S" & x, "T" & x).value
    End If
Next x

如果你想避免颜色测试,你的两个公式有一个共同点=F1>D1

只要这是真的,它就会返回true。第一个公式是一个更具体的形式,但仍依赖于此。

所以我们只需要测试那个。

Dim LR As Long
Dim LR1 As Long
LR = Range("A1048576").End(xlUp).Row
For x = 9 To LR Step 1
    If Range("F" & x).value > Range("D" & x).value Then
        LR1 = CM.Range("A1048576").End(xlUp).Row
        CM.Range("A" & LR1 + 1, "C" & LR1 + 1).value = RP.Range("B" & x, "D" & x).value
        CM.Range("D" & LR1 + 1, "E" & LR1 + 1).value = RP.Range("S" & x, "T" & x).value
    End If
Next x

答案 1 :(得分:0)

我喜欢Scott Craner的回答,这可能是更好的方式。

您询问是否可以确定条件格式是否已解析为True,答案是肯定的。困难在于Excel有一些复杂的条件格式规则,您需要一些编码才能涵盖每个场景。下面的代码显示了如何处理可能最常见的代码(即单元格值测试,如问题中所示),但如果您愿意,我可以为您扩展它。

如果您不断更改格式条件规则,我想这种方法会很方便,因为此代码会采用这些新规则:

Public Function EvaluatedFormatCondition(cell As Range) As Boolean
    Dim item As Object
    Dim res As Boolean

    For Each item In cell.FormatConditions
        If TypeOf item Is FormatCondition Then
            Select Case item.Type
                Case xlCellValue
                    Select Case item.Operator
                        Case xlEqual
                            res = (cell.Value = Evaluate(item.Formula1))
                        Case xlGreater
                            res = (cell.Value > Evaluate(item.Formula1))
                        Case xlLess
                            res = (cell.Value < Evaluate(item.Formula1))
                        Case xlGreaterEqual
                            res = (cell.Value >= Evaluate(item.Formula1))
                        Case xlLessEqual
                            res = (cell.Value < Evaluate(item.Formula1))
                        Case xlNotEqual
                            res = (cell.Value <> Evaluate(item.Formula1))
                        Case xlBetween
                            res = (cell.Value >= Evaluate(item.Formula1) And cell.Value <= Evaluate(item.Formula2))
                        Case xlNotBetween
                            res = (cell.Value < Evaluate(item.Formula1) Or cell.Value > Evaluate(item.Formula2))
                    End Select
            End Select
            If res And item.StopIfTrue Then
                EvaluatedFormatCondition = True
                Exit Function
            End If
        End If
    Next
    EvaluatedFormatCondition = res
End Function