VBA – Countifs返回0 /布尔值

使用Application.Countifs从工作表中返回一个值有问题。 以下是现有的方法来调用它:

Application.CountIfs(sortws.Range(sortws.Cells(1, 3), sortws.Cells(sortws.Rows.Count, 3).End(xlUp)), _ CStr(sortws.Cells(x2, 3)), _ sortws.Range(sortws.Cells(1, 4), sortws.Cells(sortws.Rows.Count, 4).End(xlUp)), _ CStr(sortws.Cells(x2, 4)), _ sortws.Range(sortws.Cells(1, x3), sortws.Cells(sortws.Rows.Count, x3).End(xlUp)), _ Chr(34) & "<>" & Chr(34) & "&0") 

在这种情况下,两个variables是迭代循环 – x2相当于电子表格上的一行,x3是一列。

当我Print的价值,它返回为0.当我打印出每个范围的必要地址和最后一个参数的string,我得到这个:

 =COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201,"<>"&0 

据我所知,这是一个合适的function。 如果我将其全部复制并插入到工作表单元格中,我会得到1的预期值。

我已经使用EVALUATE在VBA编辑器中打印了这个公式,并且它返回了与原始公式相同的值0。 我也试过把这个放在数据旁边的单元格中,用这个:

 sortws.Cells(x2,7).Formula = "=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201,"<>"&0" 

这将返回一个布尔值TRUE,实际不在工作表单元格中。

如果我删除函数的最后一位(即检查不等于0的匹配),那么它正确地加起来前两列的总匹配数。 因此,我认为我的语法检查0的东西是closures的,但我不能确定它是什么。 该列中的所有值都是数字(技术上是货币,但由于它只是空白工作表而被格式化为常规)。 但是,我正在努力避免使用插入单元格的同一个公式。

编辑:使用更正的引号更新公式允许EVALUATE函数运行,以及将其放入具有.Formula的单元格中。 这将更新后的公式写成: "=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201," & chr(34) & "<>" & chr(34) & "&0)" ,但是问题仍然存在于原有的方法返回0,它使用相同的方法返回不等于0的单元格作为更正的引号公式。

编辑2:解决@Jeeped,我现有的VBA方法试图复制工作表上需要什么,简化0检查下来解决它。

在引用的string中提供引号时,将它们加倍。

 sortws.Cells(x2, 7).Formula = "=COUNTIFS($C$1:$C$1201, $C$1201, $D$1:$D$1201, $D$1201, $E$1:$E$1201, ""<>0"")" 

完整的VBA Excel应用程序对象 COUNTIFS函数应该如下编写。

 Dim n As Long, x2 As Long, x3 As Long, sortws As Worksheet Set sortws = Worksheets("sheet2") x2 = 1201 x3 = 5 With sortws n = Application.CountIfs(.Range(.Cells(1, 3), .Cells(.Rows.Count, 3).End(xlUp)), _ CStr(.Cells(x2, 3)), _ .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp)), _ CStr(.Cells(x2, 4)), _ .Range(.Cells(1, x3), .Cells(.Rows.Count, x3).End(xlUp)), _ "<>0") Debug.Print n End With 

将公式降低到避免string拼接错误所需的最小值,并记住用右括号closures公式string。