Другие языки программирования и технологии

Нужна помощь в макросе VDA в userform. не корректно работает формула

Я делаю форму для заполнения данных, которая при нажатии кнопки пересчитывает данные из textbox и выдает результат расчета формулы. Проблема в том, что переменные и блок: ((1-B/A*C16)*D(переменная)) рассчитываются не корректно. то учитываются, то нет.
Планируется, что в эту форму будут заносить по очереди данные по разным поставщикам, с кнопки зачитывать результат, потом с другой кнопки результат будет заноситься в excel
Формула следующая:
((1-B/A*C16)*D(переменная))+(1-E/F)*L17+(1-G/H)*L18+(1-I/J)*K19+(1-L/M)*N+O(переменное значение)+P(переменное значение)

Макрос:
Private Sub CommandButton7_Click()
'переменные для весового значения сроков, качества, рекламации, коммуникации, документооборота
Dim weightDeadlines As Variant
Dim weightQuality As Variant
Dim weightComplaints As Variant
Dim weightCommunication As Variant
Dim weightDocuments As Variant
'переменные для пользовательской оценки из combobox
Dim est, estend, crit
' присваиваем значение для пользовательской оценки сроков и поставщика (Combobox8 и Combobox9)
If ComboBox8.Value = "Раньше срока" Then
est = "2"
ElseIf ComboBox8.Value = "В срок" Then
est = "1"
ElseIf ComboBox8.Value = "С задержкой" Then
est = "0"
ElseIf ComboBox8.Value = "С большой задержкой" Then
est = "0"
ElseIf ComboBox9.Value = "Отлично" Then
estend = "2"
ElseIf ComboBox9.Value = "Хорошо" Then
estend = "1"
ElseIf ComboBox9.Value = "Удовлетворительно" Then
estend = "0"
'коэффициент критичности исходя из допустимых дней просрочки
ElseIf ComboBox7.Value = 0 Then
cr = "1"
ElseIf ComboBox7.Value = "5" Then
cr = "0.8"
ElseIf ComboBox7.Value = "10" Then
cr = "0.6"
ElseIf ComboBox7.Value = "15" Then
cr = "0.4"
ElseIf ComboBox7.Value = "30" Then
cr = "0.2"
ElseIf ComboBox7.Value = "60" Then
cr = "0.1"
ElseIf ComboBox7.Value > "60" Then
cr = "0"
End If
' Вес переменных
weightDeadlines = 30
weightQuality = 40
weightComplaints = 10
weightCommunication = 10
weightDocuments = 10
' Расчет формулы
Dim result As Variant
result = (((1 - Val(TextBox16.Value) / Val(TextBox14.Value)) * Val(crit)) * weightDeadlines) + _
Val(est) + ((1 - Val(TextBox20.Value) / Val(TextBox19.Value)) * weightQuality) + _
((1 - Val(TextBox22.Value) / Val(TextBox21.Value)) * weightComplaints) + _
((1 - Val(TextBox24.Value) / Val(TextBox23.Value)) * weightCommunication) + _
((1 - Val(TextBox26.Value) / Val(TextBox25.Value)) * weightDocuments) + Val(estend)
' Вывод результатов
TextBox29.Value = Round(result, 1)
' Else
' Вывод уведомления, если не все поля заполнены
' MsgBox "Заполните все поля!"
'End If
End Sub
Похоже, что проблема в том, что вы пытаетесь использовать переменные в качестве аргументов функций. В VBA переменные должны быть объявлены перед использованием. В вашем макросе переменные объявляются только в конце, после того, как они уже используются в формуле.

Чтобы исправить это, вам нужно объявить переменные в начале макроса, перед тем, как вы начнете их использовать. Вот исправленный макрос:

Private Sub CommandButton7_Click()

' Переменные для весового значения сроков, качества, рекламации, коммуникации, документооборота
Dim weightDeadlines As Variant
Dim weightQuality As Variant
Dim weightComplaints As Variant
Dim weightCommunication As Variant
Dim weightDocuments As Variant

' Переменные для пользовательской оценки из combobox
Dim est As Variant
Dim estend As Variant
Dim crit As Variant

' Присваиваем значение для пользовательской оценки сроков и поставщика (Combobox8 и Combobox9)
If ComboBox8.Value = "Раньше срока" Then
est = 2
ElseIf ComboBox8.Value = "В срок" Then
est = 1
ElseIf ComboBox8.Value = "С задержкой" Then
est = 0
ElseIf ComboBox8.Value = "С большой задержкой" Then
est = 0
ElseIf ComboBox9.Value = "Отлично" Then
estend = 2
ElseIf ComboBox9.Value = "Хорошо" Then
estend = 1
ElseIf ComboBox9.Value = "Удовлетворительно" Then
estend = 0

' Коэффициент критичности исходя из допустимых дней просрочки
ElseIf ComboBox7.Value = 0 Then
crit = 1
ElseIf ComboBox7.Value = 5 Then
crit = 0.8
ElseIf ComboBox7.Value = 10 Then
crit = 0.6
ElseIf ComboBox7.Value = 15 Then
crit = 0.4
ElseIf ComboBox7.Value = 30 Then
crit = 0.2
ElseIf ComboBox7.Value = 60 Then
crit = 0.1
ElseIf ComboBox7.Value > 60 Then
crit = 0
End If

' Вес переменных
weightDeadlines = 30
weightQuality = 40
weightComplaints = 10
weightCommunication = 10
weightDocuments = 10

' Расчет формулы
Dim result As Variant
result = (((1 - Val(TextBox16.Value) / Val(TextBox14.Value)) * Val(crit)) * weightDeadlines) + Val(est) +
((1 - Val(TextBox20.Value) / Val(TextBox19.Value)) * weightQuality) +
((1 - Val(TextBox22.Value) / Val(TextBox21.Value)) * weightComplaints) +
((1 - Val(TextBox24.Value) / Val(TextBox23.Value)) * weightCommunication) +
((1 - Val(TextBox26.Value) / Val(TextBox25.Value)) * weightDocuments) + Val(estend)

' Вывод результатов
TextBox29.Value = Round(result, 1)

' Else
' Вывод уведомления, если не все поля заполнены
' MsgBox "Заполните все поля!"
'End If

End Sub
С-
Саске -----
1 900
Лучший ответ
Сергей Болотов Добрый день.
Благодарю! Протестировал. мне кажется, что только при первой активации срабатывает корректно. Дальше, если изменить данные, результат не корректен. не учитываются некоторые данные из textbox
А как ты в один IF засунул 3 разные проверки ComboBox7, ComboBox8 и ComboBox9 ?! И ещё ждёшь, что эта форменная бредятина будет работать ?
ДИ
Денис Исаков
37 597