将Countif转换为VBA

我已经将以下函数写入了我的(Excel 2010)工作簿:

Function Ifs4Count(r As Range, v As String, r2 As Range, v2 As String) Ifs4Count = Application.WorksheetFunction.CountIfs(r, v, r2, v2) End Function Function Ifs6Count(r As Range, v As String, r2 As Range, v2 As String, r3 As Range, v3 As String) Ifs6Count = Application.WorksheetFunction.CountIfs(r, v, r2, v2, r3, v3) End Function Function Ifs8Count(r As Range, v As String, r2 As Range, v2 As String, r3 As Range, v3 As String, r4 As Range, v4 As String) Ifs8Count = Application.WorksheetFunction.CountIfs(r, v, r2, v2, r3, v3, r4, v4) End Function Function ifcount(r As Range, v As String) ifcount = Application.WorksheetFunction.CountIf(r, v) End Function 

这些被用在各种基于返回值检查checkbox,如:

 If RatchetSizeComboBox.Enabled = False And EndCap2ComboBox.Enabled = False Then NumberOOC2TextBox.value = Ifs4Count(rCOMMENTS, "SEND TO CAL", _ rBRAND, BrandComboBox.value) 'Only Brand ElseIf RatchetSizeComboBox.Enabled = False And EndCap2ComboBox.Enabled = True Then NumberOOC2TextBox.value = Ifs6Count(rCOMMENTS, "SEND TO CAL", _ rBRAND, BrandComboBox.value, _ rCAP, EndCap2ComboBox.value) 'Brand and End Cap ElseIf RatchetSizeComboBox.Enabled = True And EndCap2ComboBox.Enabled = False Then NumberOOC2TextBox.value = Ifs6Count(rCOMMENTS, "SEND TO CAL", _ rBRAND, BrandComboBox.value, _ rRATCHET, RatchetSizeComboBox.value) 'Brand and Size Else NumberOOC2TextBox.value = Ifs8Count(rCOMMENTS, "SEND TO CAL", _ rBRAND, BrandComboBox.value, _ rRATCHET, RatchetSizeComboBox.value, _ rCAP, EndCap2ComboBox.value) 'Brand, Size and End Cap End If 

我认为必须有一个方法来使用for循环,所以我不必每次使用所有这些不同的函数,我需要做一个不同数量的variablesifcount,但我不是很有经验的VBA,所以我希望能得到一些帮助。 我怎样才能转换这个,所以我不使用工作表函数,而是实际的VBA? 任何帮助表示赞赏。

在尝试了一些testing代码之后,我想我已经拥有它了,但是现在:

 Function IfsCount(r As Range, v As String, Optional r2 As Range, Optional v2 As String, Optional r3 As Range, Optional v3 As String, Optional r4 As Range, Optional v4 As String) IfsCount = Application.WorksheetFunction.CountIfs(r, v, [r2], [v2], [r3], [v3], [r4], [v4]) End Function 

我收到一个无效的电话或程序。 方括号不是标记为可选的正确方法吗?

最后的代码从Dirk的答案略微修改(它不是评估每个variables,如果它通过V2)。 我似乎无法添加代码到这个网站,所以基本上我所做的是为每个“If Len”语句创build一个新的strvariables,然后将评估更改为:

 IfsCount = Evaluate("COUNTIFS('" & r.Parent.Name & "'!" & r.Address & ",""" & v & """" & str & str2 & str3 & ")") 

感谢大家的build议!

你正在尝试,是不可能的! 这只是vba的语法不支持这样的东西…

也有可选的参数,不是可变的,不可能检测出它们是否被省略。 做你正在尝试的唯一方法可能是评估function:

 Function IfsCount(r As Range, v As String, Optional r2 As Range, Optional v2 As String, Optional r3 As Range, Optional v3 As String, Optional r4 As Range, Optional v4 As String) Dim str As String If Len(v2) Then str = ",'" & r2.Parent.Name & "'!" & r2.Address & ",""" & v2 & """" If Len(v3) Then str = ",'" & r3.Parent.Name & "'!" & r3.Address & ",""" & v3 & """" If Len(v4) Then str = ",'" & r4.Parent.Name & "'!" & r4.Address & ",""" & v4 & """" IfsCount = Evaluate("COUNTIFS('" & r.Parent.Name & "'!" & r.Address & ",""" & v & """" & str & ")") End Function 
 If RatchetSizeComboBox.Enabled = False And EndCap2ComboBox.Enabled = False Then NumberOOC2TextBox.value = Application.WorksheetFunction.CountIfs(rCOMMENTS, "SEND TO CAL", rBRAND, BrandComboBox.value) 'Only Brand ElseIf RatchetSizeComboBox.Enabled = False And EndCap2ComboBox.Enabled = True Then NumberOOC2TextBox.value = Application.WorksheetFunction.CountIfs(rCOMMENTS, "SEND TO CAL", rBRAND, BrandComboBox.value, rCAP, EndCap2ComboBox.value) 'Brand and End Cap ElseIf RatchetSizeComboBox.Enabled = True And EndCap2ComboBox.Enabled = False Then NumberOOC2TextBox.value = Application.WorksheetFunction.CountIfs(rCOMMENTS, "SEND TO CAL", rBRAND, BrandComboBox.value, rRATCHET, RatchetSizeComboBox.value) 'Brand and Size Else NumberOOC2TextBox.value = Application.WorksheetFunction.CountIfs(rCOMMENTS, "SEND TO CAL", rBRAND, BrandComboBox.value, rRATCHET, RatchetSizeComboBox.value, rCAP, EndCap2ComboBox.value) 'Brand, Size and End Cap End If 

跳过整个用户函数并直接调用if语句的正文。 你也应该声明你的工作表我相信。

你可以简单地去这样

 Dim sRATCHET As String, sCAP As String sRATCHET = IIf(RatchetSizeComboBox.Enabled, RatchetSizeComboBox.Value, "*") sCAP = IIf(EndCap2ComboBox.Enabled, EndCap2ComboBox.Value, "*") NumberOOC2TextBox.Value = Application.WorksheetFunction.CountIfs(rCOMMENTS, "SEND TO CAL", _ rBRAND, BrandComboBox.Value, _ rRATCHET, sRATCHET, _ rCAP, sCAP)