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。
- 发生COMException – 未知名称。 (从HRESULTexception:0x80020006(DISP_E_UNKNOWNNAME))当试图修改现有的Excel文件
- VBA筛选select