我对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个问题:
答案 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
函数以使用您已经使用的工作表函数示例。这两种方法都不比其他方法好,所以要么对你有效。