Далее без For / For Без Next / Loop Без Do / End Если без блока Если ошибки - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь напечатать формулы для ячеек в определенных листах, имена которых находятся в предопределенных массивах. У меня есть следующий код:

Private Sub bngComm_Click()
Dim i As Integer, j As Integer, k As Integer
Dim colref1 As String, colref2 As String, colref3 As String

    For i = 13 To 134
    Do While IsInArray(Worksheets(i).Name, arrBingol)
        For j = 131 To 144
            If j = 136 Then

            Else
                For k = 2 To 13
                    If k = 2 Then
                        colref1 = "A"
                        colref2 = "E"
                        colref3 = "B"
                    ElseIf k = 3 Then
                        colref1 = "B"
                        colref2 = "F"
                        colref3 = "C"
                    ElseIf k = 4 Then
                        colref1 = "C"
                        colref2 = "G"
                        colref3 = "D"
                    ElseIf k = 5 Then
                        colref1 = "D"
                        colref2 = "H"
                        colref3 = "E"
                    ElseIf k = 6 Then
                        colref1 = "E"
                        colref2 = "I"
                        colref3 = "F"
                    ElseIf k = 7 Then
                        colref1 = "F"
                        colref2 = "J"
                        colref3 = "G"
                    ElseIf k = 8 Then
                        colref1 = "G"
                        colref2 = "K"
                        colref3 = "H"
                    ElseIf k = 9 Then
                        colref1 = "H"
                        colref2 = "L"
                        colref3 = "I"
                    ElseIf k = 10 Then
                        colref1 = "I"
                        colref2 = "M"
                        colref3 = "J"
                    ElseIf k = 11 Then
                        colref1 = "J"
                        colref2 = "N"
                        colref3 = "K"
                    ElseIf k = 12 Then
                        colref1 = "K"
                        colref2 = "O"
                        colref3 = "L"
                    ElseIf k = 13 Then
                        colref1 = "L"
                        colref2 = "P"
                        colref3 = "M"
                    End If
                Worksheets(i).Cells(j, k).FormulaLocal = "=(VLOOKUP(VALUE(MID(CELL(" & Chr(34) & "fılename" & Chr(34) & ";" & colref1 & CStr(j - 130) & ");FIND(" & Chr(34) & "]" & Chr(34) & ";CELL(" & Chr(34) & "fılename" & Chr(34) & ";" & colref1 & CStr(j - 130) & ");1)+1;30));'FTE GİDER DAĞILIM ANAHTARI'!$C:" & colref2 & ";" & CStr(k + 1) & ";0)/'FTE GİDER DAĞILIM ANAHTARI'!" & colref2 & "$7)*Premises!" & colref3 & CStr(j - 111)
                End If
            Next k
        Next j

        i = i + 1
    Loop
    Next i
End Sub

И он постоянно дает Next без For / For без Next / Loop Без Do / End Если без блока If Ошибки, когда я пытаюсь исправить один из них. Я проверил, правильные ли выписки, и не смог найти в них ничего плохого.

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Я использовал RUbberDuck (фантастическое бесплатное дополнение для VBA), чтобы правильно сделать отступ для вашего кода. Затем я удалил самое длинное внутреннее утверждение if, и причина вашей проблемы была совершенно ясна.

Option Explicit

Private Sub bngComm_Click()
Dim i                                           As Integer, j As Integer, k As Integer
Dim colref1                                     As String, colref2 As String, colref3 As String

    For i = 13 To 134
        Do While IsInArray(Worksheets(i).Name, arrBingol)
            For j = 131 To 144
                If j = 136 Then

                Else
                    For k = 2 To 13

                        Worksheets(i).Cells(j, k).FormulaLocal = "=(VLOOKUP(VALUE(MID(CELL(" & Chr(34) & "filename" & Chr(34) & ";" & colref1 & CStr(j - 130) & ");FIND(" & Chr(34) & "]" & Chr(34) & ";CELL(" & Chr(34) & "filename" & Chr(34) & ";" & colref1 & CStr(j - 130) & ");1)+1;30));'FTE GIDER DAGILIM ANAHTARI'!$C:" & colref2 & ";" & CStr(k + 1) & ";0)/'FTE GIDER DAGILIM ANAHTARI'!" & colref2 & "$7)*Premises!" & colref3 & CStr(j - 111)
                    End If
                Next k
            Next j

            i = i + 1
        Loop
    Next i
