如何只通过可见的过滤数据使Excel宏循环?

时间:2013-10-24 20:13:26

标签: excel excel-vba vba

我对VBA的经验很少,而且我现在被我想用宏完成的事情所困扰。 Excel 2010。

我有3个相关专栏。 B,C和AD。 (第2,3和30栏) 我的数据被过滤到大约30行,几乎没有一行是连续的(总共约500行)。

我希望发生以下情况:

在AD列中仅在可见行中输入公式,该列将查看该行的B列中的值,并在C列的所有可见单元格中检查该值。它无法查看所有C列中的单元格,只有可见的单元格。

如果在C列的VISIBLE CELLS中的任何位置找到该行中B列的值,则应在AD列中返回“True”。我不关心找不到值时返回的内容,因为我将仅过滤“True”值。 作为一项附加要求,如果B列中值的前3个字符为“010”,我需要在AD列中返回“True”值。然后我需要将这个公式复制到AD列的每个VISIBLE行。

现在,我有一个公式,它将在C列中搜索B列中的值。(在stackoverflow上找到)

=NOT(ISNA(VLOOKUP(B4,C:C,1,0))))

当在列C中的某处找到列B的值时,这在列AD中提供“真”。使用“010”约束,公式如下所示:

=IF(LEFT(B4,3)="010","True",NOT(ISNA(VLOOKUP(B4,C:C,1,0))))

我遇到的问题是,这甚至会查看隐藏(已过滤掉的)行。 B列中的每个值都会出现在C列中,所以我的所有条目都只有“True”。

我认为必须有一个更好的方法来做到这一点,而不仅仅是将公式粘贴下来(即使考虑到我无法使公式工作)。所以,2个问题:

  1. 在这种情况下,公式是正确的方法,如果是这样,有人可以告诉我如何让它只搜索C列中的可见单元格吗?
  2. 如果代码是最好的方式(我猜它是),有人能告诉我一个可能有效的代码示例吗?

1 个答案:

答案 0 :(得分:0)

你快到了。 COUNTIF本身没有这个功能,但如果你将用户定义的函数(UDF函数)放入混合中,你就会有一个优雅的解决方案。

将以下代码添加到代码隐藏中的模块中。

Function Vis(Rin As Range) As Range
    'Returns the subset of Rin that is visible
    Dim Cell As Range
    Application.Volatile
    Set Vis = Nothing
    For Each Cell In Rin
        If Not (Cell.EntireRow.Hidden Or Cell.EntireColumn.Hidden) Then
            If Vis Is Nothing Then
                Set Vis = Cell
            Else
                Set Vis = Union(Vis, Cell)
            End If
        End If
    Next Cell

End Function


Function COUNTIFv(Rin As Range, Condition As Variant) As Long
    'Same as Excel COUNTIF worksheet function, except does not count
    'cells that are hidden
    Dim A As Range
    Dim Csum As Long
    Csum = 0

    For Each A In Vis(Rin).Areas
        Csum = Csum + WorksheetFunction.CountIf(A, Condition)
    Next A

    COUNTIFv = Csum
End Function

现在,您可以使用新的COUNTIFv()函数执行与count相同的操作,但只包含可见的单元格。此代码示例是从Damon Ostrander's answer to a similar question采样的,因此您可能需要稍微调整一下。您可以在宏本身中使用COUNTIFv函数,也可以以类似的方式修改VLOOKUP函数以使用您已经使用的工作表函数示例。这两种方法都不比其他方法好,所以要么对你有效。