Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Інформатика. Частина 4

.pdf
Скачиваний:
14
Добавлен:
23.02.2016
Размер:
2.75 Mб
Скачать

Щоб повністю очистити правий список, скористайтеся кнопкою "Стерти все"

При будь-яких змінах у правому списку кількість вибраних адрес переноситься в заголовок діалогу.

При виділенні будь-якої фірми як у правому, так і в лівому списку, її адреса показується в "моніторі" внизу діалогу.

Якщо при друці необхідно розмежувати адреси, поставте прапорець у пункті "Межі".

Після того, як вибрано все необхідне - "ОК". Лист повністю очиститься від старих даних. Адреси перенесуться в осередки по три адреси в ряд, загальна ширина буде відповідати ширині сторінки формату А4. В область друку увійдуть тільки осередки з адресами.

5.5. Розглянути роботу макросу SUMM.xls і створити

власний з аналогічними функціями

Призначення. Макрос підсумовує числові значення для записів з однаковими назвами.

У принципі "Суматор" - це спрощена версія інструменту "Підсумки". З одного боку, не володіє численними (і часто непотрібними!) налаштуваннями, а з іншого - виключно простий і зручний у використанні.

1.Скопіюйте в стовпець "Найменування" список того, що Ви хочете підрахувати.

2.У сусідній стовпець "Кількість" скопіюйте числові дані, які необхідно підсумувати для записів з однаковими назвами.

3.Якщо серед записів попадатимуться порожні рядки, то це не страшно.

4.У стовпець "Брак" нічого переносити не треба.

5.Само собою, при перенесенні інформації, дані в стовпцях "Найменування" і "Кількість" повинні одні одним відповідати.

6.Натисніть кнопку "Підсумовування". Макрос виявить однакові записи в стовпці "Найменування" і підсумує

31

значення для таких рядків. Однакові записи "з'єднуватимуться".

7.Якщо у стовпці "Кількість" попадатимуться осередки з нечислами, то ці випадки будуть зафіксовані у стовпці "Брак".

Текст власного макросу.

Option Explicit

Private sh As Worksheet ' сторінка на якій відбувається підрахунок

'Основна процедура

Private Sub CommandButton1_Click()

Set sh = ActiveSheet 'сторінка на якій відбувається підрахунок

Application.ScreenUpdating = False 'тимчасово відрубуємо оновлення екрана

Call DeleteEmptyRows 'Вилучаємоємо всі порожні записи Call Sortirovka 'Сортований за назвою

Call Summiruem 'Знаходимо однакові записи і підсумовуємо їх значення

Application.ScreenUpdating = True 'треба б знову увімкнути оновлення екрана...

End Sub

'Вилучаємо всі порожні записи

Private Sub DeleteEmptyRows()

'LastRow - останній використовуваний рядок, кількість рядків 'r - черговий рядок

Dim LastRow As Long, r As Long With sh.UsedRange

LastRow = .Rows.Count 'кількість рядків у використовуваному діапазоні

For r = LastRow To 3 Step -1 'від останнього рядка і до третьої

If .Cells(r, 1) = "" Then .Rows(r).Delete 'немає назви - видаляємо весь рядок!!!

Next

End With End Sub

'Сортуємо записи за назвою

32

Private Sub Sortirovka()

Dim endRow As Long 'номер останнього рядка

With sh.UsedRange

.Cells(3, 1).End(xlDown).Select 'виділяємо - від першого запису і до останньої

endRow = ActiveCell.Row

'сортуємо від першого запису і до останньої за назвою

.Range(Cells(3, 1), Cells(endRow, 3)).Sort key1:=Columns(1) End With

End Sub

'Знаходимо однакові записи і підсумовуємо їх значення 'Нагадуємо, що записи вже відсортовані за назвами 'У записів є НАЗВИ (1-й стовпець) і ЗНАЧЕННЯ (2-й стовпець)

Private Sub Summiruem()

Dim i As Long 'номер рядка поточного запису

Dim sum As Double 'загальна сума

'рядкові змінні для назв поточного запису і не-числа в значеннях записів

Dim tek, tek2, brak As String

i = 3: sum = 0: brak = "" 'починаємо з 3-го рядка, поки все по нулях 'Отже, поїхали!

Do

