0

我对 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”值。然后,我需要将此公式复制到每个 VISIBLE 行的 AD 列。

现在,我有一个公式可以在 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 列中,所以我的所有条目只会得到“真”。

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

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

1 回答 1

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()函数来执行与计数相同的操作,但仅包含可见单元格。此代码示例取自Damon Ostrander 对类似问题的回答,因此您可能需要稍微调整一下。您可以COUNTIFv在宏本身中使用该函数,也可以VLOOKUP以类似的方式修改该函数以使用您已有的工作表函数示例。两种方法都不是真的比另一种更好,所以任何一种都应该适合你。

于 2013-10-25T00:19:27.357 回答