Титульный лист. struct ship //элемент списка
class shiplist { public:
struct ship //элемент списка { int x,y; ship* nextright; ship* nextdown;
ship(int _x, int _y, ship *nr = NULL, ship *nd = NULL)// конструктор с передающ значениями { x = _x; y = _y; nextright = nr; nextdown = nd; } };
int shipCount; ship* first; // Первый элемент ship* firstdown; //Верхний элемент ship* lastright; //Последний элемент в списке корабля ship* lastdown;// Последний элемент в списке кораблей
shiplist() // Конструктор списка
{ shipCount = 0; first = firstdown = lastright = lastdown = NULL; }
void addshipFirst(int _x, int _y) //добавление первого корабля { ship* newship = new ship(_x, _y);
first = newship; lastright = newship; lastdown = newship; shipCount++;
}
void addshipRight(int _x, int _y) //добавление корабля вправо(ячейки) { ship* newship = new ship(_x, _y);
lastright->nextright = newship; lastright = newship; shipCount++;
} void addshipDown(int _x, int _y) //добавление первой ячейки следующего корабля { ship* newship = new ship(_x, _y);
lastdown->nextdown = newship; lastdown = newship; lastright = newship; shipCount++; }
bool delShip (int _x, int _y) //удаление ячейки { ship* prev = NULL, *current = first, *lastdown = first, *prevup = NULL; while (current) //пока не 0 { while (current->nextdown) //пока снизу не ноль { while(current->nextright) //пока справа не ноль { if ((current->x == _x) && (current->y == _y)) //если значения совпали { if (current == first) //если первый { if(current->nextright) //если справа что-то есть { current->nextright->nextdown = current->nextdown; first = current->nextright; lastdown = first; delete current; shipCount--; current = first; return true; } else { first = current->nextdown; lastdown = first; delete current; shipCount--; current = first; return true; }
}
else if ((prev == 0) && (prevup!= 0) && (current->nextright!= 0)) //если слева пусто и сверху есть клетка и справа не пусто { prevup->nextdown = current->nextright; current->nextright->nextdown = current->nextdown; lastdown = current->nextright; delete current; shipCount--; current = lastdown; return true; }
else if (prev) //если предыдущий не равен 0 { prev->nextright = current->nextright; delete current; shipCount--; current = prev->nextright; return true; }
} else //если значения не совпали идём дальше { prev = current; current = current->nextright; } } if ((current->x == _x) && (current->y == _y)) //если справа 0 { if(prev) //если слева не пусто { prev->nextright = 0; delete current; shipCount--; current = prev; return true; }
else if ((prev == 0) && (prevup!= 0) && (current->nextright == 0) && (current->nextdown!=0)) //если слева пусто и сверху есть клетка и справа пусто и снизу не пусто { prevup->nextdown = current->nextdown; lastdown = current->nextdown; delete current; shipCount--; current = lastdown; return true; }
}
prevup = lastdown; current = lastdown->nextdown; lastdown = current; prev = 0;
} delete current; shipCount--; return true;
} return false; } }
Титульный лист При открытии рабочей книги появляется сообщение Microsoft Excel и автоматически скрывается панель инструментов. Рисунок 1. Титульный лист Программный код для этого процесса следующий: Private Sub Workbook_Open() Sheets("Меню").Activate MsgBox ("Вас приветствует информационно - аналитическая система Зарплата!!!") End Sub При нажатии кнопки «Меню» на титульном листе появляется сообщение о запросе пользователя: Рисунок 2 Знакомство
При нажатии кнопки «ОК» на запросе о пользователи, переходим на лист «Главное меню», где расположены кнопки перехода на все листы приложения, а так же кнопки «Об авторе» и кнопка «Выход из Excel»: Рисунок 3. Главное меню
Для кнопок перехода на все листы приложения созданы следующие программные коды: Sub переход1() '' переход1 Макрос Sheets("Табель учёта рабочего времени ").Select MsgBox (" Вы перешли на лист Табель учёта рабочего времени!") End Sub Кнопки Тарифы, Сводная таблица, Диаграмма, Ведомость, Итоги, Формы, Расширенный фильтр, Функции аналогичны одноименной кнопке, рассмотренной выше.
При нажатии на кнопки «Об авторе» появляется пользовательская форма, где расположена информация о разработчике данной информационно-аналитической системы «Зарплата» Рисунок 4. Сведения об авторе К кнопке Об авторе привязан следующий программный код: Private Sub CommandButton1_Click() UserForm3.Hide End Sub К кнопке «Выход из Excel» привязан следующий код: Sub Выход() ' Выход Макрос Dim txtСообщение As String, txtЗагловок As String Dim Кнопки As Integer, Результат As Integer txtСообщение = "Вы действительно хотите выйти из Excel" txtЗаголовок = "До свидания!" Кнопки = vbYesNo + vbQuestion + vbfaultButton2 Результат = MsgBox(txtСообщение, Кнопки, txtЗаголовок) If Результат = vbYes Then Application.Quit Else MsgBox "Выход не состоится", vbOKOnly, "Снова привет!" End If End Sub 2. Лист «Табель учёта рабочего времени» Рисунок 5. Табель учёта рабочего времени.
На листе расположена информация о рабочих завода. Указаны их Ф.И.О., наименование цеха, специальность, количество отработанных дней, зарплата, удержания и сумма к выдаче. На листе «Табель учета рабочего времени» расположены кнопки «Среднемесячный заработок» и «Отмена». Макросы для кнопок: Sub Среднемячный_заработок() ' Среднемячный_заработок Макрос Range("I10").Select ActiveCell.FormulaR1C1 = "=AVERAGE(RC[-3]:R[39]C[-3])" ActiveWindow.ScrollRow = 9 ActiveWindow.ScrollRow = 6 ActiveWindow.ScrollRow = 5 ActiveWindow.ScrollRow = 4 ActiveWindow.ScrollRow = 3 ActiveWindow.ScrollRow = 2 ActiveWindow.ScrollRow = 1 End Sub Sub Отмена_среднемесячного() ' Отмена_среднемесячного Макрос Range("I10").Select Selection.ClearContents End Sub Так же на листе «Табель учёта рабочего времени» расположена одна кнопка «Действия над данными», при нажатии которой выходит окно: Рисунок 6. Действия над данными При нажатии кнопки «Добавление данных»: Рисунок 7. Добавление данных в табель учёта рабочего времени.
Программный код для кнопки « Добавить»: Private Sub CommandButton1_Click() Dim текущая As Object Dim следующая As Object If TextBox1 = "" Or Text2 = " " Or TextBox3 = "" Or TextBox4 = "" Then MsgBox ("Введены не все данные") Exit Sub End If ActiveWorkbook.Sheets("Табель учёта рабочего времени").Select Set текущая = ActiveSheet.Range("A50") Do While Not IsEmpty(текущая) Set следующая = текущая.Offset(1, 0) Set текущая = следующая Loop текущая.Value = TextBox5.Text текущая.Offset(0, 1).Value = TextBox1.Text текущая.Offset(0, 2).Value = TextBox2.Text текущая.Offset(0, 3).Value = TextBox3.Text TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" End Sub
Для кнопки «Отмена» Private Sub CommandButton2_Click() UserForm7.Hide End Sub
Кнопка «Удаление данных»: Рисунок 8. Удаление данных. К кнопке «Удалить» привязан следующий код: Private Sub ComboBox1_Change() ActiveWorkbook.Sheets("Табель учёта рабочего времени").Select Dim i As Integer Dim j As Integer Dim a As Integer Dim строка As Integer строка = Application.CountA(Sheets("Табель учёта рабочего времени").Columns(1)) i = 9 Do While i <= строка i = i + 1 If Cells(i, 1) = " " Then j = i Exit Do End If Loop
For b = 10 To i If ComboBox1.Text = Cells(b, 2).Value Then TextBox1.Value = Cells(b, 3) TextBox2.Value = Cells(b, 4) TextBox3.Value = Cells(b, 5) End If Next b
End Sub
Private Sub CommandButton1_Click() Me.Hide If ComboBox1.Text = Empty Then MsgBox "Вы должны выбрать фамилию рабочего" Me.Show Else f = MsgBox("Сейчас произойдет удаление", vbOKCancel) End If If f = vbOK Then Sheets("Табель учёта рабочего времени").Select Dim i As Integer Dim j As Integer Dim строка As Integer строка = Application.CountA(Sheets("Табель учёта рабочего времени").Columns(1)) i = 11 Do While i <= строка i = i + 1 If Cells(i, 1) = " " Then j = i Exit Do End If Loop For b = 11 To i If ComboBox1.Text = Cells(b, 9) Then Cells(b, 9).Select Selection.EntireRow.Delete
End If Next b End If
End Sub
Private Sub CommandButton2_Click() UserForm4.Hide End Sub
Private Sub TextBox1_Change() If IsNumeric(TextBox1.Text) And Len(TextBox1) <> 0 Then MsgBox " Надо вводить только текстовые данные!", vbOKOnly + vbInformation TextBox1.Value = "" TextBox1.SetFocus End If End Sub
Private Sub TextBox2_Change() If IsNumeric(TextBox2.Text) And Len(TextBox2) <> 0 Then MsgBox " Надо вводить только текстовые данные!", vbOKOnly + vbInformation TextBox2.Value = "" TextBox2.SetFocus End If End Sub
Private Sub TextBox3_Change() If TextBox3.Value < 0 Then MsgBox "Числа не должны быть отрицательные!", vbOKOnly + vbInformation TextBox3.SetFocus End If If Not IsNumeric(TextBox3.Text) And Len(TextBox3) <> 0 Then MsgBox "Вводить надо числовые данные!", vbOKOnly + vbInformation TextBox3.Value = "" TextBox3.SetFocus End If End Sub
Private Sub UserForm_Activate() TextBox1.Text = " " TextBox2.Text = " " TextBox3.Text = "" ComboBox1.Text = " " End Sub Private Sub ComboBox1_Enter() ComboBox1.Clear Sheets("Табель учёта рабочего времени").Select Dim i As Integer, j As Integer, строка As Integer строка = Application.CountA(Sheets("Табель учёта рабочего времени").Columns(2))
i = 11 Do While i <= строка i = i + 1 If Cells(i, 2) = " " Then j = i Exit Do End If Loop For a = 11 To i ComboBox1.AddItem Cells(a, 2) Next a End Sub Код для кнопки «Отменить» Private Sub CommandButton2_Click() UserForm4.Hide End Sub
Кнопка «Поиск и изменение данных»: Рисунок 9. Поиск и изменение данных Программный код: Private Sub ComboBox1_Change() ListBox1.Clear TextBox1.Text = "" TextBox2.Text = "" 1 For sss = 10 To 5000 If ComboBox1.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 3).Text Then ListBox1.AddItem Sheets("Табель учёта рабочего времени").Cells(sss, 2).Text End If Next End Sub
Private Sub CommandButton1_Click() For sss = 10 To 8000 If ComboBox1.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 3).Text And ListBox1.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 2).Text Then Worksheets("Табель учёта рабочего времени").Cells(sss, 5) = TextBox2.Text End If Next ListBox1.Clear TextBox1.Text = "" TextBox2.Text = "" End Sub Private Sub CommandButton2_Click() poisk.Hide End Sub Private Sub ListBox1_Click() For sss = 10 To 8000 If ComboBox1.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 3).Text And ListBox1.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 2).Text Then TextBox1.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 3).Text TextBox2.Text = Sheets("Табель учёта рабочего времени").Cells(sss, 4).Text End If Next End Sub Private Sub TextBox1_Change() End Sub Private Sub TextBox2_Change() End Sub Private Sub UserForm_Activate() Sheets("Табель учёта рабочего времени").Select Range("A10:H8000").Select Selection.Sort Key1:=Range("C9"), Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom 1 For ads = 11 To 8000 If Sheets("Табель учёта рабочего времени").Cells(ads, 3).Text = "" Then Exit Sub If Sheets("Табель учёта рабочего времени").Cells(ads, 4).Text = Sheets("Табель учёта рабочего времени").Cells(ads + 1, 2).Text Then GoTo 3 ComboBox1.AddItem Sheets("Табель учёта рабочего времени").Cells(ads, 3).Text 3 Next End Sub
При нажатии кнопки «Меню главное» происходит переход на лист, где содержится главное меню. К кнопке «Закрыть» привязан следующий код: Private Sub CommandButton4_Click() UserForm5.Hide End Sub 3. Лист «Сортировка» Рисунок 10. Сортировка данных.
На этом листе осуществляется сортировка по возрастанию: по № п/п, по ФИО, по цеху, и по специальности, аналогично и по убыванию. На листе расположены две кнопки: Меню и Сортировка. При нажатии кнопки Сортировка выходит окно:
Рисунок 11. Сортировка данных
Программный код: Private Sub CommandButton1_Click() If OptionButton1 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("A9"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom ElseIf OptionButton2 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("A9"), Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom End If End Sub
Private Sub CommandButton2_Click() If OptionButton1 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom ElseIf OptionButton2 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("B8"), Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom End If End Sub
Private Sub CommandButton3_Click() If OptionButton1 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("C8"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom ElseIf OptionButton2 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("C8"), Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom End If End Sub
Private Sub CommandButton4_Click() If OptionButton1 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("D8"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom ElseIf OptionButton2 = True Then Range("A8:G1000").Select Selection.Sort Key1:=Range("D8"), Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom End If End Sub
Private Sub CommandButton5_Click() UserForm2.Hide End Sub Также на листе «Сортировка» расположена кнопка «Меню» - это переход на главное меню, к которой привязан следующий программный код: Sub Переходнатитульныйссортировки() ' Переходнатитульныйссортировки Макрос Sheets("Титульный лист").Select End Sub 4. Лист «Тарифы» Рисунок 12. Сводная таблица
На листе расположена таблица, состоящая из двух столбцов: «специальность» и «цена рабочего времени», а также на листе есть кнопки «добавление», «удаление», «табель учёта» и «кнопка меню», для перехода на лист «Главное меню» При нажатии на кнопку Добавить открывается форма «Добавление».
Рисунок 13. Добавление специальности Форма состоит из двух элементов Label1 и Label2,из двух текстовых полей TextBox1, TextBox2 и двух кнопок CommandButton1 со свойством Caption, которому присвоено значение «Добавить», и CommandButton2 со свойством Caption, которому присвоено значение «Закрыть». Программный код для кнопки «Добавить»: Private Sub CommandButton1_Click() Dim текущая As Object Dim следующая As Object If TextBox1 = "" Or Text2 = " " Then MsgBox ("Введены не все данные") Exit Sub End If ActiveWorkbook.Sheets("Тарифы").Select Set текущая = ActiveSheet.Range("A12") Do While Not IsEmpty(текущая) Set следующая = текущая.Offset(0, 1) Set текущая = следующая Loop текущая.Value = TextBox1.Text текущая.Offset(0, 1).Value = TextBox2.Text TextBox1.Text = "" TextBox2.Text = "" End Sub Для кнопки Закрыть Private Sub CommandButton2_Click() UserForm9.Hide End Sub
Форма «Удаление» Рисунок 14. Удаление специальности Форма состоит из одного элемента ComboBox и двух кнопок CommandButton Программный код для кнопки CommandButton1 (Удаление): Dim h As Byte Dim Y As Byte h = MsgBox("Вы действительно хотите удалить эту специальность?", vbYesNo + vbQuestion, "Удаление") If h = vbYes Then Else GoTo e name = ComboBox1 If ComboBox1 = "" Then Y = MsgBox("Удаление невозможно, так как не выделен объект", vbYes + vbQuestion, "Удаление") If Y = vbYes Then GoTo 12 Else GoTo e End If ActiveWorkbook.Sheets("Тарифы").Activate Set pr = ActiveSheet.Range("C11") Do While Not IsEmpty(pr) Set X = pr.Offset(1, 0) If pr = name Then pr.Select Selection.EntireRow.Delete End If Set pr = X Loop ActiveWorkbook.Sheets("Тарифы").Activate Set pr = ActiveSheet.Range("A6") Do While Not IsEmpty(pr) Set X = pr.Offset(1, 0) If pr = name Then pr.Select Selection.EntireRow.Delete End If Set pr = X Loop 12 ComboBox1 = "" TextBox1 = "" UserForm8.Hide e: End Sub
Программный код для кнопки CommandButton2 (Отмена): Private Sub CommandButton2_Click() UserForm8.Hide End Sub При нажатии кнопки «Табель учёта» и «Меню» происходит переход на эти листы 5. Лист «Сводная таблица и Диаграмма» Рисунок 15. Сводная таблица На листе «Сводная таблица» расположена сводная таблица, которая построена на основе главной таблицы листа «Табель учета рабочего времени». Сводная таблица – это вспомогательная таблица с помощью которой можно анализировать и объединять большие объёмы данных, быстро проводить общие и промежуточные итоги, обобщать только необходимы е данные и изменять их форму представления. На листе также присутствуют кнопки Диаграмма иМеню для перехода на лист «Меню» и «Диаграмма» для перехода на лист «Диаграмма1». Рисунок 16. Диаграмма. На листе расположена диаграмма, в яркой форме отображающая информацию о рабочих завода и зарплате.
|