VBA - Countifs返回0 /布尔

时间:2016-08-26 16:44:30

标签: excel vba excel-vba boolean

使用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")

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

当我Print时,它返回0.当我打印出每个范围的必需地址和最后一个参数的字符串时,我得到了这个:

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

据我所知,这是一个合适的功能。 如果我将其全部复制并插入工作表单元格,我会得到预期的值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的语法有关,但我无法确定它是什么。该列中的所有值都是数字(技术上是货币,但格式为一般,因为它只是一个空白的工作表)。然而,当我手动插入一个单元格时,我正在努力寻找相同的公式。

编辑:使用更正的引号更新公式允许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的单元格作为更正的引号公式。

EDIT2:由@Jeeped解决,我现有的VBA方法试图复制工作表上需要的内容,将0检查简化为<>0解决它。

1 个答案:

答案 0 :(得分:2)

在引用的字符串中提供引号时,请将它们加倍。

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 Application object COUNTIFS function应编写如下。

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

将公式降低到避免字符串连接错误所需的最小值,并记住用右括号关闭公式字符串。