在VBA中执行While循环不能正确递增

在VBA中执行While循环不能正确递增,vba,loops,do-while,Vba,Loops,Do While,我已经编写了一个小程序来扫描电子表格,并根据列中的值计算不同项目类型的总数,然后将结果打印到特定的列位置。我的代码在下面 Sub How_Many_items() 'define variables. A, B, C refer to letter coding. O is other. counter is for the count Dim A As Integer Dim B As Integer Dim C As Integer Dim O As

我已经编写了一个小程序来扫描电子表格,并根据列中的值计算不同项目类型的总数,然后将结果打印到特定的列位置。我的代码在下面

    Sub How_Many_items()

'define variables. A, B, C refer to letter coding. O is other. counter is for the count
    Dim A As Integer
    Dim B As Integer
    Dim C As Integer
    Dim O As Integer
    Dim Sum As Integer
    Dim Counter As Integer

'resetting variables
    A = 0
    B = 0
    C = 0
    O = 0
    Sum = 0
    Counter = 2
    'do while loop to continue going down rows until out of new data
    'if loops to accumulate values
    Worksheets("Values").Select

Do While Worksheets("Values").Cells(Counter, 54) <> Empty
    If Worksheets("Values").Cells(Counter, 54).Value = "A" Then
    A = A + 1 And Sum = Sum + 1 And Counter = Counter + 1

    ElseIf Worksheets("Values").Cells(Counter, 54).Value = "B" Then
    B = B + 1 And Sum = Sum + 1 And Counter = Counter + 1

    ElseIf Worksheets("Values").Cells(Counter, 54).Value = "C" Then
    C = C + 1 And Sum = Sum + 1 And Counter = Counter + 1

    ElseIf Worksheets("Values").Cells(Counter, 54).Value <> "A" Or "B" Or "C" Then
    Sum = Sum + 1 And Counter = Counter + 1
    End If

Loop

'print values in PivotTables worksheet

Worksheets(PivotTables).Cells(I, 20) = Sum
Worksheets(PivotTables).Cells(I, 21) = A
Worksheets(PivotTables).Cells(I, 22) = B
Worksheets(PivotTables).Cells(I, 23) = C


  End Sub
Sub多少项()
'定义变量。A、 B、C指字母编码。O是另一个。柜台是给伯爵的
将A变暗为整数
作为整数的Dim B
作为整数的Dim C
作为整数的Dim O
点心作为整数
作为整数的Dim计数器
'重置变量
A=0
B=0
C=0
O=0
总和=0
计数器=2
'执行while循环以继续向下移动行,直到新数据用完
'如果循环以累积值
工作表(“值”)。选择
工作表(“值”)中的单元格(计数器,54)为空
如果工作表(“值”).Cells(计数器,54).Value=“A”,则
A=A+1和Sum=Sum+1和Counter=Counter+1
ElseIf工作表(“值”)。单元格(计数器,54)。Value=“B”然后
B=B+1和Sum=Sum+1和Counter=Counter+1
ElseIf工作表(“值”)。单元格(计数器,54)。Value=“C”然后
C=C+1和Sum=Sum+1和Counter=Counter+1
ElseIf工作表(“值”)。单元格(计数器,54)。然后输入值“A”或“B”或“C”
总和=总和+1,计数器=计数器+1
如果结束
环
'在数据透视表工作表中打印值
工作表(数据透视表)。单元格(I,20)=总和
工作表(数据透视表)。单元格(I,21)=A
工作表(数据透视表)。单元格(I,22)=B
工作表(数据透视表)。单元格(I,23)=C
端接头
根据本网站上的其他信息,我实际上不需要工作表()。请选择“操作”,但我不认为这会使程序停滞


当单步执行我的程序时,它会在循环中暂停;当前使用的数据在感兴趣的第一列中有“B”,但它从未增加到下一行,这使我认为它实际上并没有出于某种原因增加到计数或B。我扫描的列也是使用VLOOKUP计算的列,但我不知道这是否会影响我所做的。如果我尝试运行该程序,excel工作表将崩溃。谢谢你的帮助

实际上更多的是一个评论,但不能简单地这样描述,但您需要将您的操作拆分为单独的行,即

