Excel VBA自定义函数,带有类似于sumif的标准function

在Excel中,我正在VBA中编写一个自定义函数,它需要像内置的SUMIF函数一样使用条件string和条件范围。 Excel是否公开了testingAPI中任何位置的标准string的function,还是必须自己编写?

如果它是相关的,我正在写一个“CountUniquesIf”公式,它计算一个范围内的唯一值,如果他们符合标准。 这是我迄今为止。

 Function CountUniquesIf(CondRange As Range, Criteria As String, _ Range As Range) As Long Static dict As New Scripting.Dictionary Dim index As Long index = 1 For Each Cell In Range.Cells If CondRange(index).Value = Criteria And Cell.Value <> "" Then dict(Cell.Value) = Empty End If index = index + 1 Next Cell CountUniquesIf = dict.Count dict.RemoveAll End Function 

如果你愿意的话,你可以用普通的公式来完成整个事情。

请参见:

http://www.officearticles.com/excel/count_unique_values_in_microsoft_excel.htm

要么

http://office.microsoft.com/en-us/excel/HP030561181033.aspx

您将需要稍微修改公式,以涵盖您的scheme的“if”部分:

 =SUM(IF(FREQUENCY(IF((LEN(A1:A15)>0)*(B1:B15=D4),MATCH(A1:A15,A1:A15,0),""), IF((LEN(A1:A15)>0)*(B1:B15=D4),MATCH(A1:A15,A1:A15,0),""))>0,1)) Where A1:A15 is your Range, B1:B15 is your CondRange, and D4 is your Criterion. 

请记住以数组公式的formsinput(粘贴公式并按Ctrl-Shift-Enter而不是Enter)。

也就是说,我认为你的VBA公式也是一个很好的解决scheme(可能比你每次需要这种types的计数时创build一个怪物数组公式更方便用户)。

更新

鉴于你的澄清,我真的不认为有一个内置的“标准分析仪”,但我认为这不是很难提高你的公式,以覆盖不同的可能的标准。 这样,你的CountUniquesIf公式就能真正做到人们所想的那样。 具体来说,你可以做一些parsing来检查所有可能的运算符(除了“=”,“>”,“> =”,“<”,“<=”? 。

基于澄清的评论,我认为最简单的事情是传递一个数组中的布尔值数组,然后使用表单中的数组公式,然后testing它们。

也就是说,不是像b2:b15和“> 0”那样通过范围和标准,而是传递b2:b15> 0的结果,这将是一个数组或布尔值。 那么你的functiontesting就可以了

If CondRange(index).Value And Cell.Value <> "" Then

一切都应该按照你想要的方式工作。 请记得以数组公式的formsinput对UDF的调用。

有可能在string中使用Application.Evaluate,但这样做有很多限制,在这种情况下,使用数组公式来testing标准testing似乎更简单

非VBA方式:

  {= SUM(1 / COUNTIF($ A $ 2:$ A $ 1001 $ A $ 2:$ A $ 1001)*(LEFT(A2:A1001)= “C”))} 

这将统计A2:A1001中以“C”

对于VBA,请考虑使用应用程序对象的评估方法

 如果Asc(Left(Criteria,1))> = 60且Asc(Left(Criteria,1))<= 62那么
     bPass = Application.Evaluate(CondRange(Index).Value&Criteria)
其他
     bPass = CondRange(Index).Value =标准
万一 

自从我切换到Vista之后,我即将进入并擅自崩溃。 但明天我会在办公室看这个。 你可能会在工作表function上使用“包装器”.SumIf如果不行的话可以在这里发布。 有几个问题/build议,即使它会工作,使用像“Range”或“Cell”这样的variables名称可能会让人困惑。 在处理重复内容时,如何保留字典中的唯一值并不是很明显。 你会反对把这个分解成两个函数吗? 一个返回符合条件的值的数组,另一个计算该数组的唯一成员? 你有没有testing脚本的粗糙版本? 'CondRange(index)'语法对我来说看起来很奇怪。 也许这很好,我只是从来没有使用它(数组等除外,而不是范围)。 为什么你需要testing空单元格或零长度的string,如果你已经有一个标准? 标准是否可以expression为正则expression式? ['现在你有两个问题'哈哈哈..]你可以举例的标准和一些虚拟数据? 您是否尝试录制Data \ Filter \ Advanced Filter菜单序列? 它有一个列表范围,标准范围和唯一值唯一选项。 只要符合您的标准,就必须有一种方法来“包装”您的function。 如果您的标准不太复杂,请查看“Like”运算符的帮助。 希望这对你有帮助。 我发现你习惯了更具performance力的语言。