2016-01-06 3 views
-1

Итак, я думаю, что я делаю что-то неправильно, но мне нужно небольшое руководство.Несколько ошибок с отступом выводов?

Под кодом, приведенным ниже, предполагается расчет одним способом, основанным на выводе «Награждение». В настоящее время мой расчет неправильно вычисляет (поскольку он думает, что это «обе половины одного и того же термина»). Я считаю, что это связано с моим отступом или неправильным использованием нескольких вложенных операторов if.

If Awarding = "First Half All Credits in One Half" Or Awarding = "Second Half Only" Then 
    If LEU.Value <> "" And PLEU < CalcElig Then 
     Payment1.Value = PLEU 
    If PAmtUnused < CalcElig Then 
     Payment1.Value = PAmtUnused 
    Else: Payment1.Value = Payment1.Value = Round(CLng(PSchAward) *  PTotalAyWeeks/PMinAyWeeks/2, 0) 
    End If 

    PPayment1 = Payment1.Value 
    PPayment2 = 0 
    TotalPayment = PPayment1 + PPayment2 
    End If 
End If 


If Awarding = "Both Halfs Same Term" Then 
    If LEU.Value <> "" And PLEU < CalcEligA Then 
     Payment1.Value = PLEU 
    ElseIf PAmtUnused < CalcEligA Then 
     Payment1.Value = PAmtUnused 
    Else: Payment1.Value = CalcEligA 
    End If 


    PPayment1 = Payment1.Value 


    If LEU.Value <> "" And PLEU > 0 Then 
     Payment2.Value = PLEU - PPayment1 
    Else: Payment2.Value = CalcEligB 
    End If 

    If PAmtUnused - PPayment1 < PLEU - PPayment1 Then 
     Payment2.Value = PAmtUnused - PPayment1 
    ElseIf PAmtUnused - PPayment1 < CalcEligB Then 
     Payment2.Value = PAmtUnused - PPayment1 
    Else: Payment2.Value = CalcEligB 
    End If 


    PPayment2 = Payment2.Value 

    TotalPayment = PPayment1 + PPayment2 

    End If 

End If 

End Sub 
+2

отступы не имеют значения для компилятора, это только на благо людей. –

+0

Хорошо, я почему-то считал отступом? Тогда ум, обучая меня по моему явному оплоту тогда? –

+2

Если вы запрограммировали в Python, вы могли бы усвоить понятие о том, что отступы имеют значение. В принципе это не имеет значения в VBA - хотя белое пространство в виде новых строк имеет значение как терминатор утверждения. Тем не менее - последовательное отступы - это превосходно хорошая идея, даже если никто, кроме вас, скорее всего не прочитает код, поскольку, среди прочего, это основная помощь в отладке. –

ответ

2

Проблема, кажется, в вашем первом блоке.

Ваш код (с дополнительными углублениями, чтобы показать поток):

If Awarding = "First Half All Credits in One Half" Or Awarding = "Second Half Only" Then 
    If LEU.Value <> "" And PLEU < CalcElig Then 
     Payment1.Value = PLEU 
     If PAmtUnused < CalcElig Then 
      'This will write over Payment1.Value if both If conditions are satisfied. 
      Payment1.Value = PAmtUnused 
     Else: Payment1.Value = Payment1.Value = Round(CLng(PSchAward) *  PTotalAyWeeks/PMinAyWeeks/2, 0) 
     'The else condition will write over Payment1.Value if the second If condition is not satisfied. 
     End If 
'Payment1.Value is NEVER set if the first IF statement evaluates to FALSE, 
' and it is written over if the first IF statement evaluates to TRUE!! 
     PPayment1 = Payment1.Value 
     PPayment2 = 0 
     TotalPayment = PPayment1 + PPayment2 
    End If 
End If 

То, что вы, вероятно, имел в виду (в связи с другими блоками):

If Awarding = "First Half All Credits in One Half" Or Awarding = "Second Half Only" Then 
    If LEU.Value <> "" And PLEU < CalcElig Then 
     Payment1.Value = PLEU 
    ElseIf PAmtUnused < CalcElig Then 
     Payment1.Value = PAmtUnused 
    Else: Payment1.Value = Payment1.Value = Round(CLng(PSchAward) *  PTotalAyWeeks/PMinAyWeeks/2, 0) 
    End If 

    PPayment1 = Payment1.Value 
    PPayment2 = 0 
    TotalPayment = PPayment1 + PPayment2 

End If 

Существует также дополнительная проблема.

Эта строка кода:

Else: Payment1.Value = Payment1.Value = Round(CLng(PSchAward) *  PTotalAyWeeks/PMinAyWeeks/2, 0) 

собирается поставить ИСТИНА или ЛОЖЬ в payment1. Это то же самое, как:

Else: Payment1.Value = (Payment1.Value = Round(CLng(PSchAward) *  PTotalAyWeeks/PMinAyWeeks/2, 0)) 

, где часть в скобках оценивается как ли два значения по обе стороны от знака равенства равны.

Вы, вероятно, имел в виду только один равенство:

Else: Payment1.Value = Round(CLng(PSchAward) *  PTotalAyWeeks/PMinAyWeeks/2, 0) 

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

+0

спасибо за указание всех ошибок синтаксиса. Основная проблема по-прежнему заключается в том, что конец кода, в котором «If Awarding =« Both Halfs Same Term »« возникает », является окончательным результатом формы пользователя, когда у меня есть« Награждение = «Первая половина всех кредитов за одну половину» или «Награждение» = «Только второй тайм» « –

+1

Что это значит? «Окончательный вывод пользовательской формы»? Какую строку кода производит этот вывод? Какая строка вызывает его в форме пользователя? Какие вклады вы даете (с точки зрения переменной присвоения) и что именно происходит в результате этого ввода? После выполнения кода, как выполняется программа? – OpiesDad

+1

Кроме того, если исправления, которые я предоставил, приводят к одной и той же проблеме, я бы обновил вопрос, включив код с фиксированным синтаксисом, а затем объясню, в чем проблема, включая ответы на вопросы, заданные в предыдущем комментарии , – OpiesDad

0

Несмотря на то, что OpiesDad была отличной помощью, выяснилось, что были некоторые ДЕЙСТВИТЕЛЬНО плохие проблемы синтаксиса. Я должен был переделать все это, чтобы быть менее загроможденным и иметь больше смысла. Решение - это INF, отличное от исходного, но я хотел сделать, чтобы опубликовать ответ.

Главная точка раздора:

Trying to separate calculations 
Multiple static value declarations 
Being dumb 
Смежные вопросы