使用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
解决它。
答案 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
将公式降低到避免字符串连接错误所需的最小值,并记住用右括号关闭公式字符串。