With sh

tek = .Cells(i, 1) 'назва чергового запису

tek2 = .Cells(i + 1, 1) 'назва запису рядком нижча

If Not IsNumeric(.Cells(i, 2)) And .Cells(i, 2) <> "" Then

'Якщо значення запису не-число, то кидаємо в "брак" brak = brak & " [" & .Cells(i, 2) & "]"

Else

sum = sum + .Cells(i, 2) 'приплюсували до загальної суми - якщо це було число

End If

If tek = tek2 Then 'якщо даі підряд записи з однаковими назвами, 'то перший вилучаємо - оскільки його значення до суми вже

приплюсували

.Rows(i).Delete

Else ' а якщо назви різні...

33

.Cells(i, 2)= sum 'записуємо для поточного запису все, що підрахували

'якщо були нечислові значення - повідомляємо про це в тому ж рядку

If brak <> "" Then .Cells(i, 3) = "БРАК - " & brak sum = 0 'обнуляємо суму

brak = "" 'очищаємо кошик для "браку"

i = i + 1 'переходимо до запису рядком нижче з іншою назвою!

End If

End With

Loop Until tek = "" 'і так до тих пір, поки не закінчаться записи

End Sub

5.6. Застосування Excel для аналізу інформації з бази

даних

ЗАВДАННЯ:

У вашій компанії ведеться облік товарів, які є на складі, за допомогою таблиці Товари бази даних Борей, яка розташована в каталозі C:\Program Files\Microsoft Office\OFFICEll\SAMPLES. У цій таблиці знаходяться такі важливі для вас стовпці:

?Код товару — ідентифікатор товару;

?Марка — найменування продукту;

?Ціна — вартість за одиницю продукту;

?На складі — кількість одиниць цього товару на складі;

?Мінімальний запас — мінімальна допустима кількість одиниць даного товару на складі. Якщо реальна кількість одиниць цього товару менша, ніж це значення, то товар потрібно терміново замовити;

?Поставки призупинені — прапор припинення роботи з товаром. Якщо в цьому стовпці стоїть одиниця, то це означає, що прийняте рішення закупівлю цього товару більше не проводити.

Решта всіх стовпців для цілей цієї роботи можна ігнорувати. Заповнення таблиці «Товари» проводиться за допомогою спеціалізованого застосування, створеного достатньо давно і не передбачено деяких необхідних форм.

Створити застосування на основі Excel, яке б:

34

1.Проводило вставку в сторінці Excel даних по всіх рядках і всіх стовпцях цієї таблиці.

2.Генерувало бпв Excel додаткові стовпці такого змісту:

"Замовити товару, штук" — різниця між стовпцями «Мінімальний запас» і «На складі». У цей стовпець повинна поміщатися інформація про кількість товару в штуках, яку потрібно терміново замовити. Цю інформацію потрібно генерувати тільки для тих записів, для яких значення в стовпці «Мінімальний запас» більше, ніж в стовпці «На складі», і в яких значення стовпця «Поставки призупинені» встановлено в False;

"Вартість замовлення" — визначало б вартість такого поповнення складу для кожного рядка в таблиці. Вартість замовлення розраховується як добуток попереднього стовпця і стовпця Ціна. Цю інформацію також потрібно генерувати тільки для тих записів, для яких значення в стовпці Мінімальний запас більше, ніж в стовпці «На складі».

3. Уставляло б по одному рядку під отриманими записами з бази даних два підсумкові рядки:

"Загальна вартість товарів на складі" — підсумкова вартість всіх товарів, які знаходяться на складі (як сума творів стовпців На складі і Ціна для кожного рядка);

"Загальна вартість товарів до замовлення" — підсумок по стовпцю «Стоимость заказа».

Порядок виконання

1.Створіть новий файл Excel, зробіть видимою панель управління Елементи управління, клацніть в нім по елементу управління Кнопка і помістіть кнопку на сторінку Excel. Для наших цілей ми вважатимемо, що створена кнопка займає два верхні рядки першої сторінки.

2.На панелі інструментів Елементи управління клацніть по кнопці Властивості (при цьому створена кнопка має бути виділена) і побудуйте для властивості Caption значення "Отримати дані". Скористайтеся властивістю Font, щоб побудувати відповідний шрифт для вашої кнопки.

