Excel公式与VBA

需要使用公式将一列中的文本与不同工作表中的文本进行匹配,并对突出显示的单元格进行计数 这与sumif类似,但是不是在静态列中返回数值,而是返回突出显示的单元格的数量。

我已经成功编写了VBA来计算给定列中突出显示的单元格,但是现在必须对名称进行匹配。 含义是,如果列A1:A50中的名称与Sheet2 Column J1:J52中的名称匹配,则返回表2中列X中突出显示的单元格的计数。

countbycolor('sheet2'!J4:J1847,A52)

VBA:

 Function CountByColor(InputRange As Range, ColorRange As Range) As Long Dim cl As Range, TmpCount As Long, ColorIndex As Integer Application.Volatile ColorIndex = ColorRange.Interior.ColorIndex TmpCount = 0 On Error Resume Next For Each cl In InputRange.Cells If cl.Interior.ColorIndex = ColorIndex _ Then TmpCount = TmpCount + 1 Next cl CountByColor = TmpCount End Function 

为标准范围添加参数并实现Application.Countif应该足够了。

 Function CountByColorAndName(InputRange As Range, NameRange As Range, ColorRange As Range) As Long Dim cl As Range, TmpCount As Long, ColorIndex As Integer Application.Volatile ColorIndex = ColorRange.Interior.ColorIndex TmpCount = 0 On Error Resume Next For Each cl In InputRange.Cells If cl.Interior.ColorIndex = ColorIndex and _ cbool(application.countif(NameRange , cl.value)) then _ TmpCount = TmpCount + 1 Next cl CountByColor = TmpCount End Function 

示例语法:

 =CountByColorAndName('sheet2'!J4:J1847, A1:A50, A52) 

有一点困惑,因为你对情况的描述是指Sheet2栏J1:J52'sheet2'!J4:J1847 。 如果这不合适,请澄清。

MATCH函数实际上比COUNTIF函数更有效,无论是在工作表上还是在VBA中。 这应该减less一些计算负荷。

  For Each cl In InputRange.Cells If cl.Interior.ColorIndex = ColorIndex then _ if not iserror(application.match(cl.value, NameRange , 0)) then _ TmpCount = TmpCount + 1 Next cl