Делать пока l oop не увеличивается должным образом в VBA - PullRequest
0 голосов
/ 27 февраля 2020

Я написал небольшую программу для сканирования электронной таблицы и вычисления общего количества различных типов элементов на основе значения в столбце, а затем для печати результатов в указанных c местоположениях столбцов. Мой код ниже

    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

Судя по просмотру другой информации на этом сайте, мне на самом деле не нужны рабочие листы (). Выберите действие, но я не думаю, что это останавливает программу.

При выполнении моей программы она останавливается в цикле; текущие используемые данные имеют «B» в первом интересующем столбце, но они никогда не увеличиваются до следующей строки, что заставляет меня думать, что по какой-то причине это фактически не добавляет к счетчику или к B. Столбец, который я сканирую, также является вычисляемым столбцом с использованием VLOOKUP, но я не знаю, влияет ли это на то, что я делаю. В листе Excel будет sh, если я попытаюсь запустить программу. Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Действительно, комментарий, но его сложно описать как таковой, но вам нужно разделить свои действия на отдельные строки, а именно:

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

и ElseIf Worksheets("Values").Cells(Counter, 54).Value <> "A" Or "B" Or "C" Then

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 How_Many_items()

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

Counter = 2
'do while loop to continue going down rows until out of new data
'if loops to accumulate values
With Worksheets("Values")
    Do While .Cells(Counter, 54) <> Empty
        If .Cells(Counter, 54).Value = "A" Then
            A = A + 1
        ElseIf .Cells(Counter, 54).Value = "B" Then
            B = B + 1
        ElseIf .Cells(Counter, 54).Value = "C" Then
            C = C + 1
        End If
        sum = Sum + 1
        Counter = Counter + 1
    Loop
End With

Почему бы не использовать формулы COUNTIF?

0 голосов
/ 27 февраля 2020

Должно ли это быть Do Пока L oop? Вы можете использовать специальную функцию ячеек, чтобы получить последнюю строку, содержащую данные, и просто сделать конечную для l oop.

Dim LastDataRow As Long 'Переменная для хранения номера строки

LastDataRow = Cells .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

Next i

...