我有一个大约有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个。
我收到一个编译错误:预期:表达式。
答案 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。然后对第二列中的单元格求和。