После нажатия на кнопку «ОК» откроется меню решения
В конкретном примере перевод единиц времени не требуется, но для наглядности можно осуществить перевод. Допустим имеются данные о длительности в днях, но есть необходимость представить их в часах.
Произведя расчёт получим итоговую таблицу:
Можно осуществить обратный перевод единиц времени.
Эта задача была решена ранее без использования ЭВМ и имела решение:
Виды работ | Продол-житель-ность | Время раннего начала | Время раннего конца | Время позднего начала | Время позднего конца | Полный резерв |
1-2 | 2 | 0 | 2 | 6 | 8 | 6 |
1-4 | 1 | 0 | 1 | 1 | 3 | 2 |
1-5 | 4 | 0 | 4 | 0 | 4 | 0 |
2-3 | 3 | 2 | 5 | 8 | 11 | 6 |
4-3 | 5 | 1 | 6 | 6 | 11 | 4 |
4-6 | 3 | 1 | 4 | 3 | 6 | 2 |
4-7 | 1 | 1 | 2 | 4 | 5 | 3 |
4-9 | 3 | 1 | 4 | 8 | 11 | 7 |
5-6 | 2 | 4 | 6 | 4 | 6 | 0 |
6-10 | 5 | 6 | 11 | 6 | 11 | 0 |
7-8 | 6 | 2 | 8 | 5 | 11 | 3 |
7-9 | 2 | 2 | 4 | 9 | 11 | 7 |
При запуске Excel файла появляется стартовое окно, на котором располагаются 2 кнопки:
«Начать работу» при нажатии на эту кнопку вызывается окно ввода начальных данных.
«Выход» при нажатии на эту кнопку происходит закрытие программы и Excel.
В окне ввода начальных данных пользователь задает число этапов работ (число должно быть целым в диапазоне от 3 до 254)
В форме находятся 4 кнопки и флажок
· «ОК» - формирование таблицы исходных данных и включение режима заполнения таблицы.
· «Отмена» - закрытие формы
· «Справка» - вызов справки о программе
· «Пропустить» - переход к форме решения
· «Включить подсказки» - включение поясняющих окон.
После заполнения таблицы пользователь переходит к окну решения
На котором располагаются 3 кнопки:
· «Определение критического пути» - расчёт критического пути и сопутствующих данных и вывод результатов на экран.
· «Возврат к вводу начальных данных» - открытие окна ввода начальных данных и листа ввода.
· «Перевод единиц времени» - открытие окна перевода единиц времени в котором нужно выбрать текущие единицы времени и нажать кнопку «ОК», затем выбрать требуемые единицы времени и нажать кнопку «ОК».
В результате выполнения работы был изучен алгоритм нахождения критического пути и составления таблицы сетевого графика. На основе алгоритма реализована программа, обеспечивающая графический интерфейс пользователя, табличный ввод данных и табличный вывод полученных результатов.
Литература
1. Беляев С.П. Курс лекций по «Исследованию операций».
2. Кузменко В.Г, Программирование на Microsoft Visual BasicforApplications 2003 /Москва изд. Бином; 2004г. – 880 с.: ил.
Листинг программы
Форма About (справка о программе)
Private Sub UserForm_Terminate()
Hide
InsForm.Show
End Sub
Форма HelpForm1 (помощь в заполнении таблицы)
Private Sub CommandButton1_Click()
Hide
OKForm.StartUpPosition = 0
OKForm.Top = 450
OKForm.Left = 580
OKForm.Show
End Sub
Private Sub CommandButton2_Click()
Hide
InsForm.Show
End Sub
Private Sub UserForm_Terminate()
Hide
InsForm.Show
End Sub
Форма HelpForm2 (помощь в понимании результатов вычислений)
Private Sub CommandButton1_Click()
check = True
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
End Sub
Private Sub CommandButton2_Click()
check = False
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
End Sub
Форма HelpForm3 (помощь в переводе единиц времени)
Private Sub CommandButton1_Click()
check = True
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
End Sub
Private Sub CommandButton2_Click()
check = False
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
End Sub
Форма InsForm (ввод количества этапов работ, проверка формата листа, проверка правильности ввода, вызов справки, выход из программы, переход к расчётной форме)
'Проверка правильности ввода
PrivateSubCommandButton1_Click()
Dim Answer As String
Application.ScreenUpdating = False
If iget.Value = "" Then
MsgBox "Введитеколичествоэтапов", vbCritical + vbOKOnly, "Ошибкаввода"
Exit Sub
End If
If Not (IsNumeric(iget.Value)) Then
MsgBox "Количество этапов работы должно быть числом", vbCritical + vbOKOnly, "Ошибка ввода"
Exit Sub
End If
If iget.Value < 3 Then
MsgBox "Количество этапов работы должно быть не менее 3", vbCritical + vbOKOnly, "Ошибка ввода"
Exit Sub
End If
If iget.Value > 254 Then
MsgBox "Количество этапов работы должно быть не более 222", vbCritical + vbOKOnly, "Ошибка ввода"
Exit Sub
End If
n = Fix(iget.Value)
'Проверка листа на наличие информации
For i = 1 To 254
For j = 1 To 254
If Not ActiveSheet.Cells(i, j).Value = "" Then
Answer = MsgBox("Лист содержит информацию! При продолжении она будет уничтожена! Продолжить?", vbCritical + vbOKCancel, "Предупреждение")
End If
If Answer = vbCancel Then
i = 254
j = 254
Exit Sub
End If
If Answer = vbOK Then
i = 254
j = 254
End If
Next j
Next i
'Построение таблицы ввода и переход к ней
Range("A1:IV254").Select
Selection.Clear
InsData
Application.ScreenUpdating = True
Hide
If help.Value = True Then
hlp = True
HelpForm1.Show
Else
hlp = False
OKForm.StartUpPosition = 0
OKForm.Top = 450
OKForm.Left = 580
OKForm.Show
End If
End Sub
Private Sub CommandButton2_Click()
Hide
STF.Show
End Sub
Private Sub CommandButton3_Click()
Hide
About.Show
End Sub
Public Sub Start()
iget.Value = n
End Sub
Private Sub CommandButton4_Click()
Dim flag As Boolean
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
flag = True
n = 1
If Not ActiveSheet.Cells(1, 1).Value = "№" Then
MsgBox "Лист не отформатирован для расчёта, воспользуйтесь окном ввода данных", vbCritical + vbOKOnly, "Ошибка"
Hide
InsForm.Show
Exit Sub
End If
Do While flag
n = n + 1
If ActiveSheet.Cells(n, 1).Value = "" Then
flag = False
End If
If ActiveSheet.Cells(n, 1).Value = n - 1 Then
flag = True
Else: flag = False
End If
Loop
n = n - 2
For i = 2 To n
If Not ActiveSheet.Cells(1, i).Value = i - 1 Then
MsgBox "Лист не отформатирован для расчёта, воспользуйтесь окном ввода данных", vbCritical + vbOKOnly, "Ошибка"
Hide
InsForm.Show
Exit Sub
End If
Next i
End Sub
Private Sub SpinButton1_SpinUp()
If iget.Value <= 222 Then
iget.Value = iget.Value + 1
Else
Exit Sub
End If
End Sub
Private Sub SpinButton1_SpinDown()
If iget.Value >= 4 Then
iget.Value = iget.Value - 1
Else
Exit Sub
End If
End Sub
Private Sub UserForm_Initialize()
iget.Value = 10
Sheets("Data").Select
End Sub
Private Sub UserForm_Terminate()
Hide
STF.Show
End Sub
Форма OKForm (подтверждение окончания ввода начальных данных)
Private Sub CommandButton1_Click()
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
Hide
SolForm.Show
End Sub
Private Sub UserForm_Terminate()
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
End Sub
Форма Perevod1 (запоминание текущих единиц времени)
'Запоминание текущих единиц времени
Private Sub CommandButton1_Click()
If Minutes.Value = True Then
edin = 1
End If
If Chas.Value = True Then
edin = 2
End If
If Sutki.Value = True Then
edin = 3
End If
If Nedeli.Value = True Then
edin = 4
End If
If Mes.Value = True Then
edin = 5
End If
If Godi.Value = True Then
edin = 6
End If
Hide
Perevod2.Show
End Sub
Private Sub UserForm_Terminate()
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
End Sub
Форма Perevod2 (перевод единиц времени, возврат к расчётной форме)
'Переводединицвремени
Private Sub CommandButton1_Click()
Hide
SolForm.Show
If ActiveSheet.Cells(1, 1).Value = "№" Then
If edin = 1 Then
If Minutes.Value = True Then
Exit Sub
End If
If Chas.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 60
End If
Next j
Next i
End If
If Sutki.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 1440
End If
Next j
Next i
End If
If Nedeli.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 10080
End If
Next j
Next i
End If
If Mes.Value = True Then
MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"
End If
If Godi.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 525600
End If
Next j
Next i
End If
End If
If edin = 2 Then
If Minutes.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 60
End If
Next j
Next i
End If
If Chas.Value = True Then
Exit Sub
End If
If Sutki.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 24
End If
Next j
Next i
End If
If Nedeli.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 168
End If
Next j
Next i
End If
If Mes.Value = True Then
MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"
End If
If Godi.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 8760
End If
Next j
Next i
End If
End If
If edin = 3 Then
If Minutes.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 1440
End If
Next j
Next i
End If
If Chas.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 24
End If
Next j
Next i
End If
If Sutki.Value = True Then
Exit Sub
End If
If Nedeli.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not ActiveSheet.Cells(i, j).Value = "" Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 7
End If
Next j
Next i
End If
If Mes.Value = True Then
MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"
End If
If Godi.Value = True Then
For i = 2 To n + 1
For j = 2 To n + 1