VBA бесконечный вложенный цикл - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь записать вложенные циклы в l oop через строки столбца, чтобы выполнить некоторые вычисления, а затем go в следующий столбец, чтобы сделать это снова. Логика c имеет для меня смысл, но вывод на лист мигает взад-вперед между правильными ответами и перезаписывает все с одним и тем же номером, и он просто продолжает это делать. Пожалуйста, дайте мне знать, если мне нужно что-то уточнить, заранее спасибо.


Sub findAvg2()
Dim maxVal As Double
Dim preHr As Double
Dim nextHr As Double
Dim cVal As Double
Dim pVal As Double
Dim nVal As Double
Dim avg As Double
Dim maxAvg As Double
Dim i As Integer 'row
Dim j As Integer 'col
Dim lRow As Integer
Dim lCol As Integer

lRow = Cells(Rows.count, 1).End(xlUp).row                    'Find the number of rows in column A(1)
lCol = Cells(1, Columns.count).End(xlToLeft).Column

For i = 19 To lRow
    For j = 2 To lCol
        maxVal = Cells(2, j).Value
        preHr = Cells(8, j).Value
        nextHr = Cells(9, j).Value
        avg = (maxVal + preHr + nextHr) / 3
        If Cells(i, j).Value > 0 Then
            pVal = Cells(i - 1, j).Value
            cVal = Cells(i, j).Value
            nVal = Cells(i + 1, j).Value
            maxAvg = (pVal + cVal + nVal) / 3
            If avg > maxAvg Then
                maxAvg = avg
            End If
        End If
        Cells(12, j).Value = maxAvg
        'Debug.Print maxAvg
    Next j
Next i

End Sub

1 Ответ

1 голос
/ 19 апреля 2020

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

Sub findAvg2()
    ' 005
    Dim maxVal As Double
    Dim preHr As Double
    Dim nextHr As Double
    Dim cVal As Double
    Dim pVal As Double
    Dim nVal As Double
    Dim Avg As Double
    Dim maxAvg As Double
    Dim Cl As Long                              ' last used column
    Dim Rl As Long                              ' last used row
    Dim C As Long                               ' column
    Dim R As Long                               ' row

    ' Find the number of used columns and roaws in the sheet
    Cl = Cells(1, Columns.Count).End(xlToLeft).Column
    Rl = Cells(Rows.Count, 1).End(xlUp).Row

    For R = 19 To Rl
        For C = 2 To Cl
            maxVal = Cells(2, C).Value
            preHr = Cells(8, C).Value
            nextHr = Cells(9, C).Value
            maxAvg = (maxVal + preHr + nextHr) / 3

            cVal = Cells(R, C).Value
            If cVal > 0 Then
                pVal = Cells(R - 1, C).Value
                nVal = Cells(R + 1, C).Value
                Avg = (pVal + cVal + nVal) / 3
                If Avg > maxAvg Then maxAvg = Avg
            End If
            Cells(12, C).Value = maxAvg
            'Debug.Print maxAvg
        Next C
    Next R
End Sub

Возможно, в этой строке вашего кода есть слабые места. For R = 19 To Rl. Поскольку вы включаете предыдущую строку в свой расчет средних значений, строка 18 должна содержать данные. Если это не так, и вы не можете исключить первую строку данных из оценки, необходимо предусмотреть специальное условие для расчета начальной maxAvg.

Все действия происходят в ActiveSheet. Это расположение, которое я инстинктивно не люблю. Если вы не вызываете подпрограмму с помощью кнопки на этом листе - и даже тогда, если умный эль c захочет использовать F5 вместо этого - я назову лист в коде. Используйте CodeName как для большей безопасности, так и для предоставления пользователям свободы переименования листа. Этот код будет выполняться на любом листе, который оказался активным. Это даже не должно быть в одной книге.

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