VBA множественный цикл For - работает правильно только первые два раза - PullRequest
0 голосов
/ 23 января 2019

Итак, я работаю над этим небольшим кусочком кода уже пару дней и натолкнулся на загадку, которую просто не могу понять.По сути, у меня есть вложенный цикл for, который должен принимать значения из одного листа и помещать их в таблицу данных, чтобы эти значения могли быть сохранены и усреднены по времени.Я хочу, чтобы данные из ячеек M5 - M35 помещались в таблицу данных следующим образом: слева направо A3 - AC200, но я также хочу, чтобы цикл прекратился, когда в диапазоне M5 - M35 заканчиваются значения и когда пользовательДалее нажимает кнопку для сохранения данных. Я хочу, чтобы цикл начинался на следующей строке вниз.

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

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

Screen capture of what is happening

Sub subData1()

    Dim rng As Range
    Dim rcell As Range
    Dim ws As Worksheet
    Dim Tws As Worksheet

    Set Tws = Worksheets("Test")
    Set ws = Worksheets("data")

    For i = 3 To 200 'range is from cell A3 - A200

        'if start cell already has value go down a row
        If ws.Cells(i, 1).Value <> "" Then
            i = i + 1
        End If

        'set the range for data sheet
        Set rng = ws.Range(ws.Cells(i, 1), ws.Cells(i, 30).End(xlToRight))

        For f = 5 To 35

            For Each rcell In rng 'loop through each cell in data sheet range

                If rcell.Value = "" Then 'if cell is blank input data

                    If Tws.Cells(f, 13).Value <> "" Then

                        'Check the selected Cell has a value
                        rcell.Value = Tws.Cells(f, 13).Value
                        f = f + 1

                    End If

                Else

                    If f > 5 Then
                        MsgBox "Data Storage Updated", , "Data Storage"
                        f = 5
                        Exit Sub

                    'Else
                        'MsgBox "Value Must Be Greater Than Zero", , f
                        'f = 5
                        'Exit Sub

                    End If

                End If
            Next
        Next
    Next

End Sub

1 Ответ

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

Причина, по которой он работает первый и второй раз, из-за этой строки

If ws.Cells(i, 1).Value <> "" Then
    i = i + 1
End If

Но, если вы заметите, он запускается только один раз для каждой итерации. Это означает, что на чистом листе он будет оценивать false на первой итерации первого запуска и продолжаться, на первой итерации второго запуска он будет оценивать значение true и перемещаться вниз на одну строку к строке 4, но на первой итерации третьего запуска он также оценивает значение true и перемещается вниз в строку 4, а затем помещает данные, начиная с ws.Range(ws.Cells(i, 1), ws.Cells(i, 30).End(xlToRight))

Вам необходимо изменить If-End If на функцию, которая будет извлекать последнюю использованную строку в столбце A вашего листа данных. Кроме того, вам, вероятно, не нужен внешний цикл For-Next, поскольку он проходит по выходному листу и выдает одинаковые значения M5:M35 для каждой отдельной строки.

Если я правильно понимаю ваши потребности, я считаю, что вы могли бы использовать это, чтобы выполнить то, что вы ищете

Dim rng As Range
Dim ws As Worksheet
Dim Tws As Worksheet

Dim endRow As Long

Set Tws = Worksheets("Test")
Set ws = Worksheets("data")

endRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1

Set rng = ws.Cells(endRow, 1)

For f = 5 To 35
    If Tws.Cells(f, 13).Value <> "" Then
        rng.Value = Tws.Cells(f, 13).Value
        Set rng = rng.Offset(0, 1)
    End If
Next

При этом при каждом последовательном нажатии кнопки данные вставляются в новую строку с циклом Tws.Cells(f,13) и помещением этого значения в крайний правый столбец путем постепенного задания диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...