最优雅的解决方案是根据单元格填充颜色仅从大量文本中复制选定的行

时间:2016-03-09 17:33:14

标签: excel vba excel-vba

我遇到了在我的工作场所创建应用程序的问题。该工作簿由不同数量的类似子表和一个摘要表组成。每个子表有70个预定义区域供用户输入文本,但通常不会使用大多数这些区域。用户输入的任何文本都会导致输入的单元格有条件地格式化为三种颜色之一。

我试图编写一个宏,它会将子表中所有用户输入的文本按顺序复制到摘要表中的列表中。我最初认为,最好的方法是复制所有用户输入的文本,然后删除任何与所需条件不匹配的文本的整行。但是,编写了一个循环遍历所有工作表的宏并快速正确地复制了所有用户输入的文本后,我发现格式化没有通过。因此,我无法根据其格式删除行。 (我一直在使用下面的基本复制方法)

.Range(x, x).Copy Worksheets("Summary Sheet").Cells(x, x)

我应该: A)修改我的代码,以便逐行检查和复制符合我标准的子表单中的文本 B)使用PasteSpecial命令而不是我一直使用的更简单的复制命令(参见上文),然后根据以前的预期格式删除行 C)其他一些方法?

最优雅的解决方案是什么?为了澄清,我主要关心的是我的计算机上任何给定的解决方案需要的负载,从而最终执行速度。任何想法都赞赏。

2 个答案:

答案 0 :(得分:0)

就个人而言,我会选择简单的路径并执行嵌套循环来检查每页上用过的行和列中的单元格以进行格式化,然后使用计数器(n = n + 1)将您找到的任何信息粘贴到行(n)在摘要表上。这样,您就不会删除任何行。

在Range上使用If语句(" CR")。Interior.ColorIndex检查颜色是否与您要查找的颜色相匹配。您还可以将Select Case用于多种颜色。

答案 1 :(得分:0)

除了asp8811的答案,要在Excel VBA中编写优雅,快速的代码,您应该尽量减少使用Range对象,尤其是Range.Copy方法。类似下面的内容比Range.Copy更好:

Dim vCopy As Variant, vPaste As Variant
vCopy = IteratingSheet.UsedRange.Value
If vCopy(a, b) = ConditionalFormattingCriteria Then
    vPaste(x, y) = vCopy(a, b)
End If

With SummarySheet
    .Range(.Cells(1, 1), .Cells(UBound(vPaste), UBound(vPaste, 2))).Value = vPaste
End With