Литература
1. Беляев С.П. Курс лекций по «Исследованию операций».
2. Кузменко В.Г, Программирование на Microsoft Visual Basic for Applications 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 (ввод количества этапов работ, проверка формата листа, проверка правильности ввода, вызов справки, выход из программы, переход к расчётной форме)
'Проверка правильности ввода
Private Sub CommandButton1_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