VBA:动态CountIf范围的语法

时间:2015-03-09 19:02:59

标签: excel vba excel-vba

我会尽力尝试解释我的问题,但在我的脑海中仍然有点模糊,所以这可能不是应该如此清晰,我为此事先道歉。

这是我的代码中遇到问题的部分:

If Application.WorksheetFunction.countif(Range("D:D"), Cells(x, firstcolumn).Value) _
    And Application.WorksheetFunction.countif(Range("F:F"), Cells(x, firstcolumn).Value) _
    And Application.WorksheetFunction.countif(Range("H:H"), Cells(x, firstcolumn).Value) Then

这个项目背后的想法是检查"单元格中的值(x,firstcolumn)"同时存在于列D,F和H中,然后将值粘贴到其他位置。 但是要检查"单元格(x,第一列)"的列数。值可以更改,因此需要在任意数量的列(2,10等)中检查值。我的代码完全适用于指定的范围,但如果缺少一个或更多,则它会停止工作。

要检查的列始终从第一列偏移2,第一列始终为B,将根据D,F,H等检查,而列C,E,G等具有与此无关的其他数据部分。

我最好的猜测是让动态范围发生变化但我不知道应该在何时以及如何进行...

有人能指出我朝着正确的方向努力实现这一目标吗?如果需要,我可以发布完整的代码。

干杯!

1 个答案:

答案 0 :(得分:2)

您需要在此处提取功能。像这样:

Private Function IsPresentInRange(ByVal source As Range, ByVal value As Variant) As Boolean
    IsPresentInRange = Application.WorksheetFunction.CountIf(source, value) > 0
End Function

然后你需要一种方法来确定你需要为source参数赋予它的范围 - 它可以是它自己的函数,或者你可以在某处硬编码它们;基本上你想要一个范围组的概念来调用该函数 - 这将是最简单的:

Private Function GetSourceRanges() As Collection
    Dim result As New Collection

    result.Add Range("D:D")
    result.Add Range("F:F")
    result.Add Range("H:H")
    'maintain this list here

    Set GetSourceRanges = result
End Function

理想情况下,您可以在那里编写一些逻辑代码,这样您就不必每次都为该集合手动添加范围。

然后你可以迭代这些范围并确定你是否得到了一个>所有人都为0:

Dim sources As Collection
Set sources = GetSourceRanges

Dim result As Boolean
result = True

Dim sourceRange As Range
For Each sourceRange In sources
    result = result And IsPresentInRange(sourceRange, Cells(x, firstcolumn).Value)
Next

If result Then
    ' whatever you had in that If block
End If