Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-Countifs返回0/布尔值_Vba_Excel_Boolean - Fatal编程技术网

VBA-Countifs返回0/布尔值

VBA-Countifs返回0/布尔值,vba,excel,boolean,Vba,Excel,Boolean,使用Application.Countifs从工作表返回值时出现问题。下面是调用它的现有方法: Application.CountIfs(sortws.Range(sortws.Cells(1, 3), sortws.Cells(sortws.Rows.Count, 3).End(xlUp)), _ CStr(sortws.Cells(x2, 3)), _

使用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")
据我所知,这是一个适当的功能如果我完整地复制它并将其插入工作表单元格中,则得到预期值1。

我已经在VBA编辑器中使用
EVALUATE
打印了这个公式,它返回的值与我使用原始公式得到的值相同。我还尝试使用以下方法将其放在数据旁边的单元格中:

sortws.Cells(x2,7).Formula = "=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201,"<>"&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的语法有问题,但我无法确定它是什么。该列中的所有值都是数字(从技术上讲是通用的,但格式是通用的,因为它只是一张空白的工作表)。然而,我很难理解为什么手动将相同的公式插入单元格时会起作用

编辑:使用正确的引号更新公式可以运行求值函数,并将其放入带有
.formula
的单元格中。这将更新后的公式设置为:
“=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$E$1:$E$1201,&chr(34)&&chr(34)&&0)”
,但问题仍然存在于原始的现有方法返回0,该方法使用相同的方法返回不等于0的单元格作为更正的引号公式


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

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

sortws.Cells(x2, 7).Formula = "=COUNTIFS($C$1:$C$1201, $C$1201, $D$1:$D$1201, $D$1201, $E$1:$E$1201, ""<>0"")"
sortws.Cells(x2,7).Formula=“=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201,$0”)”
完整的VBA应编写如下

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
尺寸n为长,x2为长,x3为长,sortws为工作表
设置sortws=工作表(“表2”)
x2=1201
x3=5
带着肮脏
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")
调试打印
以

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

对于
sortws.Cells(x2,7).formula=
,您需要在带引号的字符串中加倍引号。通过生成
结束,您基本上是在与零(十六进制?)进行比较(xlUp)
对于每一列,如果它们不在同一行上结束,则它们可能不相等。每一列的大小范围必须相同。最好在单个列的最后一行定义上终止每一列。如果它们都在同一行上结束,则您的列将起作用,但这不能保证。谢谢@Jeeped,apparen我当时脑子里乱七八糟地想着如何写“0”,觉得应该像在工作表上一样写(后面加上引号)-但我当然不知道,它在VBE中。谢谢你提醒我可变长度的结尾-在这种情况下,我会先生成数据源,我知道所有列的长度都是相等的,所以这不是问题。
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