【问题标题】:Hide rows and columns if cell font color如果单元格字体颜色隐藏行和列
【发布时间】:2021-10-08 13:30:53
【问题描述】:

如果单元格字体颜色不是 VBRed,我有一部分代码应该隐藏行和列。 它可以工作,但会隐藏范围内的所有行和列,包括字体颜色为 VBRed 的行和列。任何线索这里有什么问题?一样的快乐

With shtDE
    For s = DErow + 2 To lrDE
        For ss = DEcolIndx + 2 To LcolDE
    
            Set rng1 = .Range(.Cells(s, ss), .Cells(s, ss))
            If rng1.Font.Color = vbRed > 0 Then
                rng1.EntireRow.Hidden = False
            Else
                rng1.EntireRow.Hidden = True
            End If
        Next ss
    Next s
End With


With shtDE
    For ss = DEcolIndx + 2 To LcolDE
        For s = DErow + 2 To lrDE
            Set rng1 = .Range(.Cells(s, ss), .Cells(s, ss))
            If rng1.Font.Color = vbRed > 0 Then
                rng1.EntireColumn.Hidden = False
            Else
                rng1.EntireColumn.Hidden = True
            End If
        Next s
    Next ss
End With

【问题讨论】:

  • 红色是否应用了条件格式?
  • > 0 在您的 If 声明中的意义何在?这可能会评估为False
  • 你在混合ColorIndexColor,不要那样做。但是,是的,真正的问题是> 0vbRed > 0 始终是 True。所以你的If 等同于If rng1.Font.Color = True
  • Set rng1 = .Range(.Cells(s, ss), .Cells(s, ss)) 是多余的,仅相当于 .Cells(s, ss)
  • 我想我明白了,但我仍然需要用简单的语言表达它以确保我们在同一页面上:最终目标是让所有具有 vbRed 颜色字体的单元格都可见,对吗?因此,如果整个行/列是非红色字体,您只隐藏行/列?在这种情况下,对代码最简单的修改是在 .Hidden = False 两行代码之后添加 Exit For(免责声明:未经测试)。如果对性能时间有疑问,我可能会提出不同的建议(可能会有一些不必要的隐藏),但这应该会得到最终结果。

标签: excel vba loops


【解决方案1】:

由于目标是让所有单元格以 vbRed 作为字体颜色(以及包含这些单元格的行/列),因此您的代码中有两个要点需要解决:

  1. If 语句有一个尾随 > 0,这将导致它们评估为 False

  2. 代码循环遍历所有单元格,最终结果将基于它检查的最后一个单元格。

以下内容应解决这两个问题:

With shtDE
    For s = DErow + 2 To lrDE
        For ss = DEcolIndx + 2 To LcolDE
    
            Set rng1 = .Range(.Cells(s, ss), .Cells(s, ss))
            If rng1.Font.Color = vbRed Then
                rng1.EntireRow.Hidden = False
                Exit For 'once a cell is found leave the row visible and go to next row
            Else
                rng1.EntireRow.Hidden = True
            End If
        Next ss
    Next s
End With


With shtDE
    For ss = DEcolIndx + 2 To LcolDE
        For s = DErow + 2 To lrDE
            Set rng1 = .Range(.Cells(s, ss), .Cells(s, ss))
            If rng1.Font.Color = vbRed Then
                rng1.EntireColumn.Hidden = False
                Exit For ' same as above but for column
            Else
                rng1.EntireColumn.Hidden = True
            End If
        Next s
    Next ss
End With

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2012-05-24
    • 2022-06-15
    相关资源
    最近更新 更多