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函数需要在基于可用数据列运行其余代码之前创建范围列表。