If Godi.Value = True Then
For i = 2 To scount
For j = 3 To 8
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 8760
Next j
Next i
End If
If edin = 3 Then
If Minutes.Value = True Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 1440
If Chas.Value = True Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 24
If Sutki.Value = True Then
Exit Sub
If Nedeli.Value = True Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 7
If Mes.Value = True Then
MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 365
If edin = 4 Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 10080
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 168
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 7
If edin = 5 Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 12
If edin = 6 Then
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 525600
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 8760
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 365
ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 12
End Sub
Private Sub UserForm_Terminate()
Hide
SolForm.StartUpPosition = 0
SolForm.Top = 350
SolForm.Left = 480
SolForm.Show
Форма SolForm (проверка правильности заполнения таблицы, проверка формата листа, проверка наличия данных в листе результатов, вызов модуля формирования и заполнения таблицы результатов)
Private Sub CommandButton1_Click()
Dim Ans As String
Dim fl As Boolean
Dim cou As Integer
cou = 0
check = True
If Not ActiveSheet.Cells(1, 1).Value = "№" Then
Ans = MsgBox("Лист не отформатирован для расчёта, воспользуйтесь окном ввода данных", vbCritical + vbOKCancel, "Ошибка")
If Ans = vbOK Then
InsForm.Show
Sheets("Data").Select
If Ans = vbCancel Then
For i = 2 To n + 1
For j = 2 To n + 1
If Not IsNumeric(ActiveSheet.Cells(i, j).Value) Then
MsgBox "Длительность работы должна выражаться числом!", vbCritical + vbOKOnly, "Ошибка"
markcell
kn = ActiveSheet.Cells(i, j).Value
kk = Fix(ActiveSheet.Cells(i, j).Value)
If kk < kn Then
MsgBox "Дробные числа дают погрешность при вычислении! Воспользуйтесь переводом единиц времени, чтобы получить целые числа.", vbCritical + vbOKOnly, "Ошибка"
If Not ActiveSheet.Cells(i, j).Value = "" Then
If Not ActiveSheet.Cells(j, i).Value = "" Then
MsgBox "Есть этапы, которые замыкаются сами на себя! Это приведёт к зацикливанию программы!", vbCritical + vbOKOnly, "Ошибка"
If Not ActiveSheet.Cells(i, i).Value = "" Then
j = i
MsgBox "Точка отсчёта не должна имееть длительности", vbCritical + vbOKOnly, "Ошибка"
fl = False
fl = True
If fl = True Then
cou = cou + 1
If cou = n Then
MsgBox "Должен быть хотя бы один начальный этап!", vbCritical + vbOKOnly, "Ошибка"
If cou = 0 Then
MsgBox "Должен быть хотя бы один конечный этап!", vbCritical + vbOKOnly, "Ошибка"
If hlp = True Then
HelpForm2.Show
If check = False Then
Application.ScreenUpdating = False
Sheets("Rez").Select
If Sheets("Rez").Cells(1, 1).Value = "Начальный этап" Then
Ans = MsgBox("Лист Rez уже содержит результаты вычислений. Сохранить вычисления в другом листе?", vbCritical + vbYesNo, "Информация")
If Ans = vbYes Then
Sheets.Add
For i = 1 To 222
For j = 1 To 8
ActiveSheet.Cells(i, j).Value = Sheets("Rez").Cells(i, j).Value
RTable
Range("A1:IV230").Select
Selection.Clear
Solut
Application.ScreenUpdating = True
Private Sub CommandButton2_Click()
InsForm.Start
Private Sub CommandButton6_Click()
If Not ActiveSheet.Cells(1, 1).Value = "Начальный этап" Then
MsgBox "Лист не отформатирован для расчёта, воспользуйтесь окном ввода данных", vbCritical + vbOKOnly, "Ошибка"
HelpForm3.Show
Perevod1.Show
STF.Show
Форма STF (вход в программу, завершение работы приложения)
Answer = MsgBox("Вы действительно хотите завершить работу?", vbYesNo + vbQuestion + vbDefaultButton2, "Завершение работы")
If Answer = vbYes Then
ThisWorkbook.Saved = True
Application.Quit
Private Sub UserForm_Initialize()
STF.Height = Application.Height
STF.Width = Application.Width
'STF.CommandButton1.Left = STF.Width / 4 - 36
'STF.CommandButton1.Top = STF.Top + 15
'STF.CommandButton2.Left = STF.Width / 2 - 10
'STF.CommandButton2.Top = STF.Top + 15
Модуль Result (построение таблицы результатов)
Sub RTable()
Range("A1:H1").Select
With Selection.Font
.name = "Arial Cyr"
.Size = 14
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
Range("A1").Select
ActiveCell.FormulaR1C1 = "Начальный этап"
With ActiveCell.Characters(Start:=1, Length:=14).Font
.FontStyle = "обычный"
Range("B1").Select
Columns("A:A").ColumnWidth = 15
ActiveCell.FormulaR1C1 = "Конечный этап"
With ActiveCell.Characters(Start:=1, Length:=13).Font
Range("C1").Select
Columns("B:B").ColumnWidth = 15
ActiveCell.FormulaR1C1 = "Продол- житель- ность"
With ActiveCell.Characters(Start:=1, Length:=20).Font
Range("D1").Select
Columns("C:C").ColumnWidth = 12
ActiveCell.FormulaR1C1 = "Время раннего начала"
Range("E1").Select
Columns("D:D").ColumnWidth = 12
ActiveCell.FormulaR1C1 = "Время раннего конца"
With ActiveCell.Characters(Start:=1, Length:=19).Font
Range("F1").Select
Columns("E:E").ColumnWidth = 12
ActiveCell.FormulaR1C1 = "Время позднего начала"
With ActiveCell.Characters(Start:=1, Length:=21).Font
Range("G1").Select
Columns("F:F").ColumnWidth = 12
ActiveCell.FormulaR1C1 = "Время позднего конца"
Range("H1").Select
Columns("G:G").ColumnWidth = 12
ActiveCell.FormulaR1C1 = "Полный резерв"
Range("I1").Select
Columns("H:H").ColumnWidth = 11
Range("A2").Select
Rows("1:1").RowHeight = 55.5
Модуль Solve (построение таблицы начальных данных, нахождение критического пути и сопутствующих данных, выделение ячейки, содержащей неверную информацию)
Public i As Integer
Public j As Integer
Public check As Boolean
Public edin As Integer
Public hlp As Boolean
Public st1 As String
Public st2 As String
Public stroka1 As String
Public stroka2 As String
Public scount As Integer
Public snum As Integer
Public n As Integer
'Модуль построения таблицы
Sub InsData()
st1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
h = n
If h > 26 Then
a = h \ 26
If h Mod 26 = 0 Then
stroka1 = Mid(st1, a - 1, 1)
Else
stroka1 = Mid(st1, a, 1)
b = a * 26
c = h - b
If c = 0 Then c = c + 26
stroka2 = Mid(st1, c, 1)
st2 = stroka1 + stroka2
st2 = Mid(st1, h + 1, 1)
If h = 26 Then
st2 = Mid(st1, 26, 1)
Range("A1:" + Trim(st2) + Trim(Str(n + 1))).Select
Rows("3:3").RowHeight = 18
ActiveCell.FormulaR1C1 = "№"
ActiveCell.FormulaR1C1 = "1"
Range("A3").Select
ActiveCell.FormulaR1C1 = "2"
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" + Trim(Str(n + 1))), Type:=xlFillDefault
Range("A2:A" + Trim(Str(n + 1))).Select
Range("B1:C1").Select
Selection.AutoFill Destination:=Range("B1:" + Trim(st2) + "1"), Type:=xlFillDefault
.WrapText = False
Range("A1:A" + Trim(Str(n + 1)) + ",A1:" + Trim(st2) + "1").Select
Range("A1").Activate
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
With Selection.Borders(xlEdgeTop)
With Selection.Borders(xlEdgeBottom)
With Selection.Borders(xlEdgeRight)
With Selection.Borders(xlInsideVertical)
With Selection.Borders(xlInsideHorizontal)
For i = 1 To n + 1
h = i
st2 = Mid(st1, h, 1)
Range(Trim(st2) + Trim(Str(i))).Select
Range("C2").Select
Sub Solut()
Dim flag As Boolean
Dim remnach As Integer
Dim remkon As Integer
Dim remdl As Double
Dim maxdl As Double
Dim putt As Boolean
scount = 1
'Ввод в таблицу результатов начальных данных
scount = scount + 1
Sheets("Rez").Cells(scount, 1).Value = i - 1
Sheets("Rez").Cells(scount, 2).Value = j - 1
Sheets("Rez").Cells(scount, 3).Value = ActiveSheet.Cells(i, j).Value
'Поиск начальных этапов
If fl = False Then
For j = 2 To scount
If Sheets("Rez").Cells(j, 1).Value = i - 1 Then
Sheets("Rez").Cells(j, 4).Value = 0
Sheets("Rez").Cells(j, 5).Value = Sheets("Rez").Cells(j, 4).Value + Sheets("Rez").Cells(j, 3).Value
'Заполнение раннего начала и конца
flag = True
Do While flag = True
flag = False
If Not Sheets("Rez").Cells(i, 4).Value = "" Then
remkon = Sheets("Rez").Cells(i, 2)
remdl = Sheets("Rez").Cells(i, 5)
If Sheets("Rez").Cells(j, 2).Value = remkon Then
If remdl < Sheets("Rez").Cells(j, 5).Value Then
remdl = Sheets("Rez").Cells(j, 5).Value
If Sheets("Rez").Cells(j, 1).Value = remkon Then
Sheets("Rez").Cells(j, 4).Value = remdl
If Sheets("Rez").Cells(i, 4).Value = "" Then
Loop
'Определение длительности проекта
maxdl = Sheets("Rez").Cells(2, 5).Value
If maxdl < Sheets("rez").Cells(i, 5).Value Then
maxdl = Sheets("rez").Cells(i, 5).Value
'Определение конечных этапов
If Sheets("Rez").Cells(j, 2).Value = i - 1 Then
Sheets("Rez").Cells(j, 7).Value = maxdl
Sheets("Rez").Cells(j, 6).Value = Sheets("Rez").Cells(j, 7).Value - Sheets("Rez").Cells(j, 3).Value
Sheets("Rez").Cells(j, 8).Value = Sheets("Rez").Cells(j, 7).Value - Sheets("Rez").Cells(j, 5).Value
'Заполнение позднего начала и конца
For i = scount To 2 Step -1
If Not Sheets("Rez").Cells(i, 6).Value = "" Then
remnach = Sheets("Rez").Cells(i, 1)
remdl = Sheets("Rez").Cells(i, 6)
For j = scount To 2 Step -1
If Sheets("Rez").Cells(j, 1).Value = remnach Then
If remdl > Sheets("Rez").Cells(j, 6).Value Then
remdl = Sheets("Rez").Cells(j, 6).Value
If Sheets("Rez").Cells(j, 2).Value = remnach Then
Sheets("Rez").Cells(j, 7).Value = remdl
If Sheets("Rez").Cells(i, 6).Value = "" Then
'Выявление критических этапов
If Sheets("Rez").Cells(i, 8).Value = 0 Then
Range("A" + Trim(Str(i)) + ":H" + Trim(Str(i))).Select
.ColorIndex = 35
Sheets("Rez").Cells(scount + 2, 1).Value = "Критический путь:"
'Построение критического пути
snum = 1
Sheets("Rez").Cells(scount + 2, 2).Value = Sheets("Rez").Cells(i, 1).Value
Sheets("Rez").Cells(scount + 2, 3).Value = Sheets("Rez").Cells(i, 2).Value
snum = 3
remdl = i
i = scount
For i = remdl To scount
Sheets("Rez").Cells(scount + 2, snum).Value = Sheets("Rez").Cells(i, 2).Value
snum = snum + 1
putt = False
For i = 2 To snum - 1
remdl = Sheets("Rez").Cells(scount + 2, i)
For j = i + 1 To snum
If Sheets("Rez").Cells(scount + 2, j).Value = remdl Then
putt = True
If putt = True Then
Sheets("Rez").Cells(scount, 3).Value = Sheets("Rez").Cells(i, 2).Value
i = 2
For i = remdl To 2 Step -1
Sheets("Rez").Cells(scount + 2, 1).Select
Sub markcell()
Dim mst1 As String
Dim mst2 As String
Dim mstroka1 As String
Dim mstroka2 As String
mst1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
h = j
mstroka1 = Mid(mst1, a - 1, 1)
mstroka1 = Mid(mst1, a, 1)
mstroka2 = Mid(mst1, c, 1)
mst2 = mstroka1 + mstroka2
mst2 = Mid(mst1, h, 1)
mst2 = Mid(mst1, 26, 1)
Range(Trim(mst2) + Trim(Str(i))).Select
Страницы: 1, 2, 3