Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA:动态计数范围的语法_Vba_Excel - Fatal编程技术网

VBA:动态计数范围的语法

VBA:动态计数范围的语法,vba,excel,Vba,Excel,我会尽我最大的努力解释我的问题,但它在我的脑海中仍然有点模糊,所以这可能没有它应该是清楚的,为此我提前道歉 以下是我的代码中有问题的部分: If Application.WorksheetFunction.countif(Range("D:D"), Cells(x, firstcolumn).Value) _ And Application.WorksheetFunction.countif(Range("F:F"), Cells(x, firstcolumn).Value) _

我会尽我最大的努力解释我的问题,但它在我的脑海中仍然有点模糊,所以这可能没有它应该是清楚的,为此我提前道歉

以下是我的代码中有问题的部分:

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
这个项目背后的想法是检查“Cells(x,firstcolumn)”中的值是否同时出现在D、F和H列中,然后将这些值粘贴到其他地方。 但是,要检查“Cells(x,firstcolumn)”值的列数可以更改,因此需要在任意数量的列(2,10等)中检查值。我的代码在指定的范围内工作得很好,但是如果缺少一个或添加了多个,那么它将停止工作

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

我最好的猜测是让countif范围动态变化,但我不知道何时以及如何做到这一点

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


干杯

您需要在此处提取一个函数。大概是这样的:

Private Function IsPresentInRange(ByVal source As Range, ByVal value As Variant) As Boolean
    IsPresentInRange = Application.WorksheetFunction.CountIf(source, value) > 0
End Function
然后你需要一种方法来找出你需要给一个
参数指定的范围-它可以是它自己的函数,也可以在某个地方硬编码它们;基本上,您希望有一组范围的概念来调用该函数-这将是最简单的:

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

请注意,
如果
条件是hack,则不涉及布尔表达式,因此VBA正在将
工作表函数的结果合并为一个
布尔
,因此,只有当所有计数都大于0时,您的代码才会进入
Then
块-将代码更改为读取
If Application.WorksheetFunction.CountIf(…)>0和。。。然后
会让意图更清晰。非常有趣的Mat,谢谢你花时间回答我的问题。我会试试你的主意,然后回来汇报!好的,我尝试了你的想法,只要填充了设置为GetSourceRanges的数据列,它就会非常有效。但是,如果列(例如H:H)不存在,函数将不会返回任何内容。我猜GetSourceRanges函数需要在基于可用数据列运行其余代码之前创建范围列表。