If Worksheets("Values").Cells(Counter, 54).Value = "A" Then
    A = A + 1
    Sum = Sum + 1
    Counter = Counter + 1
ElseIf工作表(“值”)。单元格(计数器,54)。然后输入值“A”或“B”或“C”

需要

ElseIf NOT(Worksheets("Values").Cells(Counter, 54).Value = "A" Or Worksheets("Values").Cells(Counter, 54).Value ="B" Or Worksheets("Values").Cells(Counter, 54).Value = "C") Then
您可以使用
With
子句或变量来缩短代码

事实上,您的代码可以简化(我认为)为

Sub多少项()
'定义变量。A、 B、C指字母编码。O是另一个。柜台是给伯爵的
暗淡如长
暗B一样长
尺寸C与长度相同
暗淡如长
点心只要
昏暗的柜台一样长
计数器=2
'执行while循环以继续向下移动行,直到新数据用完
'如果循环以累积值
带有工作表(“值”)
请稍等。单元格(计数器,54)为空
如果.Cells(计数器,54).Value=“A”,则
A=A+1
其他单元格(计数器,54).Value=“B”然后
B=B+1
其他单元格(计数器,54).Value=“C”然后
C=C+1
如果结束
总和=总和+1
计数器=计数器+1
环
以

为什么不使用COUNTIF公式?

它必须是Do While循环吗?您可以使用特殊的cells函数获取包含数据的最后一行,然后执行有限for循环

Dim LastDataRow As Long“变量以存储行号

LastDataRow=单元格.SpecialCells(xlCellTypeLastCell).Row

对于i=1到LastDataRow

If Worksheets("Values").Cells(Counter, 54).Value = "A" Then
A = A + 1 And Sum = Sum + 1 And Counter = Counter + 1

ElseIf Worksheets("Values").Cells(Counter, 54).Value = "B" Then
B = B + 1 And Sum = Sum + 1 And Counter = Counter + 1

ElseIf Worksheets("Values").Cells(Counter, 54).Value = "C" Then
C = C + 1 And Sum = Sum + 1 And Counter = Counter + 1

ElseIf Worksheets("Values").Cells(Counter, 54).Value <> "A" Or "B" Or "C" Then
Sum = Sum + 1 And Counter = Counter + 1
End If
如果工作表(“值”).单元格(计数器,54).Value=“A”,则
A=A+1和Sum=Sum+1和Counter=Counter+1
ElseIf工作表(“值”)。单元格(计数器,54)。Value=“B”然后
B=B+1和Sum=Sum+1和Counter=Counter+1
ElseIf工作表(“值”)。单元格(计数器,54)。Value=“C”然后
C=C+1和Sum=Sum+1和Counter=Counter+1
ElseIf工作表(“值”)。单元格(计数器,54)。然后输入值“A”或“B”或“C”
总和=总和+1,计数器=计数器+1
如果结束

接下来的i

C=C+1和Sum=Sum+1和Counter=Counter+1
不是这样做的。。。移除
,并将它们放在各自的行上。
工作表(“值”)。单元格(计数器,54)。值“A”或“B”或“C”不做您认为它做的事。您不需要在这里循环-只需使用
应用程序。CountIf
来获取A、B、C的计数,C.另一个想法:
Select Case
在这里很好。我的最后一点逻辑可能是错误的-请聪明人检查一下!或者同意@BigBen-选择案例更容易理解。@BigBen-同意,建议重写。这似乎有效,但我的计算列中有错误需要修复。非常感谢大家的帮助!
If Worksheets("Values").Cells(Counter, 54).Value = "A" Then
A = A + 1 And Sum = Sum + 1 And Counter = Counter + 1

ElseIf Worksheets("Values").Cells(Counter, 54).Value = "B" Then
B = B + 1 And Sum = Sum + 1 And Counter = Counter + 1

ElseIf Worksheets("Values").Cells(Counter, 54).Value = "C" Then
C = C + 1 And Sum = Sum + 1 And Counter = Counter + 1

ElseIf Worksheets("Values").Cells(Counter, 54).Value <> "A" Or "B" Or "C" Then
Sum = Sum + 1 And Counter = Counter + 1
End If