2016-08-19 5 views
0

Я продолжаю получать ошибки (либо без if или loop без do), и я действительно не знаю, почему ... может кто-нибудь помочь ?! Благодаря!Ошибки синтаксиса в VBA

Do Until (Range("I4").Value = 0) 

    For i = 2 To lLastrow 

       If Range("G" & i).Value = 0 Then 
        i = i + 1 

       ElseIf Range("G" & i).Value < 0 Then 
         Do Until (Range("G" & i).Value = 0) 
         For j = 0 To i 
         If Range("F" & i - j).Value < 0 Then 
           Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
           Else: j = j + 1 
           End If 
          Application.Calculate 
         Loop 
        ElseIf Range("G" & i).Value > 0 Then 
         Do Until (Range("G" & i).Value = 0) 
          For k = 0 To i 
          If Range("F" & i - k).Value > 0 Then 
           Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
            Else: k = k + 1 
            End If 
           Application.Calculate 
         Loop 
       End If 


      Application.Calculate 
Loop 
+3

Вам не хватает 'Next' для ваших циклов' For' – Siva

+3

Вот почему правильные отступы имеют значение. –

ответ

1

Вы отсутствуете Next заявления для всех вас For петли

Try ниже кода

Do Until (Range("I4").Value = 0) 

    For i = 2 To lLastrow 
     If Range("G" & i).Value = 0 Then 
     i = i + 1 
     ElseIf Range("G" & i).Value < 0 Then 
     Do Until (Range("G" & i).Value = 0) 
      For j = 0 To i 
      If Range("F" & i - j).Value < 0 Then 
       Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
      Else 
       j = j + 1 
      End If 
      Application.Calculate 
      Next'You missed this 
     Loop 
     ElseIf Range("G" & i).Value > 0 Then 
      Do Until (Range("G" & i).Value = 0) 
      For k = 0 To i 
       If Range("F" & i - k).Value > 0 Then 
       Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
       Else 
       k = k + 1 
      End If 
      Application.Calculate 
      Next 'You missed this 
      Loop 
     End If 

     Application.Calculate 
    Next 'You missed this 
Loop 
4

Попробуйте заменить код ниже с тем, что у вас есть. Вам не хватало Next для каждой вашей петли For. Do и Loop идут вместе, аналогично For и Next идут вместе (они составляют основу для цикла).

Вот код, я очистил его, чтобы облегчить его выполнение.

Do Until (Range("I4").Value = 0) 
    For i = 2 To lLastrow 
     If Range("G" & i).Value = 0 Then 
      i = i + 1 
     ElseIf Range("G" & i).Value < 0 Then 
      Do Until (Range("G" & i).Value = 0) 
       For j = 0 To i 
        If Range("F" & i - j).Value < 0 Then 
         Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
        Else 
         j = j + 1 
        End If 
        Application.Calculate 
       Next j 
      Loop 
     ElseIf Range("G" & i).Value > 0 Then 
      Do Until (Range("G" & i).Value = 0) 
       For k = 0 To i 
        If Range("F" & i - k).Value > 0 Then 
         Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
        Else 
         k = k + 1 
        End If 
        Application.Calculate 
       Next k 
      Loop 
     End If 
    Next i 
    Application.Calculate 
Loop 
+0

+1 за то, что уделили время чистому отступу кода. Кроме того, чтобы улучшить управление кодом и отладку, у меня всегда будет каждый «следующий», за которым следует его итераторская переменная («Следующий j',« Следующий k', 'Next i'). Вы можете отредактировать свой код и взять его внутри, тоже – user3598756

+0

Добавил следующий суффикс, как вы предложили –

+2

@ user3598756 ИМО, добавляя переменную итератора в оператор 'Next', просто мягкий беспорядок - если вы * нуждаетесь в них для чтения, то ваш код, скорее всего, слишком вложен (что с 6 уровнями глубины, безусловно, имеет место здесь), и вам нужно рефакторинг (метод extract) вместо добавления * более * визуального шума. –

1

Вот почему собственно и согласованные вопросы отступа:

Do Until (Range("I4").Value = 0) 
| For i = 2 To lLastrow 
| | If Range("G" & i).Value = 0 Then 
| | | i = i + 1 
| | ElseIf Range("G" & i).Value < 0 Then 
| | | Do Until (Range("G" & i).Value = 0) 
| | | | For j = 0 To i 
| | | | | If Range("F" & i - j).Value < 0 Then 
| | | | | | Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
| | | | | Else 
| | | | | | j = j + 1 
| | | | | End If 
| | | | | Application.Calculate 
| | | | Next '<<<<<<< MISSING!! 
| | | Loop 
| | ElseIf Range("G" & i).Value > 0 Then 
| | | Do Until (Range("G" & i).Value = 0) 
| | | | For k = 0 To i 
| | | | | If Range("F" & i - k).Value > 0 Then 
| | | | | | Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
| | | | | Else 
| | | | | | k = k + 1 
| | | | | End If 
| | | | | Application.Calculate 
| | | | Next '<<<<<<< MISSING!! 
| | | Loop 
| | End If 
| | Application.Calculate 
| Next '<<<<<<< MISSING!! 
Loop 

Теперь у вас есть 6 уровней вложенности здесь, и довольно много дублирования. Это знак вам нужно реорганизовать и экстракта процедура из внутреннего вложенного кода, чтобы устранить избыточность и улучшить читаемость кода и ремонтопригодность (одна модификации должны означать один единое место изменить код).

Если ваш код работает по назначению, я предлагаю вам принести его (всю процедуру или даже весь модуль!) До Code Review для очистки и советов по улучшению и прочности вашего кода (например, вы, вероятно, t необходимо, чтобы Calculate так часто, как вы, а неквалифицированные вызовы Range неявно ссылаются на активный лист - и это может привести к неожиданным ошибкам позже!).

+0

Спасибо за советы, я сейчас там поеду! Очень опираясь на основы, поэтому его очень неопрятный я знаю, извините! –

+1

@AlexW, если вы придерживаетесь и регулярно размещаете свой рабочий код для просмотра на [codereview.se], вы быстро узнаете, как писать чистый, поддерживаемый код. Увидимся на другой стороне! –

+0

Надеюсь! Я продолжаю практиковать –

Смежные вопросы