End Sub

Следующее K должно быть до конца if.

2 голосов
/ 04 октября 2019

Как сказал @GSerg, вы ввели Next k не в том месте. И так много ifs может быть возобновлено с помощью оператора Select Case...End Select.

Dim i As Integer, j As Integer, k As Integer
Dim colref1 As String, colref2 As String, colref3 As String

For i = 13 To 134
    Do While IsInArray(Worksheets(i).Name, arrBingol)
        For j = 131 To 144 Step 1
            If j = 136 Then
            Else
                For k = 2 To 13
                    Select Case k
                        Case 2: colref1 = "A": colref2 = "E": colref3 = "B"
                        Case 3: colref1 = "B": colref2 = "F": colref3 = "C"
                        Case 4: colref1 = "C": colref2 = "G": colref3 = "D"
                        Case 5: colref1 = "D": colref2 = "H": colref3 = "E"
                        Case 6: colref1 = "E": colref2 = "I": colref3 = "F"
                        Case 7: colref1 = "F": colref2 = "J": colref3 = "G"
                        Case 8: colref1 = "G": colref2 = "K": colref3 = "H"
                        Case 9: colref1 = "H": colref2 = "L": colref3 = "I"
                        Case 10: colref1 = "I": colref2 = "M": colref3 = "J"
                        Case 11: colref1 = "J": colref2 = "N": colref3 = "K"
                        Case 12: colref1 = "K": colref2 = "O": colref3 = "L"
                        Case 13: colref1 = "L": colref2 = "P": colref3 = "M"
                    End Select
                    Worksheets(i).Cells(j, k).FormulaLocal = "=(VLOOKUP(VALUE(MID(CELL(" & Chr(34) & "filename" & Chr(34) & ";" & colref1 & CStr(j - 130) & ");FIND(" & Chr(34) & "]" & Chr(34) & ";CELL(" & Chr(34) & "filename" & Chr(34) & ";" & colref1 & CStr(j - 130) & ");1)+1;30));'FTE GIDER DAGILIM ANAHTARI'!$C:" & colref2 & ";" & CStr(k + 1) & ";0)/'FTE GIDER DAGILIM ANAHTARI'!" & colref2 & "$7)*Premises!" & colref3 & CStr(j - 111)
                Next k
            End If
        Next j

        i = i + 1 '<--!!!!
    Loop
Next i

Мне действительно интересно ваш код, потому что у вас есть i = i + 1 внутри Do, и это нормально, но это Do уже внутри For i=.... Я полагаю, у вас есть свои причины.

Кроме того, теперь, когда вы получили часть Select Case, вы можете увидеть четкую математическую связь между значением k и столбцами, так что, вероятно, вы даже сможете адаптировать эточасть, потому что отношение colref1 = k-1 : colref2 = k+3: colref3 = k и использовать номера столбцов вместо букв. Но это всего лишь предложение.

Надеюсь, это поможет.

0 голосов
/ 04 октября 2019

Хотя это не разбивка вашей проблемы (другие позаботились об этом), я просто хочу показать вам, как вы могли бы упростить свои IF заявления:

Sub Test()

Dim k As Long
Dim colref1 As String, colref2 As String, colref3 As String

For k = 2 To 13
    colref1 = Chr(63 + k): colref2 = Chr(67 + k): colref3 = Chr(64 + k)
Next k

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