3.Клацніть правою кнопкою миші по створеній вами кнопці і в контекстному меню виберіть «Початковий текст». Відкриється

35

редактор Visual Basic з курсором введення на місці події Click для вашої кнопки.

4.У вікні редактора коди в меню Tools виберіть References і встановіть прапорець напроти рядка Microsoft ACTIVEX Data Objects

2.1 Library.

5.Код для події Click вашої кнопки «Отримати дані» може бути таким, як показано далі.

Private Sub CommandButton1_Click()

'Спочатку — чистимо всю книгу від старих даних

Cells.Select

Selection.Clear

'Створюємо і настроюємо об'єкт Connection Dim cn As New

ADODB.Connection

cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Борей.mdb" cn.Open

'Створюємо і настроюємо об'єкт Recordset

Dim rs As New ADODB.Recordset

rs.Open "SELECT [Кодтовара] [Марка] [Ціна] [Наскладе]" _

& "[Мінімальнийзапас], [Поставкипрекращены] FROM Товари", cn 'На основі Recordset створюємо об'єкт QueryTable і

'вставляємо його, починаючи з 4-го рядка

Dim QT1 As QueryTable

Set QT1 = QueryTables.Add(rs, Range("A4")) QT1.Refresh

'Визначаємо кількість записів в QueryTable Dim nRowCount As

Integer Dim oRange As Range

Set oRange = QT1.ResultRange nRowCount = oRange.Rows.Count

'Формуємо стовпець "Замовити товару, штук" Range("G4").Value = "Замовити товару, штук" Range("G4").Font.Bold = True

Range("G4").Columns.AutoFit

'Формуємо стовпець "Вартість замовлення" Range("H4").Value = "Вартість замовлення" Range("H4").Font.Bold = True

Range("H4").Columns.AutoFit

'Створюємо діапазон, який включить стовпець G ' "уподовж" QueryTable

Set oRange = Range("G5", "G" & nRowCount + 3)

'Готуємо змінні, які нам буде потрібно в циклі

36

Dim oCell As Range

Dim sRowNumber As String Dim cMoney As Currency Dim cItogMoney As Currency Dim cItogSklad As Currency

'Проходимо циклом по всіх осередках створеного діапазону For Each oCell In oRange.Cells

'Отримуємо абсолютний номер рядка у вигляді строкової змінної sRowNumber = Replace(oCell.Address(True), "$G$", "")

'Перевіряємо певні нами умови

If Range("E" & sRowNumber).Value > Range("D" & sRowNumber) And Range("F" & sRowNumber).Value = False Then

'Набуваємо значення для стовпця G (замовлення в штуках) oCell.Value = (CInt(Range("E" & sRowNumber).Value) — _ CInt(Range("D" & sRowNumber).Value))

'Набуваємо значення для стовпця H (вартість замовлення)

cMoney = (CInt(Range("E" & sRowNumber).Value) — _ CInt(Range("D" & sRowNumber).Value)) * _ CCur(Range("C" & sRowNumber).Value)

'Записуємо його в стовпець H

Range("H" & sRowNumber).Value = cMoney

'Відразу плюсуємо до підсумку в гривнях cItogMoney = cItogMoney + cMoney End If

'І в тому ж циклі відразу підсумовуємо вартість товарів на складі cItogSklad = cItogSklad + (Range("C" & sRowNumber).Value * _ Range("D" & sRowNumber).Value)

Next

'Формуємо два рядки з підсумками Range("B" & nRowCount + 6).Value = "Загальна вартість товарів на складі:" Range("B" & nRowCount + 6).Font.Bold = True Range("B" & nRowCount + 7).Value

= "Загальна вартість товарів до замовлення:"

Range("B" & nRowCount + 7).Font.Bold = True Range("D" & nRowCount + 6).Value = cItogSklad Range("D" & nRowCount + 6).Font.Bold = True Range("D" & nRowCount + 7).Value = cItogMoney Range("D" & nRowCount + 7).Font.Bold = True

37

'Для краси виділяємо підсумкове значення Range("D" & nRowCount + 7).Select '... і вироблюваний скроллірування Range("D" & nRowCount + 7).Show

End Sub

5.7. Робота з елементами управління

Підготовка

