Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Візуал Бейсік 2010 Глінський.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.12 Mб
Скачать

§ 34. Vba у програмі ms excell

У цьому параграфі розглянемо об’єктну модель програми MS Ехcell і застосування VBA з метою створення процедур для виконан­ня дій з об’єктами електронної таблиці (ЕТ). За допомогою VBA електронну таблицю можна створити, відкрити, виконати зміни в ній, переслати дані в базу даних MS Access і навпаки. Розгля­немо задачу, яка моделює автоматичне заповнення ЕТ даними.

1. Об’єктна модель програми MS Excell. Об’єктом найвищого рів­ня ієрархії є Application. Він позначає власне програму MS Excell, за­безпечуючи доступ до її ресурсів засобами своїх властивостей і методів. Об’єктами нижчого рівня є відкриті робочі книги, що нале­жать колекції WorkBooks. Об’єктами робочої книги є аркуші Work­sheets. Головними об’єктами аркуша є діапазони (Range), вибрана об­ласть (Selection), стовпці (Columns), рядки (Rows), клітинки (Cells), ко­ментарі (Comments).

Назви колекцій закінчуються літерою «s». Назва без цієї літери позначає об’єкт з цієї колекції.

Об’єкт WorkBook є об’єктом, що належить колекції WorkBooks. Ну­мерація об’єктів у колекціях MS Excell починається з одиниці. За допомогою методів Open та Close нові робочі книги можна створюва­ти, відкривати чи закривати. Активна книжка є об’єктом ActiveWorkBook. Властивість Author визначає автора книги. Книги складають з аркушів Worksheets або Sheets.

Кожний об’єкт у колекції Worksheets є аркушем робочої книги. За допомогою методів цієї колекції Add, Delete, Activate можна створювати, вилучати чи активізувати аркуші. ActiveSheet є посиланням на активний аркуш.

Об’єкт Range задає діапазон клітинок на аркуші. Це може бути окрема клітинка, рядок, стовпець, прямокутна зв’язана або незв’язана область, області на декількох аркушах.

Об’єкт Range("A1:B2") задає діапазон А1:В2.

Об’єкт Range("A1") задає одну клітинку електронної таблиці.

Range("3:3") — це третій рядок таблиці.

Range(“A”:”D”) — стовпці від А до D;

Range("A":"A") — стовпець А;

