2016-05-17 37 views
2

我有这个代码的问题,其中列仍显示,尽管不符合IF条件:如果包含语句<>为调节不灵

If CBool(Application.WorksheetFunction.CountIf(.Columns(j), "<>0"))

代码循环列,而仅显示列值大于0.我不知道问题是j还是CBool条件本身。我希望得到一些帮助,因为我真的需要这些代码来处理我的excel,因为分析起来会更简单和有用!谢谢。

Sub TestPasteColumnData3() 

    Dim lastcol As Long 
    Dim j As Long 

    With Worksheets("WF - L12 (3)") 
     lastcol = .Cells(5, Columns.Count).End(xlToLeft).Column 
     For j = 3 To lastcol 
      'change >0 to <>0 and 3 to j 
      If CBool(Application.WorksheetFunction.CountIf(.Columns(j), "<>0")) Then 
       .Columns(j).Copy Destination:=Worksheets("Sheet 1").Columns(j) 'Dont delete, this code works 
      Else 
       MsgBox ("No Value") 
       Exit Sub 
      End If 
     Next 
    End With 

    MsgBox ("Done") 
End Sub 
+0

您的数据是否包含负值?所有值都是数字吗?它是否包含任何空白单元格? –

回答

1

COUNTIF函数将计算任何东西,包括空白单元格,范围,如果它不等于0,这将导致你的

CBool(Application.WorksheetFunction.CountIf(.Columns(j), "<>0")) 

为TRUE,如果你有超过一个完整的列以外的任何0(不带空格)

你可以尝试

If Application.WorksheetFunction.Sum(.Columns(j)) > 0 Then 
    .Columns(j).Copy Destination:=Worksheets("Sheet 1").Columns(j) 'Dont delete, this code works 
Else 
    MsgBox ("No Value") 
    Exit Sub 
End If 

,这将给你有任何大于0的任何列,但仍然占任何空格(或超视距正确)你可能在列中。

+0

这是一个非常聪明的主意!尝试过,但现在它跳转到“没有价值”:/ – Niva

+0

但是,当我插入随机列值的代码确实工作。所以我想问题是再次与j – Niva

+0

这听起来像有一个列导致错误的地方 - 你能够进入Excel表并总结所有的列,看看哪一个(S)造成的错误? – Dustin

1

WorksheetFunction.CountIf将返回满足给定条件细胞的计数。您将计数转换为布尔值 - 对于任何非零结果,计算结果为True

您需要将该计数与进行比较例如, > 0导致布尔表达式(然后您可以删除CBool)以实现预期结果。

If Application.WorksheetFunction.CountIf(.Columns(j), "<>0") > 0 Then 

但随后,如果任何非零整数转换为True,这个代码就相当于(尽管不那么明确的关于它在做什么):

If CBool(Application.WorksheetFunction.CountIf(.Columns(j), "<>0")) Then 

因此,条件不能是问题。

您需要在循环之前放置一个破发点(F9),运行代码,并通过(F8)步骤,看看发生了什么事情。这个问题可能与针对您的特定工作表数据使用WorksheetFunction.CountIf有关。

+0

试过上面的,它仍然显示所有列:/ – Niva

+0

有些列中有空白单元格可能是原因吗? – Niva

+0

@Niva是否有非数字值?如果你在工作表本身使用'CountIf'公式,你会得到你期待的结果吗? VBA代码是否返回相同的结果? –