1.Створіть нову книгу Excel і збережіть її як Prikaz.xls. Заповніть комірки з A1 по A5 значеннями. Дані про співробітників краще ввести в родовому відмінку, оскільки ці значення підставлятимуться в автоматично створюваний наказ у форматі документа Word.

Список співробітників на листі Excel

Відкрийте редактор Visual Basic і у вікні Project Explorer клацніть правою кнопкою миші по об'єкту Ця книга і в контекстному меню виберіть View Code.

3. У вікні редактора коди для «Цієї книги» введіть такий код: 'При відкритті робочої книги показуємо форму UF1 Private Sub

Workbook_Open()

UF1.Show End Sub

'Спеціальна процедура, яка друкує наказ у Word

Public Sub DocWrite(sPovod As String, sFio As String, bFlagPremia As Boolean, bFlagGramota As Boolean, nSummaPremii As Long, sOtvIsp As

String)

Dim oWord As Word.Application

38

Dim oDoc As Word.Document

Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents.Add() oWord.Visible = True

oDoc.Activate

With oWord.Selection

.TypeText "Наказ"

.Style = "Заголовок 1"

.ParagraphFormat.Alignment = wdAlignParagraphCenter

.TypeText vbCrLf

.Style = "Звичайний"

.TypeText vbCrLf

.TypeText "грама.Санкт-Петербург" & Space(90)& Date

.TypeText vbCrLf

.TypeText vbCrLf

.TypeText "За проявлені успіхи в " & sPovod & _ " нагородити " & sFio & ":"

.TypeText vbCrLf If bFlagPremia Then

.TypeText vbTab & "- грошовою премією в сумі " & nSummaPremii & " рублів"

End If

If bFlagGramota Then

.TypeText vbCrLf

.TypeText vbTab & "- почесною грамотою." Else

.TypeText "." End If

.TypeText vbCrLf .TypeText vbCrLf .TypeText vbCrLf .TypeText vbCrLf .TypeText "Генеральний директор" & vbTab & vbTab & _ vbTab & "Іванов І. І." .ParagraphFormat.Alignment = wdAlignParagraphCenter .TypeParagraph .TypeText vbCrLf .TypeText vbCrLf

.ParagraphFormat.Alignment = wdAlignParagraphLeft .TypeText

Text:=("Отв. виконавець " & sOtvIsp).TypeParagraph

End With End Sub

У вікні Project Explorer клацніть правою кнопкою миші за проектом Prikaz.xls і в контекстному меню виберіть Insert | UserForm. Виділіть створений вами об'єкт форми і натисніть клавішу <F4>. У

39

вікні Properties введіть для властивості Name цієї форми значення

UF1.

Помістіть на форму з Toolbox єдину кнопку — елемент управління CommandButton1. Встановіть для цієї кнопки значення властивості Caption як "Надрукувати наказ" (без лапок) і змініть розміри і місцезнаходження цієї кнопки.

Заготівка для форми з єдиною кнопкою

5.Клацніть правою кнопкою миші по кнопці CommandButton1 на вашій формі, в контекстному меню виберіть View Code і додайте в код процедури для події Click цієї кнопки наступний код:

Private Sub CommandButton1_Click() Dim sPovod As String

Dim sFio As String

Dim bFlagPremia As Boolean Dim bFlagGramota As Boolean Dim nSummaPremii As Long Dim sOtvIsp As String

'Підставити дані з форми

sPovod = "освоєння нових інформаційних технологій" sFio = "Іванова Івана Івановича"

bFlagPremia = True bFlagGramota = True nSummaPremii = 100000 sOtvIsp = "Петрова П. П." 'Кінець підстановки даних

Call Етакніга.DocWrite(sPovod, sFio, bFlagPremia, bFlagGramota _ nSummaPremii, sOtvIsp) End Sub

6.Запустіть вашу форму на виконання і переконайтесь, що вона працює: виводить у створюваний документ Word наказ з фіксованими значеннями.

ЗАВДАННЯ:

Змініть форму так, щоб замість присвоєння змінним у виділеному коментарями блоці заздалегідь визначених значень користувач міг вибирати дані за допомогою форми. При цьому: 1. Значення змінної sPovod

повинно вибиратися з трьох можливих значень: "освоєння нових

40