Каковы альтернативные методы использования вложенных циклов For? - PullRequest
0 голосов
/ 09 мая 2019

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

Я пытался использовать вложенные циклы, но он не работает.

For Each cel In Range("C748:BQ758")
    If cel.Value < cel.Next.Value Then
        For Each cel In Range("C904:BQ904")
            cel.Value = ClosedOutput
    ElseIf cel.Value > cel.Next.Value Then
        For Each cel In Range("C904:BQ904")
            cel.Value = OpenOutput
    End If
Next cel

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

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

Sub load()
    With Worksheets("Sheet1") ' Change to your sheet
        Dim ClosedOutput As Integer
        ClosedOutput = 0

        Dim OpenOutput As Integer
        OpenOutput = 1

        Dim inArr As Variant
        inArr = .Range("C748:BQ758")

        Dim outArr() As Variant
        ReDim outArr(1 To UBound(inArr, 1), 1 To UBound(inArr, 2))

        Dim i As Long
        For i = 1 To UBound(inArr, 1)
            Dim j As Long
            For j = 1 To UBound(inArr, 2) - 1
                If inArr(i, j) < inArr(i, j + 1) Then
                    outArr(i, j) = ClosedOutput
                Else
                    outArr(i, j) = OpenOutput
                End If
            Next j
        Next i

        .Range("C904").Resize(UBound(outArr, 1), UBound(outArr, 1)).Value = outArr

    End With

End Sub
0 голосов
/ 10 мая 2019

Как уже упоминал Матье Гиндон в комментариях, вы пропускаете операторы Next в коде. Вы также дважды используете cel, что (если я правильно помню) испортит ситуацию, поэтому вам нужно запустить две разные переменные. Вот как это должно выглядеть.

For Each Mcel In Range("C748:BQ758")
    If Mcel.Value < Mcel.Next.Value Then
        For Each Scel In Range("C904:BQ904")
            Scel.Value = ClosedOutput
        Next
    ElseIf Mcel.Value > cel.Next.Value Then
        For Each Scel In Range("C904:BQ904")
            Scel.Value = OpenOutput
        Next
    End If
Next cel

Однако вы можете уменьшить число циклов For на один, выполнив следующее:

For Each Mcel In Range("C748:BQ758")
    For Each Scel In Range("C904:BQ904")
        If Mcel.Value < cel.Next.Value Then
            Scel.Value = ClosedOutput
        Else
            'this allows for an equals to situation (you can change < to <= if you want it equal to the ClosedOutput value.
            Scel.Value = OpenOutput
        End If
    Next
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...