Почему мой цикл VBA пропускается к моему внешнему в следующий раз? - PullRequest
0 голосов
/ 31 декабря 2018

Итак, у меня есть двойной цикл, который по некоторым причинам всегда пропускает к моему внешнему циклу по какой-то причине.Цикл идет от:

For j = lastColumn To 6 Step (-1)

до:

Next i

каждый раз.Тем не менее, в моем наборе данных есть смешанные данные, которые должны быть собраны в моем операторе if и подсчитать данные.

Есть идеи?Возможно, я неправильно форматировал макрос.

Sub CheckDates()


Dim count As Integer
Dim i As Integer
Dim j As Integer


Sheets(1).Select

lastrow = ActiveSheet.Cells(Rows.count, "B").End(xlUp).Row

'have to keep data in a table for this to actually work as it ctrls+left to the table, which will end where the very last text of any row is
lastColumn = ActiveSheet.Cells(1, Columns.count).End(xlToLeft).Column


count = 0
i = 3
j = lastColumn

For i = 3 To lastrow
    For j = lastColumn To 6 Step (-1)
        If Sheet1.Cells(i, j) < Sheet2.Cells(1, 1) And Sheet1.Cells(i, j - 1) = "Reçu" Then
        count = count + 1
    GoTo NextIteration
        End If
    Next j
    NextIteration:
Next i

Sheet2.Cells(1, 7) = count

Sheets(2).Select


'Runs the DeleteSAC Macro
Call DeleteSAC

End Sub

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Упрощение

Используйте Long для строк и Integer для столбцов.

Когда вы пишете With Sheet1везде, где вы должны написать Sheet1, например, Sheet1.Range(whatever)..., вместо этого вы можете написать просто .Range(whatever), пока не закроете Конец .

Выход для выходит только из цикла For Loop, где он находится. Таким образом, он делает именно то, что вы делаете с вашей линией Goto , но вы используете строку больше.

Когда вы используете Sheet1 или Sheet2и т. д. вы фактически используете имена кодов, поэтому вы можете изменить имена на вкладке, и код все равно будет выполняться.

Подсчет в обратном направлении обычно используется при удалении строки за строкой, поэтому в этом нет необходимости, посколькуты только считаешь.

Option Explicit

Sub CheckDates()

    Dim dataCount As Long
    Dim i As Long
    Dim j As Integer
    Dim lastrow As Long

    With Sheet1

        lastrow = .Cells(.Rows.count, "B").End(xlUp).Row

        'have to keep data in a table for this to actually work as it ctrls+left
        'to the table, which will end where the very last text of any row is
        lastColumn = .Cells(1, .Columns.count).End(xlToLeft).Column

        For i = 3 To lastrow
            For j = 6 To lastColumn
                If .Cells(i, j) < Sheet2.Cells(1, 1) And .Cells(i, j - 1) = "Reçu" Then
                    dataCount = dataCount + 1
                    Exit For
                End If
            Next
        Next

    End With

    With Sheet2
        .Cells(1, 7) = dataCount
        .Select
    End With

    'Runs the DeleteSAC Macro
    Call DeleteSAC

End Sub
0 голосов
/ 01 января 2019

Я не совсем понимаю, что вы делаете, но попробуйте вместо этого.Обратите внимание на Exit For.Это должно привести к результату, который вы ищете, без запутанных переменных счетчика For-Next.

For i = 3 To lastrow
    For j = lastColumn To 6 Step (-1)
        If Sheet1.Cells(i, j) < Sheet2.Cells(1, 1) And Sheet1.Cells(i, j - 1) = "Reçu" Then
            count = count + 1
            Exit For
        End If
    Next j
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...