如何根据两个值之间的单元格的LEFT值对单元格进行计数

时间:2019-07-03 21:42:59

标签: excel vba

我有一个大约有1500行的电子表格,我试图计算一个单元格值等于或小于0的行数,然后根据该行中另一个单元格的前3个字符对它们进行分组。

这是我第一次尝试VBA,并且我已经对该代码的每个部分进行了研究,但是我已经看到了很多关于如何执行它的各个部分的矛盾答案。我根据发现的代码来计算其中带有特定单词的单元格的数量,因此可能与我想要的相差很远。

For Each Cell in Range("S26:S1500")
Cell.Activate
If IsEmpty(Cell) Then Exit For
If Left(Cell.Value,3) >= 100 And Left(Cell.Value,3) <=150 And
If ActiveCell.Offset(0,-17) < 1 Then
MisProd = MisProd + 1

结果应该是从100到150开头的单元格总数,剩下的单元格少于17个。

我收到一个编译错误:预期:表达式。

2 个答案:

答案 0 :(得分:1)

已更新。第一个功能有两个type-o。我进行了测试,这一方法有效。

作为自定义函数可能会更好。这是我认为您要寻找的语法。

Function MisProd (srchRNG As Range) As Long
Dim cell As Range

    For Each cell In Intersect(srchRNG, srchRNG.Worksheet.UsedRange).Cells
        'I use the intersection function so users can selet a whole column)

    If IsEmpty(cell) Then
        'probably do nothing if it's empty?
        'might also be better to use Isnumeric(Left(cell.value,3)) to avoid errors.

    ElseIf Left(cell.Value, 3) >= 100 And Left(cell.Value, 3) <= 150 Then
        'this is a range of 101 to 149...

        If cell.Offset(0, -17) < 1 Then
            'if column b for this row is less than 1
             MisProd = MisProd + 1
        End If

    End If

    Next Cell

End Function

您可以将其与宏结合使用,如下所示。

Sub nowAmacro()

    MsgBox "Your results are " & MisProd (Range("S26:S1500"))
    'better to specify the sheet such as Sheet1.Range("S26:S15000")


End Sub

答案 1 :(得分:0)

首先,前面的评论和回答都很好,并且可以解决您的VBA。尽管如果您只是想学习VBA,那么找出您的错误是理想的。中断代码,看看是否可以运行直到出现错误。这可能与不寻常的数据行有关。

如果肯定要遍历前六行,请在错误发生后放入Debug.Print cell.row,然后在输出窗口中查看有问题的行号。

这些方法将教您调试VBA代码。而你的大多数都很好。如前所述,停止激活该单元格,并在A列中使用“ <= 0”而不是“ <1”。尽管如果它们都是整数,那可能是同一回事。

但是最后,如果可以的话,请考虑不要将VBA用于此类逻辑任务。如果您有能力在工作表中添加列,请添加一个以获取列S的NUMBERVALUE,然后在满足条件的情况下添加另一个以显示1或0。然后对第二列中的单元格求和。