【问题标题】:Comparing the color of two cells and deleting the rows比较两个单元格的颜色并删除行
【发布时间】:2018-12-12 03:22:28
【问题描述】:

我正在尝试突出显示工作表单元格中包含相同红色字符串的两列中的单元格,然后删除包含具有两个红色单元格的行的所有行。

这是我到目前为止提出的。第一阶段有效,但后来我尝试比较两个单元格的颜色,但没有成功。

Option Explicit

Sub Macro1()

Dim WhatFor As String

WhatFor = InputBox("Enter your search word to highlight", "Search Criteria")
If WhatFor = Empty Then Exit Sub

Range("A1").Select
Selection.CurrentRegion.Select
Selection.FormatConditions.Add Type:=xlTextString, String:=WhatFor, _
  TextOperator:=xlContains
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority

With Selection.FormatConditions(1).Font
    .Color = -16383844
    .TintAndShade = 0
End With
With Selection.FormatConditions(1).Interior
    .PatternColorIndex = xlAutomatic
    .Color = 13551615
    .TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False

End Sub


Sub Macro2()

Dim i As Integer
Dim cell As Range

cell = ActiveWorkbook.ActiveSheet.Range

i = 1

Do While Cells("A, i").Value <> ""

    If cell("A, i").Interior And cell("F, i").Interior = 13551615 Then:      
        Rows(i).EntireRow.Delete
    End If

    i = i + 1

Loop

End Sub

【问题讨论】:

  • 给单元格着色完全没有意义?只需删除行
  • 您可能是对的,但是比较字符串的两个部分对我来说太复杂了。这些值实际上不是“相等”,但大多数时候“相似”。
  • 您是说删除行是在同一行中的不同单元格中多次找到指定字符串,并且该字符串在哪里匹配忽略大小写?它们作为单独的字符串存在,而不是较长字符串中的子字符串?字符串是单元格中唯一的项目吗?
  • 这告诉我你没有用你的代码为单元格着色。 ... 那么细胞是如何着色的呢?
  • @jsotola Macro1 代码正在为包含所需字符串(即Like "*" &amp; WhatFor &amp; "*")的单元格设置条件格式。

标签: excel vba


【解决方案1】:

您的代码中的错误在于您的 IF 语句:

  If (Cells(i, "A").Interior.Color = 13551615) And (Cells(i, "F").Interior.Color = 13551615) Then

应该是:

If (cell("A, i").Interior = 13551615) And (cell("F, i").Interior = 13551615) Then:

很遗憾,条件格式不会影响 .InteriorColor。它确实改变了单元格的颜色,但我们不能这样检查。

目前无法检查实际显示的颜色。

可以构建一个函数来模拟单元格的所有条件格式的条件,但只要 Microsoft 为条件格式添加另一种类型的条件,就必须更新该函数。可以找到一个非常好的示例:here:(请注意,此函数返回 colorindez 而不是颜色)


另一个逻辑问题是删除行的方式:

'This method does not check each row!
i = 1
Do While Cells(i, "A").Value <> ""
    If '<your condition>
        Rows(i).EntireRow.Delete
    End If
i = i + 1
Loop

假设i = 5,并且您想删除该行。 原来的第5行被删除,第6行变成第5行,第7行变成第6行,以此类推

然后 i 变为 6,然后您检查该行(最初是第 7 行 ...)

这样一来,原来的第 6 行就永远不会被检查...

在这种情况下,通常最好从最后一行开始,然后向上工作。或者您可以使用.rows 属性和FOR EACH 构造:

Dim row As Range

For Each row In [A1].CurrentRegion.Rows
  If Intersect(row, [B:B]).Value Like "*" & WhatFor  & "*" Then
    row.Delete
  End If
Next row

(此版本只检查1列,以B列为例)


但是,您的问题的答案是 jsotola 所说的: “给单元格着色完全没有意义?只需删除行”——jsotola 17 分钟前


如果我想删除行而不给单元格着色 - 基本代码应该如何?我需要比较“搜索”中的单元格而不是“相等”。仅比较每个单元格中的部分字符串。

谢谢 :-) - yaeer,1 分钟前

【讨论】:

  • OP 的代码中还有其他问题——"A, i" 的使用只是其中之一。 (这只是在您的答案中复制的一个,因此需要修复您的答案才能成为解决方案的一部分。)我注意到的另一个问题是Dim cell As Rangecell = ActiveWorkbook.ActiveSheet.Range。那是我放弃寻找的时候。
  • 您可能是对的,但是比较字符串的两个部分对我来说太复杂了。这些值在现实中并不“相等”,但大多数时候“相似”。 – yaeer 2 分钟前编辑
  • 另外,答案中的代码仍然是单行If(由于末尾有:),并且会导致“End If without block If”语法错误。所以我建议你也解决这个问题。
  • @YowE3K 是的,我明白了。试图弄清楚如何以一种真正有助于yaeer的方式更正这部分代码......
  • @YowE3K 显然它不会影响.Interior.Color - 我会再看看这个......
猜你喜欢
  • 1970-01-01
  • 2018-10-06
  • 2023-02-16
  • 2016-05-17
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多