【问题标题】:Copy paste entire row if the cell has red/green/Yellow color in excel如果单元格在excel中具有红色/绿色/黄色,则复制粘贴整行
【发布时间】:2018-10-27 00:44:47
【问题描述】:

我有一个表,其中包含基于月度和产品的值,如下所示(例如“sheet1”)。此表应用了条件格式以根据目标突出显示单元格颜色红色/黄色/绿色。因此,我只想获取特定月份(当前月份 - 5 月)列,并希望 VBA 检查该列中的任何单元格是否为红色,选择整行并将其复制到另一张表中,例如带有标题的“Sheet2”。

Product   =  Target   Feb Mar Apr May
Wood     >=    5      10  10  10  10
wood     >=    5      28  28  28  28
Tree     >=   12      30  45  60  68
plastic  >=   45      50  50  50  50
tree     >=   50      50  50  50  50
iron     >=   100     64  75  75  80

这些值会每月变化,有时甚至是目标值,因此有时颜色可能完全是绿色/黄色/红色。因此,我想使用 VBA 自动执行此过程,每月检查“Sheet1”并拉出该月突出显示红色单元格的所有行。或者甚至按钮功能也可以提供帮助,因此我可以将此宏分配给按钮,此操作应通过单击按钮来完成。即使它也应该清除Sheet2中上个月的所有行,这些行可能在上个月突出显示,但在本月没有突出显示。

我尝试了不同的方法来做到这一点,它无法识别单元格颜色。当我使用表格中的随机/常规单元格并填充红色并使用 find(ctrl+f) 弹出框使用颜色格式突出显示时,它正在工作,但它不采用表格中具有条件格式的单元格。所以,我不知道是否有办法识别表格中使用 VBA 以红色突出显示的所有单元格。

【问题讨论】:

  • 这个答案应该为你指明方向……stackoverflow.com/a/50366447/4961700
  • @SolarMike 我认为这个答案对这个问题没有帮助。
  • 这里有几个选项:检查是否满足原始条件逻辑;使用辅助列;或检查单元格的DisplayFormat.Interior.Color
  • 另一个选项:使用AutoFilterOperator:=xlFilterCellColor(对于列)一次移动所有行
  • 你自己有没有为此做过任何工作?

标签: vba excel


【解决方案1】:

输入(在工作表 1 中):

输出(在工作表 2 中):

    Sub newnew()

声明工作表,应更改 Sheet2 和 Sheet3 以匹配您的工作表名称

    Dim ws As Worksheet
        Set ws = Sheets("Sheet2")

    Dim wsTwo As Worksheet
       Set wsTwo = Sheets("Sheet3")

清除 wsTwo 中以前的数据

    wsTwo.Cells.Clear

找到 ws 的最后一行和最后一列,里面有数据

    Dim lastRow As Integer
        lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim lastColumn As Integer
        lastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

我们在这里设置标题

    ws.Range("A1:F1").Copy
    wsTwo.Range("A1:F1").PasteSpecial xlPasteAll
    Application.CutCopyMode = False

从最后一行开始我们的循环并向上移动直到我们到达第 2 行。我们正在检查 rowNum 和 lastColumn 显示格式内部颜色是否为红色。如果是,我们正在获取该范围,复制它,然后将其粘贴到 wsTwo 中。请注意,我们在进入 for 循环之前设置了 rowCounter。我们将使用它作为占位符,每次粘贴到 ws 2 时都会递增,这样我们就不会粘贴刚刚粘贴的数据。

     Dim rowCounterWsTwo As Integer
         rowCounterWsTwo = 2

    For rowNum = lastRow To 2 Step -1
            If Cells(rowNum, lastColumn).DisplayFormat.Interior.Color = vbRed = vbRed Then
                ws.Range(Cells(rowNum, 1), Cells(rowNum, lastColumn)).Copy
                wsTwo.Range("A2:F2").Insert
                Application.CutCopyMode = False
                rowCounterWsTwo = rowCounterWsTwo + 1
            End If
    Next rowNum

End Sub

【讨论】:

  • 请重新阅读问题,他只想检查当前月份的列的单元格颜色,而不是数据范围内的所有单元格,硬编码该列将不起作用,因为最后一列将每个月都有变化。此外,您的插入将翻转行,因此最后一行将位于第一行。 sheet2 的粘贴和最后一行 +1 可能是最佳选择。您可能想要编辑您的答案。
  • @GMalc 您是绝对正确的,根据您的输入进行了修复(出于某种原因,我发现您的描述比 OP 更清晰)。编辑以改进答案。 TY
  • 感谢您的时间和代码,但是,我能够使用查找弹出框甚至使用您的代码来做同样的事情,但正如我在我的问题中提到的那样,当在背景中应用这种颜色时使用条件格式然后它不能识别红色单元格/颜色。这仅在我手动填充每个单元格中的颜色时才有效。因此,如果您能根据此要求编辑代码,我将不胜感激。一切都按我的需要工作,除了如果通过条件格式应用它不能识别颜色,甚至在复制到 sheet2 时我也需要标题。 TY
  • 甚至,我已经编辑了我的表格,其中运算符位于单独的列中。我在这里所做的是,我正在使用下面的公式“evaluate(concatenate(sheet1!D2,Sheet1!$C2,Sheet1!$D2)) 创建一个名称管理器(Comparetotarget),它将单元格中的值评估为“10 >= 5”,应用于 D2:F7 中的所有单元格。然后使用“if(not(comparetotarget),if(ABS((D2-$C2/$C2)>5%) 在此单元格顶部应用条件格式,"True"))" 然后单元格变为红色,如果
  • 我将检查颜色语句切换为 Cells(rowNum, lastColumn).DisplayFormat.Interior.Color = vbRed。确保将条件着色设置为 vb red,与我的照片中的颜色相同。这应该有效。让我知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2011-05-08
  • 2018-01-28
  • 2018-03-31
  • 2019-07-28
  • 2021-02-17
相关资源
最近更新 更多