Range(',A1":"C5'', "D8":"F10")— незв’язані діапазони.

Range(“l :4”) — перші чотири рядки аркуша;

Range("1:1", "3:3", "5:5") — рядки 1, 3, 5 аркуша.

Виокремити діапазон можна методом Select:

Range(<діапазон>).Select

Наступна команда вилучає вміст діапазону:

Range(<діапазон>).ClearContents

Об’єкт Range володіє методами, які дають змогу розв’язувати ти­пові для електронних таблиць задачі опрацювання даних, як ось: Sort (упорядкувати), DataSeries (створити прогресію), AutoFill (автозаповнити), AutoFilter (застосувати фільтр), Find (знайти), Consolidate (консолідувати) та ін. Ці методи описані у довідниках.

Клітинки Cells (<рядок>,<стовпець>) можуть бути властивостями об’єктів Application, Worksheets(), ActiveSheet, Range, Selection та ін.

Cells(1,2) позначає елемент першого рядка і другого стовпця таб­лиці, тобто клітинку В1 активного аркуша. Властивість Value міс­тить значення клітинки, a Formula — формулу у клітинці. Метод Activate робить клітинку активною (створює об’єкт ActiveCell). Метод Font дає змогу форматувати текст у клітинці та діапазоні, а метод Borders — форматувати межі. Властивість NumberFormat забезпечує форматування чисел (ось приклад її значення: "##,##грн").

Доступ до деякої клітинки діапазону Range дає об’єкт

Range(<діапазон>).Cells(<номер рядка>, <номер стовпця>)

Нумерація тут відносно діапазону, а не всієї таблиці.

Для створення кодів корисним є спосіб задания діапазонів із за­стосуванням додаткових змінних. Наприклад, діапазон A1:D3 у дея­кому об’єкті можна задати так:

n = 1 : <o6’єкт>.Range(Cells(n, 1), Cells(3, 4)).

Вираз Cells(3,4) означає адресу клітинки D3.

Доступ до окремого символу чи декількох символів тексту в клі­тинці можна отримати за допомогою властивості Characters(<початок>, <кінець>) клітинки.

2. Команди для дій з об’єктами. Розглянемо VBA-команди для дій з об’єктами ЕТ. Ці команди можна використати в процедурах модулів або у вікні Immediate.

Створити нову порожню книгу можна командою

Workbooks.Add.

Відкрити книгу можна так:

Workbooks.Open FileName := "myBook.xls".

Активізувати другий аркуш можна так:

Workbooks("my Book.xls").Worksheets("Аркуш2"). Activate.

Щоб у клітинку С1 ввести число 12.3, треба виконати таку команду:

ActiveSheet.Cells(1, 3).Value = 12.3

Команда задання у діапазоні А1 :С5 шрифту Arial має вигляд

Range(Cells(1, 1), Cells(5, 3)).Font.Name = "Arial".

У клітинку С5 формулу =if(a1 = 1; а2; а3) вводять командою

Worksheets("Sheet1).Cells(5, 3). Formula = "=if(a1 = 1; а2; а3)".

Якщо клітинка С5 є першою у діапазоні C5:D8, то попередню ко­манду можна записати так:

Worksheets(1).Range(C5:D8).Cell(1,1).Formula = "=if(a1 = 1; а2; а3)".

Заховати перший аркуш можна так:

Worksheets(1).Visible = False

Заховаємо стовпець В:

Worksheets(1).Columns("B").Hidden = True

Задати шрифт-курсив для тексту клітинки А1 можна так:

Worksheets(1).Range("A1").Font.Italic = True.

Зробимо шрифт жирним у другому слові, що є в клітинці А1:

Range("A1"). Value = "Заголовок таблиці"

Range("A1 ").Characters(11,17).Font.Bold = True.

Клітинка може містити коментар. Щоб створити коментар чи змі­нити його, застосовують метод Text об’єкта Comment. Наступна ко­манда-метод створить коментар у клітинці А1:

Worksheets(1 ).Range(“A1”).Comment.Text "Студент Квакін"

Наступний код зробить всі коментарі невидимими:

For Each myCom In Worksheets(1).Comments

myCom.Visible = False

Next

Наступна команда у клітинку В1 поміщає гіперпосилання:

Activesheet.Hyperlinks.Add Range("B1"), "http://hlynsky.lviv.ua"

А ця команда вибирає наступну клітинку після активної:

ActiveCell.Next.Select

Наступна команда визначає кількість (п) значень, більших від 100, у деякому числовому діапазоні:

For myCell In Range(<діапазон>).Cells

If myCell.Value >100 Then n = n +1

Next myCell

Розглянемо код, який дає змогу в діапазоні А1:С5 змінити колір всіх від’ємних чисел на червоний:

For r = 1 То 5

For s = 1 То 3

With Worksheets(1).Cells(r, s)

If .Value < 0 Then .Font.Color = vbRed

End With

Next s

Next r

Вставити на аркуш кнопку можна одною командою

Activesheet.OLEObjects.Add "Forms.CommandButton.1", _

Left := 100, Top := 20, Height := 20, Width := 100

Наступна команда змінює підпис на кнопці:

ActiveSheet.Commandbuttonl. Caption = "Обчислити"

Зауважимо, що такі команди зручно виконувати у вікні Immedi­ate. Це дає змогу керувати ЕТ в консольному режимі (вручну).

3. Події робочої книги. Розглянемо події робочої книги Workbook: BeforeClose (перед закриттям), BeforePrint (перед друком), Open (під час відкривання), а також приклади кодів — можливих реакцій на них.

Нехай реакція на першу подію така: якщо книга не збережена, то її треба зберегти. Відповідна процедура має такий вигляд:

Sub Workbook_BeforeClose()

If Me.Saved = False Then Me.Save

End Sub

Реакція на другу подію: перед друком переобчислити всі форму­ли в таблиці.

Sub Workbook_BeforePrint(Cancel As Boolean)

For Each mySheet In Worksheets

mySheet. Calculate

Next

End Sub

Реакція на третю подію: під час відкривання книги вікно максимізувати.

Sub Workbook_Open()

Application.WindowState = xlMaximized

End Sub

4. Створення електронної таблиці засобами VBA з вікна Imme­diate. Розглянемо створення ЕТ командним способом.

Об’єкт WorksheetFunction дає доступ до функцій робочого аркуша MS Excel. Наступний код демонструє застосування функції max.

myMax = Application.WorksheetFunction.Max(Range(<діапазон>))

MsgBox myMax

Задача 1. Змоделювати діяльність підприємства, що має філіали в п’ятьох містах, протягом перших шести місяців року. Створити таблицю з доходами підприємства, заповнивши її випадковими ці­лими числами з діапазону від -50 до 50 (млн грн). Обчислити суму всіх доходів.

Розв’язування. Відкриємо MS Excel і перейдемо у режим VBA. Розглянемо код, який у перший стовпець, починаючи з клітинки А2, виводить назви міст, взяті з деякого масиву towns(5), а в пер-ший рядок, починаючи з клітинки В1, — назви місяців, взяті з масиву months(12). Далі заповнимо діапазон B2:G6 випадковими числами від -50 до 50 і обчислимо суму всіх чисел.

For t = 1 То 5 : Cells (t + 1, 1).Value = towns(t): Next t

For m = 1 To 6 : Cells(1, m + 1) = months(m): Next m

Application. Range("B2:G6").Formula =_

"=Round(RAND() * 100 - 50,0)"

Application.Range("b2:h6").Value =_

Application.Range("B2:G6").Value

suma = Application.WorksheetFunction.Sum(Range("B2:G6"))

MsgBox suma

Спростимо задачу. Замінимо назви міст і місяців їхніми номера­ми і введемо всі команди у вікні Immediate. Нагадаємо, що у цьому випадку команду циклу вводять в одному рядку так:

For t = 1 То 5 : Cells (t + 1, 1).Value = t: Next t

Друга команда Application у цьому коді потрібна лише, якщо еле­ктронна таблиця перебуває в режимі «формули».

Команду MsgBox suma можна замінити командою ?suma.

Розглянемо ще один спосіб спрощення і автоматизації робіт, що реалізується за допомогою властивості Value об’єкта Range. Наступні дві команди заповнюють стовпець назвами міст, а рядок — назвами шести місяців:

Range("A2:A6") = Array(“'Київ”, "Львів", "Харків", "Одеса", "Рівне")

Range("B1 :G6") = Array("Січень", "Лютий", "Березень", "Квітень", 'Травень", "Червень")

Завдання 1. Визначіть максимальний прибуток підприємства і найбільший збиток.

Завдання 2. Створіть процедуру з наведеним кодом і модифі­куйте код, щоб визначити кількість місяців, коли філія з першого міста мала прибутки.

Завдання 3*. Розв’яжіть задачу № 12 свого варіанта з розділу «Задачі» засобами VBA та електронних таблиць.

5. Створення макросу. Розглянемо задачу про створення макросу і призначення його кнопці.

Рис. 4.4 Рис. 4.5

Задача 2. Створити макрос мовою VBA для виведення кодової таблиці символів ASCII (рис. 4.5) у діапазон клітинок електронної таблиці MS Excel. Призначити макрос кнопці, розташованій на ар­куші електронної таблиці.

Розв’язування. Виконайте команди Сервіс => Макрос => Макроси (Excell 2003) чи Вигляд => Макроси (Excell 2007) з головного меню MS Excel. У вікні, що з’явиться, у рядку «Ім’я макросу» введіть назву макросу (наприклад, Ascii) і натисніть кнопку «Створити». Відкри­ється вікно «Microsoft Visual Basic» із заготовкою процедури Ascii. Введіть такий код:

Sub Ascii()

Dim і, j As Integer

For і = 0 To 25 'у рядках - одна чи дві цифри коду символу

For j = 0 То 9 'у стовпцях - остання цифра коду символу

If і * 10 + j < 256 Then 'кодів є до 255

Cells(i + 2, j + 2) = Chr(i * 10 + j) 'розміщуємо символ

End If

Next j

Next і

End Sub

Нагадаємо, що функція Chr(<код символу>) повертає відповідний символ таблиці кодів ASCII — односимвольне дане.

Тепер розграфимо діапазон клітинок А1:К27, як показано на рис. 4.4. Заповнимо вручну стовпець А і рядок 1. Задамо необхідні формати клітинок та ширину стовпців. Під таблицею розташуємо кнопку «Заповнити таблицю». Для вставляння кнопки треба увімк­нути панель інструментів «Форми» (Forms) і вибрати в ній елемент «Кнопка». Обведемо контур для кнопки у потрібному місці робочої сторінки ЕТ. З’явиться вікно «Призначити макрос об’єкту». Вибе­ремо макрос Ascii => Ok. Змінимо напис на кнопці, скориставшись її контекстним меню.

Клацнемо на кнопці «Заповнити таблицю» й отримаємо таблицю кодів ASCII (рис. 4.5).

Переконайтеся, що латинській літері «А» відповідає код 65, а малій літері «а» — 117. Літері «Б» відповідає код 214, а «б» — 246.

Вправи

1. Запишіть макрос форматування вмісту клітинки так: розмір шриф­ту — 18 пунктів, колір — синій, написання — жирний курсив. При­значте макрос комбінації клавіш Ctrl + Shift + М.

2. Змініть код макросу Ascii так, щоб після натискання кнопки в табли­цю виводилися лише малі (або великі) латинські символи.

Ключ. Знайдіть перше входження, наприклад, латинського символу «а» в таблицю ASCII і виведіть лише наступні 26 символів. Для цьо­го в подвійному циклі For макросу Ascii використайте команду

If Chr(i * 10 + j) = ”a” Then ...

3. Змініть код макросу Ascii так, щоб у таблицю виводилися лише малі (або великі) символи кирилиці.

4. Розв’яжіть задачу № 7 з розділу «Задачі» з виведенням результатів в електронну таблицю.

5. Розв’яжіть задачу № 9 з розділу «Задачі» з виведенням результатів в електронну таблицю.

6. Розв’яжіть задачу № 14 (про вибори) з розділу «Задачі» з виведен­ням результатів в електронну таблицю.