Introduction
This is a tutorial about writing code in Excel spreadsheets using Visual Basic for Applications (VBA).
Excel is one of Microsoft’s most popular products. In 2016, the CEO of Microsoft said «Think about a world without Excel. That’s just impossible for me.” Well, maybe the world can’t think without Excel.
- In 1996, there were over 30 million users of Microsoft Excel (source).
- Today, there are an estimated 750 million users of Microsoft Excel. That’s a little more than the population of Europe and 25x more users than there were in 1996.
We’re one big happy family!
In this tutorial, you’ll learn about VBA and how to write code in an Excel spreadsheet using Visual Basic.
Prerequisites
You don’t need any prior programming experience to understand this tutorial. However, you will need:
- Basic to intermediate familiarity with Microsoft Excel
- If you want to follow along with the VBA examples in this article, you will need access to Microsoft Excel, preferably the latest version (2019) but Excel 2016 and Excel 2013 will work just fine.
- A willingness to try new things
Learning Objectives
Over the course of this article, you will learn:
- What VBA is
- Why you would use VBA
- How to get set up in Excel to write VBA
- How to solve some real-world problems with VBA
Important Concepts
Here are some important concepts that you should be familiar with to fully understand this tutorial.
Objects: Excel is object-oriented, which means everything is an object — the Excel window, the workbook, a sheet, a chart, a cell. VBA allows users to manipulate and perform actions with objects in Excel.
If you don’t have any experience with object-oriented programming and this is a brand new concept, take a second to let that sink in!
Procedures: a procedure is a chunk of VBA code, written in the Visual Basic Editor, that accomplishes a task. Sometimes, this is also referred to as a macro (more on macros below). There are two types of procedures:
- Subroutines: a group of VBA statements that performs one or more actions
- Functions: a group of VBA statements that performs one or more actions and returns one or more values
Note: you can have functions operating inside of subroutines. You’ll see later.
Macros: If you’ve spent any time learning more advanced Excel functionality, you’ve probably encountered the concept of a “macro.” Excel users can record macros, consisting of user commands/keystrokes/clicks, and play them back at lightning speed to accomplish repetitive tasks. Recorded macros generate VBA code, which you can then examine. It’s actually quite fun to record a simple macro and then look at the VBA code.
Please keep in mind that sometimes it may be easier and faster to record a macro rather than hand-code a VBA procedure.
For example, maybe you work in project management. Once a week, you have to turn a raw exported report from your project management system into a beautifully formatted, clean report for leadership. You need to format the names of the over-budget projects in bold red text. You could record the formatting changes as a macro and run that whenever you need to make the change.
What is VBA?
Visual Basic for Applications is a programming language developed by Microsoft. Each software program in the Microsoft Office suite is bundled with the VBA language at no extra cost. VBA allows Microsoft Office users to create small programs that operate within Microsoft Office software programs.
Think of VBA like a pizza oven within a restaurant. Excel is the restaurant. The kitchen comes with standard commercial appliances, like large refrigerators, stoves, and regular ole’ ovens — those are all of Excel’s standard features.
But what if you want to make wood-fired pizza? Can’t do that in a standard commercial baking oven. VBA is the pizza oven.
Yum.
Why use VBA in Excel?
Because wood-fired pizza is the best!
But seriously.
A lot of people spend a lot of time in Excel as a part of their jobs. Time in Excel moves differently, too. Depending on the circumstances, 10 minutes in Excel can feel like eternity if you’re not able to do what you need, or 10 hours can go by very quickly if everything is going great. Which is when you should ask yourself, why on earth am I spending 10 hours in Excel?
Sometimes, those days are inevitable. But if you’re spending 8-10 hours everyday in Excel doing repetitive tasks, repeating a lot of the same processes, trying to clean up after other users of the file, or even updating other files after changes are made to the Excel file, a VBA procedure just might be the solution for you.
You should consider using VBA if you need to:
- Automate repetitive tasks
- Create easy ways for users to interact with your spreadsheets
- Manipulate large amounts of data
Getting Set Up to Write VBA in Excel
Developer Tab
To write VBA, you’ll need to add the Developer tab to the ribbon, so you’ll see the ribbon like this.
To add the Developer tab to the ribbon:
- On the File tab, go to Options > Customize Ribbon.
- Under Customize the Ribbon and under Main Tabs, select the Developer check box.
After you show the tab, the Developer tab stays visible, unless you clear the check box or have to reinstall Excel. For more information, see Microsoft help documentation.
VBA Editor
Navigate to the Developer Tab, and click the Visual Basic button. A new window will pop up — this is the Visual Basic Editor. For the purposes of this tutorial, you just need to be familiar with the Project Explorer pane and the Property Properties pane.
Excel VBA Examples
First, let’s create a file for us to play around in.
- Open a new Excel file
- Save it as a macro-enabled workbook (. xlsm)
- Select the Developer tab
- Open the VBA Editor
Let’s rock and roll with some easy examples to get you writing code in a spreadsheet using Visual Basic.
Example #1: Display a Message when Users Open the Excel Workbook
In the VBA Editor, select Insert -> New Module
Write this code in the Module window (don’t paste!):
Sub Auto_Open()
MsgBox («Welcome to the XYZ Workbook.»)
End Sub
Save, close the workbook, and reopen the workbook. This dialog should display.
Ta da!
How is it doing that?
Depending on your familiarity with programming, you may have some guesses. It’s not particularly complex, but there’s quite a lot going on:
- Sub (short for “Subroutine): remember from the beginning, “a group of VBA statements that performs one or more actions.”
- Auto_Open: this is the specific subroutine. It automatically runs your code when the Excel file opens — this is the event that triggers the procedure. Auto_Open will only run when the workbook is opened manually; it will not run if the workbook is opened via code from another workbook (Workbook_Open will do that, learn more about the difference between the two).
- By default, a subroutine’s access is public. This means any other module can use this subroutine. All examples in this tutorial will be public subroutines. If needed, you can declare subroutines as private. This may be needed in some situations. Learn more about subroutine access modifiers.
- msgBox: this is a function — a group of VBA statements that performs one or more actions and returns a value. The returned value is the message “Welcome to the XYZ Workbook.”
In short, this is a simple subroutine that contains a function.
When could I use this?
Maybe you have a very important file that is accessed infrequently (say, once a quarter), but automatically updated daily by another VBA procedure. When it is accessed, it’s by many people in multiple departments, all across the company.
- Problem: Most of the time when users access the file, they are confused about the purpose of this file (why it exists), how it is updated so often, who maintains it, and how they should interact with it. New hires always have tons of questions, and you have to field these questions over and over and over again.
- Solution: create a user message that contains a concise answer to each of these frequently answered questions.
Real World Examples
- Use the MsgBox function to display a message when there is any event: user closes an Excel workbook, user prints, a new sheet is added to the workbook, etc.
- Use the MsgBox function to display a message when a user needs to fulfill a condition before closing an Excel workbook
- Use the InputBox function to get information from the user
Example #2: Allow User to Execute another Procedure
In the VBA Editor, select Insert -> New Module
Write this code in the Module window (don’t paste!):
Sub UserReportQuery()
Dim UserInput As Long
Dim Answer As Integer
UserInput = vbYesNo
Answer = MsgBox(«Process the XYZ Report?», UserInput)
If Answer = vbYes Then ProcessReport
End Sub
Sub ProcessReport()
MsgBox («Thanks for processing the XYZ Report.»)
End Sub
Save and navigate back to the Developer tab of Excel and select the “Button” option. Click on a cell and assign the UserReportQuery macro to the button.
Now click the button. This message should display:
Click “yes” or hit Enter.
Once again, tada!
Please note that the secondary subroutine, ProcessReport, could be anything. I’ll demonstrate more possibilities in example #3. But first…
How is it doing that?
This example builds on the previous example and has quite a few new elements. Let’s go over the new stuff:
- Dim UserInput As Long: Dim is short for “dimension” and allows you to declare variable names. In this case, UserInput is the variable name and Long is the data type. In plain English, this line means “Here’s a variable called “UserInput”, and it’s a Long variable type.”
- Dim Answer As Integer: declares another variable called “Answer,” with a data type of Integer. Learn more about data types here.
- UserInput = vbYesNo: assigns a value to the variable. In this case, vbYesNo, which displays Yes and No buttons. There are many button types, learn more here.
- Answer = MsgBox(“Process the XYZ Report?”, UserInput): assigns the value of the variable Answer to be a MsgBox function and the UserInput variable. Yes, a variable within a variable.
- If Answer = vbYes Then ProcessReport: this is an “If statement,” a conditional statement, which allows us to say if x is true, then do y. In this case, if the user has selected “Yes,” then execute the ProcessReport subroutine.
When could I use this?
This could be used in many, many ways. The value and versatility of this functionality is more so defined by what the secondary subroutine does.
For example, maybe you have a file that is used to generate 3 different weekly reports. These reports are formatted in dramatically different ways.
- Problem: Each time one of these reports needs to be generated, a user opens the file and changes formatting and charts; so on and so forth. This file is being edited extensively at least 3 times per week, and it takes at least 30 minutes each time it’s edited.
- Solution: create 1 button per report type, which automatically reformats the necessary components of the reports and generates the necessary charts.
Real World Examples
- Create a dialog box for user to automatically populate certain information across multiple sheets
- Use the InputBox function to get information from the user, which is then populated across multiple sheets
Example #3: Add Numbers to a Range with a For-Next Loop
For loops are very useful if you need to perform repetitive tasks on a specific range of values — arrays or cell ranges. In plain English, a loop says “for each x, do y.”
In the VBA Editor, select Insert -> New Module
Write this code in the Module window (don’t paste!):
Sub LoopExample()
Dim X As Integer
For X = 1 To 100
Range(«A» & X).Value = X
Next X
End Sub
Save and navigate back to the Developer tab of Excel and select the Macros button. Run the LoopExample macro.
This should happen:
Etc, until the 100th row.
How is it doing that?
- Dim X As Integer: declares the variable X as a data type of Integer.
- For X = 1 To 100: this is the start of the For loop. Simply put, it tells the loop to keep repeating until X = 100. X is the counter. The loop will keep executing until X = 100, execute one last time, and then stop.
- Range(«A» & X).Value = X: this declares the range of the loop and what to put in that range. Since X = 1 initially, the first cell will be A1, at which point the loop will put X into that cell.
- Next X: this tells the loop to run again
When could I use this?
The For-Next loop is one of the most powerful functionalities of VBA; there are numerous potential use cases. This is a more complex example that would require multiple layers of logic, but it communicates the world of possibilities in For-Next loops.
Maybe you have a list of all products sold at your bakery in Column A, the type of product in Column B (cakes, donuts, or muffins), the cost of ingredients in Column C, and the market average cost of each product type in another sheet.
You need to figure out what should be the retail price of each product. You’re thinking it should be the cost of ingredients plus 20%, but also 1.2% under market average if possible. A For-Next loop would allow you to do this type of calculation.
Real World Examples
- Use a loop with a nested if statement to add specific values to a separate array only if they meet certain conditions
- Perform mathematical calculations on each value in a range, e.g. calculate additional charges and add them to the value
- Loop through each character in a string and extract all numbers
- Randomly select a number of values from an array
Conclusion
Now that we’ve talked about pizza and muffins and oh-yeah, how to write VBA code in Excel spreadsheets, let’s do a learning check. See if you can answer these questions.
- What is VBA?
- How do I get set up to start using VBA in Excel?
- Why and when would you use VBA?
- What are some problems I could solve with VBA?
If you have a fair idea of how to you could answer these questions, then this was successful.
Whether you’re an occasional user or a power user, I hope this tutorial provided useful information about what can be accomplished with just a bit of code in your Excel spreadsheets.
Happy coding!
Learning Resources
- Excel VBA Programming for Dummies, John Walkenbach
- Get Started with VBA, Microsoft Documentation
- Learning VBA in Excel, Lynda
A bit about me
I’m Chloe Tucker, an artist and developer in Portland, Oregon. As a former educator, I’m continuously searching for the intersection of learning and teaching, or technology and art. Reach out to me on Twitter @_chloetucker and check out my website at chloe.dev.
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started
Время на прочтение
7 мин
Количество просмотров 312K
Приветствую всех.
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Появилась вкладка.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Sub FormatPrice()End Sub
Напишем Hello World:
Sub FormatPrice()
MsgBox "Hello World!"
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
' Exit Sub ' Это значит "выйти из процедуры"
MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As Integer) As Integer
' Exit Function
LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
Dim s1 As String, s2 As String
s1 = "str1"
s2 = "str2"
If s1 <> s2 Then
foo "123", "456" ' Скобки при вызове процедур запрещены
End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
' Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ' Конвертация чего угодно в String
If i = 5 Then Exit For
Next iDim x As Double
x = Val("1.234") ' Парсинг чисел
x = x + 10
MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
x = 5 / 0
MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
x = 5 / 0
MsgBox "OK!"
GoTo ne
Err:
MsgBox
"Err!"
ne:
On Error GoTo 0 ' Отключаем обработку ошибок
' Циклы бывает, какие захотите
Do While True
Exit DoLoop 'While True
Do 'Until False
Exit Do
Loop Until False
' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
' Val также умеет возвращать Integer
Select Case LengthSqr(Len("abc"), Val("4"))
Case 24
MsgBox "0"
Case 25
MsgBox "1"
Case 26
MsgBox "2"
End Select' Двухмерный массив.
' Можно также менять размеры командой ReDim (Preserve) - см. google
Dim arr(1 to 10, 5 to 6) As Integer
arr(1, 6) = 8Dim coll As New Collection
Dim coll2 As Collection
coll.Add "item", "key"
Set coll2 = coll ' Все присваивания объектов должны производится командой Set
MsgBox coll2("key")
Set coll2 = New Collection
MsgBox coll2.Count
End Sub
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets("result").Cells.Clear
Sheets("data").Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets("result").Activate
Dim r As Range
Set r = Range("A1")
r.Value = "123"
Set r = Range("A3,A5")
r.Font.Color = vbRed
r.Value = "456"
Set r = Range("A6:A7")
r.Value = "=A1+A3"
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
- Считали группы из очередной строки.
- Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
- Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
- После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer) As String
GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As Integer) As Range
Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As Integer) As Range
Set GetCell = Range(GetCol(Col) + CStr(Row))
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ' про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ' строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Sheets(
"data").Activate
I = 2
Do While True
If GetCell(0, I).Value = "" Then Exit Do
' ...
I = I + 1
Loop
End Sub
Теперь надо заполнить массив Groups:
На месте многоточия
Dim I2 As Integer
For I2 = 1 To GroupsCount
Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
PrGroups(I2) = Groups(I2)
Next I2
I = I + 1
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Sub AddHeader(Ty As Integer, Name As String)
GetCellS("result", 1, CurRow).Value = Name
CurRow = CurRow + 1
End Sub
Теперь надо перенести всякую информацию в result
For I2 = 0 To DataCount - 1
GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets("Result").Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Sub AddHeader(Ty As Integer, Name As String)
Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
' Чтобы не заводить переменную и не писать каждый раз длинный вызов
' можно воспользоваться блоком With
With GetCellS("result", 0, CurRow)
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
Select Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
Case 2 ' Производитель
.Font.Size = 12
End Select
.HorizontalAlignment = xlCenter
End With
CurRow = CurRow + 1
End Sub
Уже лучше:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Sub AddHeader(Ty As Integer, Name As String)
With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
.Merge
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
.HorizontalAlignment = xlCenterSelect Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ' Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ' строка в data
CurRow = 0 ' чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.
ПРЕДЛАГАЮ КОЛЛЕГАМ
О.А. Житкова, Т.И. Панфилова
Москва
VBA в приложении к Excel, Word и Power Point
В № 1-10/2006 вниманию читателей будет
предложен цикл статей (разработок занятий),
посвященных использованию VBA (Visual Basic for Application)
пакета Microsoft Office. Все материалы прошли
многолетнюю апробацию в НОУ “Ломоносовская
школа” и могут быть использованы как на уроках,
так и во внеурочной деятельности — на
факультативах, кружках, при реализации учебных
проектов.
Занятие № 1. Основные понятия языка VBA Excel
На занятии рассматриваются следующие
вопросы:
- общее понятие о языке VBA;
- объекты VBA;
- свойства, методы и события;
- элементы языка VBA;
- структура редактора VBA.
VBA относится к языкам
объектно-ориентированного программирования,
поэтому знакомство с ним естественно начать с
понятия объекта.
Объекты
Объект — основной элемент VBA Excel. В VBA объектами
являются рабочая книга, рабочий лист и его
составляющие.
Примеры объектов:
- Sheet — лист Excel;
- Cell — ячейка;
- Range — диапазон ячеек;
- Application — приложение;
- UserForm — пользовательская форма.
Доступ к объекту возможен через его
методы и свойства.
Методы
Над объектами можно совершать
различные действия. Действия, совершаемые над
объектами, называются методами. Например, ячейку
можно очистить (Clear), приложение закрыть (Quit),
пользовательскую форму показать (Show) или скрыть
(Hide).
Название метода отделяется от
названия объекта точкой: объект.метод.
Примеры использования методов:
Range(«B2:E2»).Select — выбрать диапазон
ячеек B2:E2;
Range(«C1:C5»).Clear — очистить диапазон
ячеек C1:C5;
UserForm2.Hide — скрыть форму № 2;
UserForm5.Show — показать форму № 5;
Application.Quit — выйти из приложения.
Свойства
Свойствами описываются
характеристики объектов. Например, размер и цвет
шрифта, положение формы на экране или состояние
объекта (доступность, видимость). Чтобы изменить
характеристику объекта, надо просто изменить
значение свойства, т.е. присвоить ему
определенные значения.
Синтаксис установки значения
свойства:
Объект.Свойство = ЗначениеСвойства,
— где Объект обозначает имя
объекта, Свойство — имя свойства, которому
присваивается значение.
Имя объекта отделяется от имени
свойства точкой.
Примеры свойств:
Range(«D1»).Value = 2005 — поместить в ячейку
D1 значение 2005.
Range(«C1:C10»).Text = «Информатика» —
поместить в диапазон ячеек C1:C10 текст
Информатика.
Range(«B2»).Font.Size = 14 — в ячейке B2
установить размер шрифта 14.
Методы и свойства некоторых объектов VBA
Объект: Application (приложение).
Метод: Quit (закрыть).
Свойство: Caption (имя главного окна).
Примеры. Application.Quit — закрыть
приложение; Application.Caption = «Протокол» — установить
в качестве заголовка окна приложения
“Протокол”.
Объект: Sheet (лист), ActiveSheet (активный/выбранный
лист).
Семейство: Sheets (листы).
Методы: Select (выбрать); ShowDataForm (показать
встроенную форму).
Примеры: Sheets(«Меню»).Select —
выбрать лист “Меню”; ActiveSheet.ShowDataForm — на
активном в настоящий момент листе показать
встроенную форму.
Объект: Range (диапазон).
Методы: Select (выделить); Clear (очистить).
Свойство: Name (имя).
Примеры. Sheets(«Протокол»).Range(«В4:В10»).Name
= «Класс» — диапазону В4:В10,
расположенному на листе “Протокол”, присвоить
имя “Класс”;
Sheets(«Протокол»).Range(«В4:В10»).Select — выделить
диапазон В4:В10 на листе “Протокол”.
Объект, Семейство: UserForm (пользовательская
форма).
Методы: Show (показать); Hide (скрыть).
Свойство: Caption (текст,
отображаемый в строке заголовка).
Примеры. UserForm1.Show — показать
пользовательскую форму номер один;
UserForm1.Hide — скрыть пользовательскую
форму номер один;
UserForm1.Caption — «Информатика»-
вывести заданный в кавычках текст в строке
заголовка.
Объект, Семейство: TextBox (Поле
ввода).
Свойство: Text (содержимое).
Примеры. UserForm1.TextBox1.Text = Date — в
поле ввода номер один в пользовательской форме
номер один записать текущую дату; UserForm1.TextBox2.Text =
» « — очистить поле ввода номер два в
пользовательской форме номер один.
Объект, Семейство: ComboBox (поле
со списком).
Метод: AddItem (добавить элемент в
список).
Свойства: Text (содержимое); Rowsource
(источник строк для списка).
Примеры. UserForm1.ComboBox2.Text = » « — очистить
значение поля для поля ввода со списком номер два
в пользовательской форме номер один;
UserForm2.ComboBox1.Rowsource=»В2:В10″ — источником
строк для поля один со списком в
пользовательской форме два установить данные из
диапазона В2:В10;
UserForm1.ComboBox1.AddItem («Факс») — добавить
к списку элемент, заключенный в кавычки.
Объект, Семейство: OptionButton.
Свойства: Value (значение); Сaption
(надпись).
Примеры. UserForm3.OptionButton1.Value = True — выбрать
переключатель номер один в пользовательской
форме номер три; UserForm3.OptionButton1.Capture =
«Успеваемость» — установить надпись
“Успеваемость” рядом с переключателем в
пользовательской форме номер три.
Объект, Семейство: CheckBox.
Свойства: Value (значение);
Сaption (надпись).
Примеры. UserForm2.CheckBox1.Value = True — установить
флажок номер один в пользовательской форме номер
два; UserForm3.CheckBox1.Value = False — сбросить флажок
номер один в пользовательской форме номер три;
UserForm4.CheckBox1.Capture=»Класс» — установить
надпись “Класс” рядом с флажком в
пользовательской форме номер четыре.
События
Событие представляет собой действие,
распознаваемое объектом (например, щелчок мышью
или нажатие клавиши, перемещение мыши или выход
из программы), для которого можно
запрограммировать отклик, т.е. реакцию объекта на
произошедшее событие.
В языке VBA для каждого объекта
определен набор стандартных событий.
Стандартное событие для объекта
“кнопка” (CommandButton) — щелчок мышью (Click).
Если пользователь нажимает на кнопку,
то это событие. На это событие должен быть отклик,
т.е. выполнение какой-либо программы. Такая
программа называется процедурой обработки
событий и имеет стандартное имя. Если такой
отклик не создан (не написана соответствующая
программа), то система никак не будет реагировать
на это событие.
Элементы языка VBA
Объекты — основные элементы языка VBA, но
не единственные. К другим элементам относятся:
константы, переменные, массивы, выражения,
встроенные функции, встроенные диалоговые окна,
операторы.
Константы — данные, не изменяющиеся
в процессе решения задачи. Константы бывают двух
видов: числовые и символьные.
Числовые константы — это целые либо
вещественные числа.
Символьные константы — текст,
заключенный в кавычки. Пример числовой константы
— 5,8 (использование запятой или точки зависит от
настроек операционной системы). Пример
символьной константы — ООО “Темп”.
Переменные — данные, значения
которых меняются в ходе выполнения программы.
Для переменной задается имя и тип.
Имя переменной должно начинаться с
буквы и может содержать любую комбинацию букв,
цифр и символов за исключением точек, пробелов и
следующих символов: “!”, “%”, “&”, “$”, “#”,
“@”. Длина имени не должна превышать 255 символов.
Не следует использовать имена, совпадающие с
ключевыми словами VBA и именами встроенных
функций и процедур.
Основные типы переменных, их размеры и
диапазоны принимаемых значений приведены в табл.
1.
Переменные типа Variant могут хранить все,
что в них поместят. Их тип изменяется в
зависимости от последнего присвоения. В
программах переменные описываются с помощью
специального оператора Dim.
Массив — упорядоченная
совокупность однотипных переменных. Массивы
имеют имя и размерность. Имя массива подбирается
с учетом тех же правил, что и имена переменных. Размерность
— это количество элементов (переменных),
составляющих массив.
Из констант, переменных и встроенных
функций (они рассмотрены далее) с помощью скобок
и знаков арифметических операций (“+”, “-”, “*”,
“/”, “^”) можно составлять выражения.
Частным случаем выражения может быть просто
одиночный элемент, т.е. константа, переменная или
обращение к встроенной функции.
Примеры выражений:
- Z
- (a+b)^2
- 45
- sin(y)
В VBA имеется большой набор встроенных
функций, которые разделяют на категории.
Примеры категорий:
- математические функции;
- функции преобразования форматов;
- логические функции;
- функции времени и даты.
- функции проверки типов;
Некоторые из функций приведены в табл.
2:
Кроме перечисленных функций, объект
Applications позволяет вызвать более 400 встроенных
функций рабочего листа при помощи конструкции
вида:
Application.Функция Рабочего
Листа(Аргументы).
Примеры:
- Application.Sum(Sheets(«Проверка»).Range(«A1:B20»)) —
суммируются значения из ячеек диапазона A1:B20,
расположенного на листе “Проверка”; - Application.CountA(Sheets(«Ученики»).Range(«A:A»)) —
подсчитывается количество непустых ячеек в
столбце А на листе “Ученики”.
Структура редактора VBA
Редактор VBA активизируется командой Сервис
® Макрос ® Редактор Visual Basic. После
выполнения команд мы попадаем в редактор VBA.
Возвратиться из редактора VBA в рабочую книгу
можно нажатием кнопки Вид(View) ® Microsoft Excel . Рассмотрим
основные компоненты окна редактора. Внешний вид
окна редактора представлен на рисунке. Окно
редактора состоит из следующих компонентов:
- панели инструментов;
- окно проекта;
- окно свойств;
- окно редактирования кода;
- меню.
Панели инструментов
Стандартная панель инструментов
редактора Visual Basic содержит кнопки,
предназначенные для выполнения наиболее часто
используемых команд.
Панель разбита на отдельные сегменты
по типу выполняемых команд.
Кнопки первого сегмента:
Кнопки
для возврата в Excel, вставки элементов (модулей,
процедур, экранных форм) в проект и сохранение
рабочей книги.
Кнопки второго сегмента:
Кнопки
для вырезания, копирования, вставки и поиска
фрагментов кода.
Кнопки третьего сегмента:
Кнопки
отмены действий и повторения отмененных
действий.
Кнопки четвертого сегмента:
Кнопки
для выполнения, остановки и прекращения
выполнения процедуры, а также смены режима
отображения экранной формы.
Кнопки пятого сегмента:
Кнопки,
управляющие отображением окон проектов, свойств
и просмотра объектов, а также панели
инструментов.
Последняя кнопка — это обычная
кнопка вызова справочной системы.
Окно проекта
Окно проекта активизируется выбором
команды Вид ® Окно проекта (View, Project window) или
нажатием кнопки Окно проекта . В окне проекта представлена
иерархическая структура файлов, форм и модулей
текущего проекта.
Окно свойств
В окне свойств перечисляются основные
значения свойств выбранного объекта. Используя
это окно, можно просматривать свойства и
изменить их значения. Для просмотра свойств
выбранного объекта надо выполнить команду Вид
® Окно свойств (Properties Windows) или нажатием кнопки .
Окно свойств состоит из двух составных
частей: верхней и рабочей. В верхней части
окна располагается раскрывающийся список, из
которого можно выбрать любой элемент управления
текущей формы или саму форму. Рабочая часть
состоит из двух вкладок, в которых свойства
располагаются По алфавиту (Alphabetic) и По
категориям (Categorized).
Окно для просмотра объектов (Object Browser)
Окно Просмотр объектов (Object Browser)
вызывается командой Вид ® Просмотр объектов
(View, Object Browser) или нажатием кнопки . В этом окне можно
просматривать все объекты проекта. Здесь вы
найдете все свойства, методы и события, связанные
с любым объектом.
Окно Просмотр объектов состоит из
трех основных частей:
1. Раскрывающегося списка Проект/Библиотека
в верхнем левом углу экрана. Например, библиотеки
объектов Excel, VBA, Office и VBAProject (объекты
пользовательского проекта).
2. Списка Классы. Выводятся все
классы выбранной библиотеки.
3. Списка Компоненты (Members).
Выводятся все компоненты выбранного класса.
Это окно предоставляет доступ ко всем
объектам, свойствам, методам и событиям.
Проверочная работа № 1-1
Выберите правильный ответ (возможно
несколько правильных ответов):
1. Объектом VBA являются:
рабочая книга;
рабочий лист;
диапазон ячеек;
массивы.
2. Щелчок мышью или нажатие клавиши,
перемещение мыши или выход из программы, это
действие называется:
откликом;
просмотром;
свойством;
событием.
3. Для того чтобы подсчитать
дискриминант в квадратном уравнении, надо его
записать следующим образом:
d = b2 — 4 ac
d = b^2 — 4ac
d = b^2
— 4*a*c
d = b^2 — 4*ac
4. Продолжите определение:
Метод — это…
основной элемент языка
VBA;
структура редактора VBA;
характеристика объекта;
действия, совершаемые над объектами.
5. Чтобы стандартно изменить
характеристику объекта, надо:
написать новую
программу;
применить другое
свойство;
применить метод;
изменить значение свойства.
6. Запишите конструкции, которые
применяются для установки свойств объектов и
доступа к их методам:
1. Запишите в ячейку В9 дату своего
рождения, в ячейку В10 — свое имя.
2. Установите размер шрифта 16 в ячейках
С4:F4, цвет — красный.
3. Покажите форму № 3.
4. Скройте форму № 2.
5. Выберите диапазон ячеек В2:D7.
Проверочная работа № 1-2
Выберите правильный ответ:
1. Очистить диапазон ячеек от А1 до С10:
Range(«А1;C10»).Clear
Range(«А1:C10»).Clear
Range(«А1-C10»).Clear
Clear. Range(«А1:C10»)
2. Скрыть форму № 6:
UserForm6.Show
UserForm №6.Сlose
UserForm6.Hide
UserForm №6.Show
3. Выйти из приложения:
Application.Hide
Application.Сlose
Application.Select
Application.Quit
4. Выделить диапазон ячеек от D6 до E8 на
листе “География”:
Sheets(«География»).Range(«D6-E8»).Show
Sheets
«География».Range(«D6:E8»).Select
Sheets
«География».Range(«D6-E8»).Select
Sheets(«География»).Range(«D6:E8»).Select
5. Присвоить диапазону ячеек от А4 до А16,
расположенных на листе “11 класс”, имя
“Информатика”:
Sheets(«11класс»).Range(«А4:А16»).Name =
«Информатика»
Sheets(«11класс»).Range(«А4-А16»).Name
= «Информатика»
Sheets(«Информатика»).Range(«А4-А16»).Name
= «11класс»
Sheets(«Информатика»).Range(«А4:А16»).Name
= «11класс»
6. Установить источником строк для поля
со списком два в пользовательской форме три
данные из диапазона от А12 до А15:
UserForm3.ComboBox2.Rowsource =
«А12-А15»
UserForm2.ComboBox3.Rowsource =
«А12:А15»
UserForm3.ComboBox2.Rowsource = «А12:А15»
UserForm2.ComboBox2.Rowsource =
«А12:А15»
7. Очистить значение поля для поля
ввода со списком номер три в пользовательской
форме номер два:
UserForm3.ComboBox2.Text =
«Очистить»
UserForm2.ComboBox3.Text = » «
UserForm3.ComboBox2.Capture = «0 «
UserForm2.ComboBox3.Text = «-«
8. Установить флажок номер пять в
пользовательской форме номер два:
UserForm5.CheckBox2.Value = True
UserForm2.CheckBox2.Text = False
UserForm2.ComboBox5. Capture = » True
«
UserForm2.CheckBox5. Value = True
9. Сбросить флажок номер пять в
пользовательской форме номер два:
UserForm5.CheckBox2. Value = True
UserForm2.
CheckBox5. Value = False
UserForm2.ComboBox5. Capture = » True
«
UserForm2.CheckBox5. Text = False
10. Выбрать переключатель номер два в
пользовательской форме номер три:
UserForm3.OptionButton2.Value = False
UserForm2. CheckBox3. Value = False
UserForm2.ComboBox5. Capture = True
UserForm3.OptionButton2.Value = True
Практическая работа № 1-3
Установите соответствие между
функцией и выражением:
Log(x) Экспонента
Sin(x) х
преобразуется в целое
Sqr(x) Натуральный
логарифм
Abs(х) Модуль
(абсолютная величина числа)
Cos(х) х
преобразуется в число с плавающей точкой обычной
точности
Exp(х) Синус
CInt(x) х преобразуется
в строку
CSng(x) Текущие дата и время
CStr(x) Квадратный
корень
Now Косинус
Практическая работа № 1-4
1. Откройте новый файл.
2. Перейдите в редактор Visual Basic.
3. Нажмите клавишу для открытия окна Object Browser.
4. В списке Classes (Классы) найдите объект
Range и выделите его.
5. Прокрутите соседний список Members of
‘Range’ для просмотра свойств и методов объекта
Range.
6. Выберите метод Activate.
7. Нажмите клавишу . Откроется окно справочной
системы Visual Basic с описанием метода Activate.
8. Откройте пример с применением метода
Activate к объекту Range. Запишите пример.
9. Для объекта Range выберите свойство Cells.
Запишите, для каких объектов, кроме объекта Range,
характерно это свойство.
10. Запишите метод, используемый для
удаления содержимого диапазона ячеек.
11. Запишите метод, используемый для
удаления рабочего листа в книге.
12. В окне проекта выберите Лист1. В окне
свойств измените его имя на имя ПРОБА. Запишите
название свойства.
13. В окне проекта выберите Лист2. В окне
свойств подберите свойство, которое будет делать
этот лист невидимым. Запишите название свойства
и его значение.
14. В окне проекта выберите Лист3. В окне
свойств подберите свойство, которое будет
изменять ширину столбцов. Укажите значение — 15.
Запишите название свойства.
15. Закончите предложение: окно Object Browser
можно использовать для просмотра списков
объектов, событий, свойств и…
Продолжение следует
Первое знакомство с редактором VBA Excel, создание процедур (подпрограмм) и написание простейшего кода, работающего с переменными и ячейками рабочего листа.
Начинаем программировать с нуля
Часть 1. Первая программа
[Часть 1] [Часть 2] [Часть 3] [Часть 4]
Эта статья предназначена для тех, кто желает научиться программировать в VBA Excel с нуля. Вы увидите, как это работает, и убедитесь, что не все так сложно, как кажется с первого взгляда. Свою первую программу вы напишите за 7 простых шагов.
- Создайте новую книгу Excel и сохраните ее как книгу с поддержкой макросов с расширением .xlsm. В старых версиях Excel по 2003 год – как обычную книгу с расширением .xls.
- Нажмите сочетание клавиш «Левая_клавиша_Alt+F11», которое откроет редактор VBA. С правой клавишей Alt такой фокус не пройдет. Также, в редактор VBA можно перейти по ссылке «Visual Basic» из панели инструментов «Разработчик» на ленте быстрого доступа. Если вкладки «Разработчик» на ленте нет, ее следует добавить в настройках параметров Excel.
В левой части редактора VBA расположен проводник проекта, в котором отображены все открытые книги Excel. Верхней строки, как на изображении, у вас скорее всего не будет, так как это – личная книга макросов. Справа расположен модуль, в который записываются процедуры (подпрограммы) с кодом VBA. На изображении открыт модуль листа, мы же далее создадим стандартный программный модуль.
- Нажмите кнопку «Module» во вкладке «Insert» главного меню. То же подменю откроется при нажатии на вторую кнопку после значка Excel на панели инструментов.
После нажатия кнопки «Module» вы увидите ссылку на него, появившуюся в проводнике слева.
Первая программа на VBA Excel
Добавляем на стандартный модуль шаблон процедуры – строки ее начала и завершения, между которыми мы и будем писать свою первую программу (процедуру, подпрограмму).
- Откройте стандартный модуль двойным кликом по его ссылке в проводнике. Поместите в него курсор и нажмите кнопку «Procedure…» во вкладке «Insert» главного меню. Та же ссылка будет доступна при нажатии на вторую кнопку после значка Excel на панели инструментов.
В результате откроется окно добавления шаблона процедуры (Sub).
- Наберите в поле «Name» имя процедуры: «Primer1», или скопируйте его отсюда и вставьте в поле «Name». Нажмите кнопку «OK», чтобы добавить в модуль первую и последнюю строки процедуры.
Имя процедуры может быть написано как на латинице, так и на кириллице, может содержать цифры и знак подчеркивания. Оно обязательно должно начинаться с буквы и не содержать пробелы, вместо которых следует использовать знак подчеркивания.
- Вставьте внутрь шаблона процедуры следующую строку:
MsgBox "Привет"
.
Функция MsgBox выводит информационное сообщение с указанным текстом. В нашем примере – это «Привет».
- Проверьте, что курсор находится внутри процедуры, и запустите ее, нажав клавишу «F5». А также, запустить процедуру на выполнение можно, нажав на треугольник (на изображении под пунктом меню «Debug») или на кнопку «Run Sub/UserForm» во вкладке «Run» главного меню редактора VBA Excel.
Если вы увидели такое сообщение, как на изображении, то, поздравляю – вы написали свою первую программу!
Работа с переменными
Чтобы использовать в процедуре переменные, их необходимо объявить с помощью ключевого слова «Dim». Если при объявлении переменных не указать типы данных, они смогут принимать любые доступные в VBA Excel значения. Комментарии в тексте процедур начинаются со знака «’» (апостроф).
Пример 2
Присвоение переменным числовых значений:
Public Sub Primer2() ‘Объявляем переменные x, y, z Dim x, y, z ‘Присваиваем значение переменной x x = 25 ‘Присваиваем значение переменной y y = 35 ‘Присваиваем переменной z сумму ‘значений переменных x и y z = x + y ‘Выводим информационное сообщение ‘со значением переменной z MsgBox z End Sub |
Пример 3
Присвоение переменным строковых значений:
Public Sub Primer3() ‘Объявляем переменные x, y, z Dim x, y, z ‘Присваиваем строку переменной x x = «Добрый» ‘Присваиваем строку переменной y y = «день!» ‘Присваиваем переменной z строку, ‘состоящую из строк x и y ‘с пробелом между ними z = x & » « & y ‘Выводим информационное сообщение ‘со значением переменной z MsgBox z End Sub |
Скопируйте примеры процедур в стандартный модуль и запустите их на выполнение.
Изменение содержимого ячеек
Для обозначения диапазонов, в том числе и отдельных ячеек, в VBA Excel имеется ключевое слово «Range». Ячейке A1 на рабочем листе будет соответствовать выражение Range("A1")
в коде VBA Excel.
Пример 4
Public Sub Primer4() ‘Объявляем переменную x Dim x ‘Присваиваем значение переменной x x = 125.61 ‘Присваиваем ячейке A1 ‘значение переменной x Range(«A1») = x ‘Присваиваем значение ячейке B1 Range(«B1») = 356.24 ‘Записываем в ячейку C1 ‘сумму ячеек A1 и B1 Range(«C1») = Range(«A1») + Range(«B1») End Sub |
Скопируйте процедуру этого примера в стандартный модуль и запустите на выполнение. Перейдите на активный рабочий лист Excel, чтобы увидеть результат.
Практическая
работа № 1
Разработка
пользовательской таблицы средствами процессора Excel, создание и выполнение
макросов Excel
Цель работы: Научится создавать и выполнять макросы в Excel.
Пояснение к работе:
Термином макрос обычно
называют файл, хранящий последовательность действий, заданных пользователем
системы. Каждый макрос должен иметь собственное имя. С помощью макроса можно
автоматизировать типовые технологические этапы при работе с системой. При
работе с Excel, как, впрочем, и с другими программами пакета Microsoft Office,
для создания макроса легче всего использовать автоматический режим его
создания, вызываемый из главного меню системы командами СЕРВИС, Макрос.
При первоначальном запуске системы макросы отсутствуют, поэтому диалоговое окно
<<Макрос>>, вызываемое пунктом Макросы… показывает
пустой список. Пункт меню Безопасность… открывает дополнительное меню,
позволяющее задавать уровень безопасности при использовании макросов. Известен
ряд компьютерных вирусов, маскирующихся под макросы, в связи с чем
разработчиками Excel предпринят ряд дополнительных мер защиты. Так, например,
может быть задан высокий, средний и низкий уровни безопасности при работе с
макросами (по умолчанию средний и рекомендуемый уровень безопасности). Если он
используется, то при загрузке файла с диска система попросит разрешение на
подключение макросов к программе. Если такое разрешение будет дано, то макрос
будет доступен в загружаемой таблице. Пункты меню Редактор Visual Basic и
Редактор сценариев вызывают соответствующие программы (они должны быть
установлены на компьютер отдельно с инсталляционных дискет и подключены к
операционной системе).
Если в меню СЕРВИС, Макрос выбрать
пункт Начать запись…, то откроется диалоговое окно, позволяющее задать
имя макроса и, при желании, комбинацию клавиш, с помощью которой он также может
вызван в обход пункта меню Макросы…. По умолчанию система предлагает
стандартное имя Макрос#. Во избежание недоразумений старайтесь задавать
собственные имена макросов, отличные от стандартных. Начиная с этого момента
все действия с рабочей книгой дополнительно записываются в файл макроса.
Остановить запись макроса можно кнопкой Остановить запись дополнительно
открывшейся панели инструментов или через аналогичный пункт главное меню СЕРВИС,
Макрос. Записанный макрос может быть сохранен в текущей рабочей книге и
тогда он доступен в ней и других книгах в том случае, когда она открыта или в
личной книге макросов. В последнем случае он может быть доступен в любой
открытой книге.
Удалить макрос, созданный в текущей
рабочей книге, можно кнопкой <Удалить> диалогового окна
<<Макросы>>. Если макрос создан в личной книге макросов, то для его
удаления потребуются более сложные действия, о которых будет рассказано позднее.
Поэтому старайтесь в первое время не пользоваться макросами личной книги.
Необходимо принять во внимание
существование двух возможных типов записи ссылок на ячейки в Excel: A1 и R1C1.
По умолчанию при программировании формул используется стиль A1, для которого
адрес каждой ячейки представляет собой строку символов, содержащую имя столбца
и номер строки. Использование этого стиля позволяют организовать относительную
и абсолютную адресацию к ячейкам таблицы (за счет введения в строку символа $).
Тем не менее, при записи макросов Excel использует тип ссылки R1C1. В
обозначении типа присутствуют первые буквы английских слов Row (строка) и
Column (колонка). В первую очередь обратите внимание на то, что, в отличие от
типа A1, при использовании типа ссылок R1C1 сначала записывается строка, а
потом столбец. При использовании абсолютной адресации после символов R и C
указывается собственно номер строки и столбца. Так, например, ячейка $B$3 имеет
адрес R3C2. При использовании относительной адресации в стиле R1C1 после
обозначения строки или колонки в квадратных скобках указывается смещение по
отношению к текущей ячейке. Так, например, если данные находятся в ячейке B3, а
ссылка на нее программируется в ячейке А5, то в формуле она запишется как
R[-2]C[1]. Эта запись может интерпретироваться как обращение к ячейке,
находящейся на две строки выше и одну колонку правее текущей. Соответственно
запись R[2]C[-1] означает обращение к ячейке на две строки ниже и одну колонку
левее (по отношению к активной ячейке A5 такая ячейка не существует).
Пример
1. Рассмотрим
таблицу, показанную на рис. 1. В ней необходимо рассчитать сумму подоходного
налога (с учетом используемой ставки налога), сумму к выдаче для каждого
сотрудника, а также общие суммы уплачиваемых налогов и выплаченной заработной
платы. Записывался макрос с именем Расчет_заработной_платы. Текст макроса имеет
вид:
Рисунок 1.
В
рассматриваемом примере первый оператор представляет собой заголовок процедуры.
Имя процедуры совпадает с именем макроса. Следующие шесть строчек созданы
системой в виде автоматически вставляемого комментария.
Первый
исполняемый оператор программы Range(«C2»).Select создан системой в
виде выражения, которое содержит в терминологии VBA свойство Range в сочетании
с методом Select. Обратите внимание на то, что свойство имеет записанный в
круглых скобках аргумент в виде строки символов и отделяется от метода точкой.
В нашем примере аргумент свойства представляет собой ссылку на ячейку в стиле
A1, с которой началось программирование макроса.
С помощью Help-системы
разберитесь с назначением свойства Range. Для этого установите в окне модуля
маркер на текст Range и нажмите клавишу F1. Если вы испытываете затруднения с
чтением текста на английском языке, который используется Help-системой, воспользуйтесь
дополнительной русскоязычной литературой, посвященной описанию языка VBA. В
этом случае удобно составлять собственное описание встречающихся англоязычных
терминов и хранить его в удобном месте (например, в виде отдельного файла
Excel).
Аналогично
изучите назначение метода Select.
Задание
Согласуйте с преподавателем выбранный
вами вариант задания (табл. 1). Предполагается, что в рамках одной учебной
группы варианты заданий не повторяются. Разработайте и заполните таблицу и
запрограммируйте в ней необходимые вычисления. При необходимости воспользуйтесь
функциями. Убедитесь в правильности вычислений. Оформите таблицу, задайте
шрифты, границы и т.п. В качестве примера будет рассматриваться таблица,
предназначенная для расчета налогов и определения суммы заработной платы.
Используя копию созданной таблицы,
создайте и изучите макросы, позволяющие программировать вычисления в таблице.
Порядок выполнения работы
- Создайте новую рабочую книгу Excel. Сделайте ее настройку:
выполните команду СЕРВИС, Параметры и в диалоговом окне выберите
вкладку Общие, установив следующие параметры: Стиль ссылокR1C1:
выключено. - Листов в новой книге: 3.
- Стандартный шрифт: Arial Cyr, размер 10.
- Выберите рабочий каталог для сохранения новых книг.
- Введите имя пользователя.
- Выберите вкладку Вычисления, установив флажки следующих
параметров: Вычисления: автоматически. - Параметры книги: обновлять удаленные ссылки, сохранять значения
внешних связей.
8. В меню СЕРВИС,
Макрос выберите пункт Начать запись…. Задайте имя макроса.
9. Повторно
запрограммируйте формулы таблицы Excel и остановите запись макроса.
10. Командой Сервис,
Макрос, Редактор Visual Basic запустите редактор Visual Basic. В окне проектов
(Project-VBAProject) (рис. 2) раскройте содержимое проекта VBAProject
(PERSONAL.XLS) и ветвь Modules. В ее составе должен быть один
(например, Module1) или несколько модулей. Дважды щелкните левой клавишей мышки
по имени модуля. В ответ в правом верхнем окне должен появится его текст.
Просмотрите содержимое модулей и найдите записанный вами макрос.
11. Изучите
текст макроса.
12. Удалите
формулы из таблицы рабочего листа Excel и выполните макрос командой Сервис,
Макрос, Макросы. Убедитесь, что в результате его работы содержимое таблицы
восстанавливается.
13. Снова
удалите формулы из таблицы рабочего листа Excel. Перейдите в окно VBA,
установите маркер на первом операторе макроса. Выберите пункт Run, Run
Sub/User Form и запустите модуль на выполнение. Перейдите в таблицу Excel и
убедитесь, что в результате работы макроса формулы в ней восстановились.
14. Окончательно
оформите созданную таблицу для представления ее в отчетной документации.
Воспользуйтесь возможностями задания шрифтов, границ, заливок. Обеспечьте
компактность отображения таблицы за счет минимизации ширины строк и столбцов в
соответствии с имеющимися данными.
Задание на
выполнение работы Таблица 1.
Номер варианта |
Вид таблицы |
1 |
Ведомость складских остатков (наименование, цена, |
2 |
Ведомость операций квартплаты (плательщик, вид |
3 |
Ведомость операций оплаты за электроэнергию |
4 |
Журнал учета выполнения лабораторных работ |
5 |
Журнал учета экзаменационных оценок, перечень |
6 |
Расписание занятий преподавателей кафедры |
7 |
Индивидуальная выписка для преподавателя по |
8 |
Ведомость командировок (фамилия, город, страна, |
9 |
Ведомость операций туристического агентства |
10 |
Ведомость операций риэлтерского агентства (адрес, |
11 |
Ведомость операций обменного пункта валюты |
12 |
Ведомость операций авиакассы (фамилия, направление, |
13 |
Ведомость продаж универсама (вид товара, единица |
14 |
Смета затрат на ремонт (номер операции, операция, |
15 |
Ведомость операций телефонной компании (абонент, |
16 |
Ведомость комплектации изделия (наименование |
17 |
Таблица футбольного чемпионата (команда, страна, |
18 |
Ведомость операций типографии (автор, название, |
19 |
Список трудов (номер, название, место |
20 |
Ведомость операций отделения связи (адрес |
21 |
Ведомость операций страхового агентства (фамилия |
22 |
Ведомость операций библиотеки (автор, название, |
23 |
Ведомость операций фотоателье (фамилия заказчика, |
24 |
Ведомость банковских операций (фамилия, дата, вид |
25 |
Ведомость операций диспетчерской такси (клиент, |
26 |
Ведомость судейства соревнований по фигурному |
Контрольные вопросы
1. В каком случае используется стиль
ссылок Excel :A1, а в каком R1C1?
2. В чем разница абсолютной и
относительной адресации ссылок в Excel?
3. Когда целесообразно использовать
абсолютную адресацию в Excel?
4. Если написать макрос вручную, то
какие обязательные операторы он должен содержать?
5. Каково назначение свойства Range?
6. Каково назначение метода Select?
7. Как вызвать систему помощи и
получить справку по конкретному выражению макроса?
8. Как можно запустить макрос на
выполнение?
9. Что такое построчный комментарий и
как он оформляется?
10. Какие существуют возможности для
оформления внешнего вида таблицы Excel перед ее публикацией в отчетной
документации?
Содержание
отчета:
Подготовьте отчет о выполненной
лабораторной работе. Он должен содержать титульный лист, формулировку задания,
пример созданной таблицы, содержание ее программирования и текст созданного
вами макроса с включенными в него построчными комментариями действий системы,
созданными вам как результат анализа текста макроса. Сформулируйте выводы,
которые можно сделать по результатам выполненной работы.
ПРАКТИЧЕСКАЯ РАБОТА №2
СОЗДАНИЕ НОВЫХ ДИАЛОГОВЫХ ОКОН
НА ОСНОВЕ ФОРМ ПОЛЬЗОВАТЕЛЯ
Цель: Изучить способы
ввода-вывода данных, свойства встроенных объектов VBA: форм,
стандартных элементов управления «Надпись», «Поле» и
«Кнопка».
УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ
Основные синтаксические принципы языка VBA:
Макросы в Excel пишутся на языке VBA, синтаксис которого
почти полностью идентичен синтаксису Visual Basic. Основные синтаксические
принципы этого языка:
·
VBA нечувствителен к
регистру;
·
чтобы закомментировать код
до конца строки, используется одинарная кавычка или команда REM;
·
символьные значения должны
заключаться в двойные кавычки (“);
·
максимальная длина любого
имени – 255 символов.
Оператор – наименьшая единица кода VBA.
Арифметических операторов 7: сложение +, вычитание -,
умножение *, деление /, возведение в степень ^, целочисленное деление (делит
первое число на второе, отбрасывая дробную часть), деление по модулю mod (делит
первую число на второе, возвращая только остаток от деления).
Переменные – это контейнеры для хранения данных. Переменные
объявляются следующим образом:
Dim имя_переменной As тип_переменной
Типы данных:
·
числовые:
Byte – целое число от 0 до 255;
Integer – целое число от -32 768 до 32 767;
Long – большое целое число от
-2 147 483 648 до 2 147 483 647;
Single и Double – значения с плавающей запятой;
·
строковые – String;
·
дата и время – Data;
·
логический – Boolean;
·
объектный – Object –
хранит ссылку на любой объект в памяти;
·
variant – специальный тип данных, который может хранить
любые другие типы данных;
·
возведение в степень (^),
например 2^3 = 8;
·
целочисленное деление ().
Делит первое число на второе, отбрасывая (не округляя) дробную часть. Например,
52 = 2;
·
получение остатка от
деления Mod
Делит первое число на второе, возвращая только
остаток от деления. Например, 5
Mod 2 = 1.
Ввод данных
Осуществляется с помощью функции InputBox():
InputBox(«Тестовая строка»).
Особенность этой функции в том, что она всегда
возвращает строку. Если пользователь вводит число, то оно будет сначала
сохраняться в виде строки текста:
S=InputBox(«Введите число»).
Так что в переменной s
сохранится тестовая строка, т.е. число в виде «12». Поэтому его нужно
преобразовать в число. Для этого используется функция Val:
A=val(s).
Эта функция возвращает число, полученное
преобразованием строки s. Если в s было, например, «12», то после использования
Val, в переменной А будет число 12.
Вывод данных
Используется функция MsgBox(«Тестовая строка» &
имя_переменной).
Задание 1
- Откройте новый документ в Excel.
- Откройте редактор Visual Basic, используя команду Вид ->
Макросы -> Необходимо ввести имя нового макроса lab3
и нажать кнопку Создать. - В поле окна между словами Sub lab2 End Sub введите текст
MsgBox(«Hello»)
- Кликните на кнопке с зеленым треугольником («Выполнить Basic») в
верхней панели для выполнения макроса. - Программа запустится и откроется окно, которое создается функцией MsgBox.
Самостоятельно
Выведите
поздравление с Новым годом.
Задание 2
1.
В этом же документе
откройте редактор Visual Basic, используя вкладку Разработчик ->
Visual Basic и отредактируйте только что созданный макрос.
2. В среде редактирования поправьте
имеющейся модуль, введя следующий текст:
Dim
a as Integer
Dim
s As String
s=InputBox(«Введите число»)
a
= val(s)
MsgBox a
- В первых строках объявляются переменные a и s. Первая имеет тип
Integer (целое число), вторая – строка, в нее можно сохранять буквы или
слова. - Далее используем функцию InputBox, которая считывает то, что ввел
пользователь. Но все, что вводит пользователь, считается строкой. Если
вводит число, то оно представляется как «2», а все, что в «» считается
числом. Поэтому результат ввода сохраняется в переменной s. Чтобы убрать
«» с числа применяется функция val, она переводит строку в число. И теперь
результат можно сохранить в переменную а. - Кликните на кнопке с зеленым треугольником («Выполнить Basic») в
верхней панели для выполнения макроса. - Программа запустится и откроется окно, которое создается функцией
InputBox (рис. 1). Обратите внимание, что текст,
введенный в скобках функции, выводится как надпись в окне функции. В окне
функции InputBox в поле для ввода введите число и нажмите
кнопку «ОК».
Рис. 1. Окно функции InputBox
- Откроется окно функции MsgBox с введенным ранее числом.
Самостоятельно
- Создайте программу, перемножающую два числа,
введенных пользователем. - Выведите поздравления для того человека, имя
которого введет пользователь.
Задание 3
1. В данной работе необходимо создать форму пользователя, разместить
на ней элементы управления «Надпись» и «Кнопка»
и изменить некоторые заданные по умолчанию свойства объектов. Для этого:
а) перейдите из Excel в среду
программирования VBA;
б) добавьте к проекту
форму (команда «Insert/UserForm«). После выполнения
этой команды на экране появляется стандартная форма и панель
инструментов «Элементы управления»;
в) на панели
элементов выберите элемент управления «Надпись» и разместите его на форме;
г) на панели элементов выберите элемент управления
«Кнопка» и разместите его
на форме;
д) измените в окне свойств исходные
значения свойств объектов (табл. 2.1).
Таблица 2.1 Задание
свойств объектов
Имя объекта |
Имя свойства |
Значение свойства |
Описание свойства |
UserForm 1 (Форма) |
Caption |
Первая |
заголовок |
StartUpPosition |
2-CenterScreen |
начальное |
|
UserForm 1 (Форма) |
Font |
Times New Roman |
название |
Полужирный |
начертание |
||
11 |
размер |
||
Label 1 (Надпись) |
Caption |
Hello, World!!! |
текст |
Command Button 1 (Кнопка) |
Caption |
изменить надпись |
текст на |
Теперь форма
выглядит иначе (рис. 2.2).
2. Выполните
запуск приложения VBA (кнопка «Запуск подпрограммы / UserForm«, либо
клавиша F5). После
просмотра формы завершите работу приложения с помощью кнопки «Закрыть» в
правом верхнем углу формы.
3. Напишите код процедуры для обработки события Click элемента
«Кнопка». Для этого:
а) выберите
на форме элемент
«Кнопка»;
б) перейдите в режим ввода программного кода (команда «Вид / Программа», либо клавиша F7). VBA автоматически генерирует шаблон для
ввода кода процедуры:
Private Sub CommandButtonl_Click()
End Sub
в) наберите код процедуры между операторами Private Sub … и End Sub следующим
образом:
Private Sub CommandButtonl_Click()
‘ Установить новое значение свойства Caption
‘ элемента «Надпись» (с именем Label 1)
Label1.Caption = «Здравствуй, мир !!!»
End Sub
4.
Выполните запуск приложения.
5.
Нажмите левую
кнопку мыши на элементе «Кнопка». Обратите
внимание,
как при этом изменился текст надписи.
6.
Добавьте к проекту вторую форму. Ее свойство Name автоматически
устанавливается в значение UserForm2.
7.
Разместите на ней два элемента «Надпись», два элемента
«Поле» и два элемента «Кнопка». Элементы
управления «Поле» служат для ввода в программу следующих данных о Вас: фамилия и возраст.
Измените свойства объектов, чтобы форма имела вид, представленный на рис. 2.3.
8.
Напишите для события Click первого элемента «Кнопка» (с именем CommandButtonl) код
процедуры:
Private Sub CommandButtonl_CHck()
Dim strVarl As String, strVar2 As String
strVarl = «»: strVar2 = «»
‘ Занести в переменную strVarl текст из первого поля
strVarl =TextBoxl.Text
‘ Занести в
переменную strVar2 текст из
второго поля
strVar2 = TextBox2.Text
‘Функция MsgBox служит для вывода сообщений из программы
MsgBox «Ваша фамилия» & strVarl & «. Вам
сейчас » & strVar2
End Sub
9. Напишите для события Click второго элемента «Кнопка» (с
именем CommandButton2) код процедуры:
Private Sub CommandButton2_Click()
End
End Sub
10.
Выполните запуск приложения (при этом форма UserForm2 должна быть
активной).
11.
Введите в первом окне «Поле» (с именем TextBoxl) Вашу фамилию, во
втором окне «Поле» (с именем TextBox2) Ваш возраст.
12.
Нажмите левую кнопку мыши на элементе «Кнопка» (с именем CommandButtonl). Проверьте текст полученного сообщения.
13.
Завершите работу приложения с помощью кнопки CommandButton2.
Самостоятельно
Используя VBA в MS Excel, разработать пользовательскую
форму «Вычисление функций», предназначенную для вычисления выражений
при заданных
целых
числах x, y, z в соответствии с вариантом задания (№ п/п). Для проверки
значений
функций подобрать контрольный пример. Форма должна содержать:
1. Заголовок формы и надписи для
обозначения функций, например «f =».
2. Кнопку «Вычислить», при нажатии на
которую считываются значения аргументов функции, вычисляются выражения,
значения которых выводятся в диалоговые окна сообщений MsgBox и в
соответствующие для них надписи на форме после знака «=», например «f = 24».
3. Кнопку «Очистить», при нажатии на
которую удаляются значения функций.
4. Кнопку «Выход», предназначенную для
закрытия формы. Отображение формы на экране осуществляется при активизации рабочего
листа с именем «Вычисление выражений».
Контрольные вопросы:
1.
Какое окно в среде программирования VBA предназначено для отображения
структуры проекта? Что входит в состав вашего проекта?
2.
Какие встроенные объекты VBA использовались в данной лабораторной
работе?
3.
Каково назначение форм пользователя, элементов управления «Надпись»,
«Поле», «Кнопка»?
4.
Что такое «свойство объекта»? Какое окно в среде программирования VBA
предназначено для отображения свойств выбранного объекта?
5.
Какие
свойства и для каких объектов вы использовали в лабораторной работе?
6.
Приведите
примеры обращения в программе к свойствам элементов «Надпись», «Поле».
7. Понятие
события. Какое событие генерируется в системе, если во время выполнения
проекта перевести указатель мыши на элемент «Кнопка» и
нажать левую кнопку мыши?
Практическая работа №3
Условные операторы
Программа может выполняться не только последовательно, но
и, встретив условие, изменить свой ход. Например, при расчете корней
квадратного уравнения на первом шаге рассчитывается дискриминант, затем в
зависимости от его значения могут быть варианты расчета, либо рассчитываются
два корня, либо один, либо уравнение не имеет корней.
Для этого используется оператор if ..then:
If условие then
Команды1
Else
Команды2
End If
Если условие истинно, то выполняются команды1, если ложно,
то команды2.
· когда нужно проверить на соответствие нескольким условиям
(обратите внимание на использование логических операторов AND и OR):
AND – условия
выполняются одновременно
OR –
необходимо выполнение хотя бы одного из условий
y=5 при аÎ(5;10)
If (a< 10) And (a>5) Then
MsgBox («y=5»)
End If
Задание 1
Расчет квадратного уравнения вида , где коэффициенты a, b и с задаются
пользователем.
1.Откройте новый документ Excel и сохраните его под именем «Практическая
работа_4_1».
2.Откройте новый модуль VBA с помощью команды Вид-> Макросы. Введите
имя нового макроса Lab4 и нажмите
кнопку «Создать», находящуюся на панели справа.
3.В открывшемся окне редактора набрать следующий код между Sub Lab4 и End Sub:
Dim s as String
Dim a, b, c, d, x1, x2, x as double
S=InputBox(«Введите значение коэффициента а»)
A = val(s)
S=InputBox(«Введите значение коэффициента b»)
b = val(s)
S=InputBox(«Введите значение коэффициента c»)
c = val(s)
d=b*b-4*a*c
if D>0 then
x1=(-b+sqr(d))/(2*a)
x2=(-b-sqr(d))/(2*a)
MsgBox («X1=» & str(x1) & « X2=» & str(x2))
Else then
if D=0
x=-b/(2*a)
MsgBox(«x=» & str(x))
else
MsgBox(«Корней нет»)
endif
endif
Самостоятельно!!!
1.
Написать процедуру, рассчитывающую значение функции .
2. Написать
программу, которая находит сумму двух данных чисел (если оба числа четные) или
произведение (если хотя бы одно из чисел — нечетное). Во всех остальных случая
вывести сообщение: «числа нечетные».
3. Найти
минимальное из двух чисел, вводимых с клавиатуры
Задание
2.
На основе
программного кода, представленного на рис. 2, создать аналогичный макрос, но
значение температуры запросить у пользователя (используйте функцию InputBox).
Рис. 2. Листинг второго варианта написания If..Then с
измененным условием
Задание 3
Разработать
пользовательскую форму и составить программу, вычисляющую значение функции:
Пользовательская форма имеет вид, представленный на рис. 3.
Свойства объектов формы
представлены ниже.
Для обработки события нажатия
кнопки «Вычислить» введем следующий код:
Private Sub calc_Click()
Dim x, y As
Single x = Val(txtX.Text)
If x <= -4 Then
y = (Sin(3 * x) + x ^ 2) / (1 + x ^ 2) ^ (1 / 3)
ElseIf x > 3
Then
y = Abs(x — Exp(-x))
Else
y = Sqr(x ^ 2 +
4)
End If txtY.Text = y
End Sub
Подберем контрольные примеры: при x = –4 y = 6,431257;
при x = 0 y = 2;
при
x =
10 y = 9,999955.
Проверим работу программы (рис. 4).
Рис. 4. Результаты вычисления значений функции
Самостоятельно!!!!
Используя редактор VB MS Excel, разработать
пользовательскую форму и составить программу, вычисляющую значение функции в
соответствии с вари- антом задания (№ п/п). Подобрать контрольный пример.
Функция (аргумент) |
Действие |
Abs(N) |
Возвращает |
Atn(N) |
Возвращает |
Cos(N) |
Возвращает |
Exp(N) |
Возвращает |
Fix(N) |
Возвращает |
Int(N) |
Возвращает |
Log(N) |
Возвращает |
Rnd(N) |
Возвращает |
Sgn(N) |
Возвращает |
Sin(N) |
Возвращает |
Sqr(N) |
Возвращает |
Tan(N) |
Возвращает |
Контрольные
вопросы и задания:
1.
Для чего
используется свойство Caption элемента «Надпись»?
2.
Каково
назначение функции Val?
3.
Назначение
функции MsgBox.
4. Назначение функции InputBox.
5.
Является ли
обязательным элемент Else в структуре команды If?
6.
Каким образом
в программе записываются комментарии?
7.
Какое значение («истина» или «ложь») является
результатом операции сравнения m <= n при m = 3 и n = 4?
8.
Что означает
команда k = k
+ 1?
9.
Как работает команда sum = sum + a?
10.
Объясните
назначение команд составленного Вами макроса.
ПРАКТИЧЕСКАЯ РАБОТА №4
ОРГАНИЗАЦИЯ МНОГОЗНАЧНЫХ
ВЕТВЛЕНИЙ В ПРОГРАММЕ
Цель: Научиться
осуществлять выбор из нескольких возможных вариантов с помощью команды Select Case, применять элемент «Список» для обработки различных списков данных.
УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ
Оператор Select … Case…End Select
Организация
множественного выбора в Visual Basic
1. Формат записи:
Select Case переменная
Case значение 1
Действие 1
[[…
Case значение N
Действие N]
[Case Else
Действие]]
End Select
Примеч.: 1)Значение переменной в процедуре должно указываться сверху вниз,
т.е. условия проверяются сначала.
2) Если в
области значение находится условие, то необходимо использовать ключевое словосочетание Case Is
условие
Свойства ListBox
Некоторые свойства ListBox можно
установить только в режиме проектирования и их нельзя изменять во время работы
приложения
List |
Массив пунктов списка. Элемент массива List(0) содержит |
ListCount |
Возвращает число пунктов списка. Доступ к ним можно |
ListIndex |
Представляет собой индекс выбранного пункта списка. При |
Методы ListBox
AddItem |
Используется |
RemoveItem |
Используется |
Clear |
Удаляет |
Пример
1
Брокер получает процент от суммы сделки. Для сделок, сумма которых менее 150 тыс. р., вознаграждение брокера составит 3,5 %, от 150 до 500 тыс. р. – 4,5 %, а для сделок, сумма которых составляет больше 500 тыс. р. – 5
%. Разработать пользовательскую форму и
составить программу для расчета
вознаграждения брокера.
Создадим пользовательскую форму вида, представленного на рис. 1.
Свойства объектов формы представлены ниже.
Объект |
Свойство |
Объект |
Свойство |
UserForm1 |
Caption = Вознаграждение брокера |
Label1 |
Caption = Сумма сделки AutoSize = True |
CommandButton1 |
Name = calc Caption = Рассчитать |
Label2 |
Caption = Вознаграждение AutoSize = True |
CommandButton2 |
Name = clean Caption = Очистить |
TextBox1 |
Name |
CommandButton3 |
Name = exitForm Caption = Выход |
TextBox2 |
Name = txtVzngr Locked = True |
Для обработки события нажатия кнопки «Рассчитать» введем следующий
код:
Private Sub calc_Click()
Dim S, P As Single
S = Val(InputBox(«Введите
сумму сделки», «Ввод данных»))
Select Case S
Case 0 To 149999
P = S * 0.035
Case Is >= 500000
P = S * 0.05
Case Else
P = S * 0.045
End Select
txtSumma.Text = Str(S) + » руб.» txtVzngr.Text = Str(P) + » руб.»
End Sub
В данном случае слово Is, используемое в коде программы,
является ключевым словом VBA, обозначающим
тестируемое выражение в операторе Case
Пример
2
Составьте
макрос, который запрашивает по отдельности день, месяц и год, затем из
введенных значений формирует текстовую строку (например, «Сегодня 1 Мая
2002 года») и выводит ее на экран. Для этого:
а) в среде Excel VBA добавьте к проекту форму;
б) разместите на форме:
— 4 элемента «Надпись»
(один из них, предназначенный для вывода результата, должен иметь имя Result),
— 2 элемента «Поле»
(TextBox1 — для ввода
дня, TextBox2 — для ввода
года),
— 1 элемент «Список»
(для выбора месяца из списка; его имя по умолчанию ListBoxl измените на Listl)
— 2 элемента «Кнопка«;
в) свойство BorderStyle элемента «Надпись» с
именем Result установите в
значение 1; измените значения других свойств объектов так, чтобы форма
имела вид, представленный на рис.2;
г) в окне редактирования модуля напишите код процедуры для обработки
события Activate формы (событие Activate происходит, когда форма становится активной). Данная процедура заполняет список List1(метод AddItem добавляет строку в
список):
Private Sub UserForm_Activate()
Listl.AddItem «Январь«
Listl.AddItem «Февраль«
Listl.AddItem «Март«
Listl.AddItem «Апрель«
Listl.AddItem
«Май«
Listl.AddItem «Июнь«
Listl.AddItem «Июль«
Listl.AddItem «Август«
Listl.AddItem «Сентябрь«
Listl.AddItem «Октябрь«
Listl.AddItem «Ноябрь«
Listl.AddItem «Декабрь» End Sub
д) напишите код процедуры для обработки события Click элемента «Кнопка»
с именем CommandButton1:
Private Sub CommandButtonl_Click()
‘ В макросе
используются следующие переменные:
‘ index — порядковый номер
выбранной в списке строки
‘ mes — наименование месяца
Dim index As Integer, mes As String
If TextBox1 = «» Then _
MsgBox «Вы забыли указать день«: Exit Sub
If Val (TextBoxl) < 1 Or Val (TextBoxl)
> 31 Then _
MsgBox
«Неверен день месяца»: Exit Sub
‘ Свойство Listlndex элемента «Список» содержит
‘ порядковый номер выбранной в списке строки.
‘ Строки в списке нумеруются,
начиная с 0. Если не выбрана ни
‘ одна строка, свойство Listlndex имеет значение -1
index = List1.ListIndex
If index = -1 Then _
MsgBox «Вы
забыли выбрать месяц»: Exit Sub
If TextBox2 = «» Then _
MsgBox «Вы забыли
указать год»: Exit Sub
Result.Caption = «»
Select Case index
Case 0: mes = «января«
Case 1: mes = «февраля«
Case 2: mes = «марта«
Case 3: mes = «апреля«
Case 4: mes = «мая«
Case 5: mes = «июня«
Case 6: mes = «июля«
Case 7: mes = «августа«
Case 8: mes = «сентября«
Case 9: mes = «октября«
Case 10: mes = «ноября«
Case 11: mes = «декабря»
End Select
Result = «Сегодня » & TextBoxl & » » & mes & » »
& _
TextBox2 & » года»
End Sub
e) напишите код процедуры для обработки события Click элемента «Кнопка» с именем CommandButton2:
Private Sub CommandButton2_Click()
End
End
Sub
2.
Выполните запуск приложения (при этом форма UserForml должна быть
активной).
3.
В макросе предусмотрена обработка следующих ситуаций: не введен день или
год; введен несуществующий номер дня; не выбран ни один месяц в списке.
4.
Повторите пп. 3 и 4 для нескольких различных исходных данных.
Пример 3
По введенной дате рождения
сообщить пользователю, кто он по знаку зодиака (с 21 марта по 20 апреля – Овен,
с 21 апреля по 20 мая – Телец, с 21 мая по 21 июня – Близнецы, с 22 июня по 22
июля – Рак, с 23 июля по 23 августа – Лев, с 24 августа по 22 сентября – Дева,
с 23 сентября по 23 октября – Весы, с 24 октября по 22 ноября – Скорпион, с 23
ноября по 21 декабря – Стрелец, с 22 декабря по 20 января – Козерог, с 21
января по 19 февраля – Водолей, с 20 фев раля по 20 марта – Рыбы).
Пусть пользовательская форма будет иметь вид,
представленный на рис. 4.
Свойства объектов формы представлены ниже.
Объект |
Свойство |
Объект |
Свойство |
UserForm1 |
Caption = Знак зодиака |
Label1 |
Caption = Дата рождения AutoSize = True |
CommandButton1 |
Name = calc Caption = Определить знак |
Label2 |
Caption = Знак зодиака AutoSize = True |
CommandButton2 |
Name = clean Caption = Очистить |
TextBox1 |
Name |
CommandButton3 |
Name = exitForm Caption = Выход |
TextBox2 |
Name = txtZodiak Locked = True |
Чтобы определить знак зодиака по введенной
пользователем дате рождения, воспользуемся оператором выбора Select Case.
Кроме этого для выделения из даты месяца и числа потребуются функции Month(Дата)
и Day(Дата), которые возвращают соответственно месяц как целое
число от 1 до 12 и день как целое число от 1 до 31. Таким образом, код обработки события нажатия кнопки
«Определить знак» будет иметь вид:
Private Sub calc_Click()
Dim DR As Date
DR = (txtData.Text)
Select Case Month(DR) ‘выбор знака зодиака по номеру месяца
Case 1
If Day(DR) <= 20 Then txtZodiak.Text = «Козерог« Else txtZodiak.Text = «Водолей» Case 2
If Day(DR) <= 19 Then txtZodiak.Text = «Водолей« Else txtZodiak.Text = «Рыбы» Case 3
If Day(DR) <= 20 Then txtZodiak.Text = «Рыбы« Else txtZodiak.Text = «Овен» Case 4
If Day(DR) <= 20 Then txtZodiak.Text = «Овен« Else txtZodiak.Text = «Телец» Case 5
If Day(DR) <= 20 Then txtZodiak.Text = «Телец« Else txtZodiak.Text = «Близнецы» Case 6
If Day(DR) <= 21 Then txtZodiak.Text = «Близнецы« Else txtZodiak.Text = «Рак» Case 7
If Day(DR) <= 22 Then txtZodiak.Text = «Рак« Else txtZodiak.Text = «Лев» Case 8
If Day(DR) <= 23 Then txtZodiak.Text = «Лев« Else txtZodiak.Text = «Дева» Case 9
If Day(DR) <= 22 Then txtZodiak.Text = «Дева« Else txtZodiak.Text = «Весы» Case 10
If Day(DR) <= 23 Then txtZodiak.Text = «Весы« Else txtZodiak.Text = «Скорпион» Case 11
If Day(DR) <= 22 Then txtZodiak.Text = «Скорпион« Else txtZodiak.Text = «Стрелец» Case Else
If Day(DR) <= 21 Then txtZodiak.Text = «Стрелец« Else txtZodiak.Text = «Козерог» End Select
End Sub
Для примера: родившиеся 25 сентября 2000 г. по знаку зодиака «Весы»
Задание 1
1.
Самостоятельно разработайте приложение для регистрации участников
межвузовской конференции. Приложение запрашивает фамилию
участника, город (выбирается из списка; если нет в списке,
то можно ввести в
текстовом окне), должность (выбирается из списка: профессор, доцент, старший преподаватель,
преподаватель, ассистент, студент), затем из введенных данных
формирует текстовую строку (например,
«Иванов В.А., доцент, Хабаровск») и заносит ее в список. В
приложении должна быть предусмотрена возможность удаления строки из списка. Для этого:
а) добавьте к проекту форму UserForm2;
б) разместите
на форме 3 элемента «Надпись», 1 элемент «Поле» (для ввода фамилии), 2 элемента «Список»
(первый — для выбора должности,
второй — для формирования результата — списка участников), 1 элемент
«Поле со списком» (комбинированное окно для ввода или выбора города из списка) и 2 элемента
«Кнопка» (первый – для занесения строки в список, второй — для
удаления отмеченной строки из списка);
в) измените значения свойства Name элементов (табл.1);
Новые
имена объектов
Таблица.1
Имя объекта |
Значение свойства Name |
TextBoxl (Поле) |
Textl |
ListBoxl (Список) |
Listl |
ComboBoxl (Поле со списком) |
Combo 1 |
ListBox2 (Список) |
Result |
г) измените значения других свойств элементов так, чтобы форма имела вид,
представленный на рис. 3;
д) напишите
код процедур (предусмотрите в макросе обработку следующих ситуаций: не введена фамилия; не указан город; не выбрана в
списке должность; не отмечена строка в списке при удалении);
е) выполните запуск
приложения, проверьте его работу для нескольких различных исходных данных.
Задание 2
В соответствии с вариантом задания (№
п/п) разработать пользователь скую форму и составить программу в редакторе VB MS Excel. Подобрать контрольный пример
№ п/п |
Задание |
1 |
Торговый агент получает |
2 |
На банковский |
3 |
Менеджер получает комиссионные в зависимости |
4 |
Рассчитать заработную плату сотруднику с |
5 |
Сотрудник фирмы получает премию по итогам |
6 |
Рассчитываясь в одном из |
7 |
Определить стоимость билета на поезд в |
Задание 3
В соответствии с вариантом
задания (№ п/п) разработать пользовательскую форму и составить программу в
редакторе VB MS Excel, используя опера тор выбора Select Case.
№ п/п |
Задание |
||
1 |
В восточных календарях принят 60-летний Для проверки 1966 г. – «год желтой лошади», 1984 г. – «год зеленой крысы». |
||
3 |
Работа светофора для водителей |
||
4 |
Дано целое число n (1<= n <= 99), определяющее возраст человека (в |
||
5 |
По введенному числу n (1<= n<=7) сообщить пользователю место летнего |
||
6 |
По введенному пользователем времени (часы : |
||
7 |
По введенному числу n сообщить |
||
8 |
По заданной сумме S стоимости покупки напечатать строку, |
||
Контрольные вопросы
и задания:
1.
Каково назначение оператора «&»?
2.
Как изменяется внешний вид элемента «Надпись» при установке
его
свойства BorderStyle в значение 1
?
3.
Какое действие выполняет метод AddItem элемента
«Список»?
4.
Каково
назначение свойства Listlndex элемента «Список»?
5.
Какой метод
элемента «Список» используется для удаления строки из списка?
6.
Чем отличаются
функции элементов управления «Список» и «Поле со списком»?
7.
Объясните назначение команд составленных Вами макросов.
ПРАКТИЧЕСКАЯ
РАБОТА №5
ЦИКЛИЧЕСКИЕ ОПЕРАТОРЫ
Цель: Изучить основные принципы составления циклических программ в Excel VBA. Научиться
обращаться к ячейкам выделенного диапазона.
ОСНОВНЫЕ СВЕДЕНИЯ
Процесс,
в котором один оператор или группа операторов выполняются многократно при
различных значениях аргумента, называется циклическим процессом.
В VBA для выполнения повторяющихся действий используются операторы
цикла, которые бывают следующих типов:
·
оператор цикла с
параметром For – Next, конструкция которого используется, если
заранее известно, сколько раз должно повториться тело цикла:
For счетчик = начальное_значение
То конечное_значение Step шаг блок_операторов
Next счетчик
•
операторы цикла
с предусловием или постусловием, которые используются для
организации цикла с неизвестным заранее числом повторений тела цикла:
УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ
Задание 1
1.
Составьте макрос, заполняющий выделенную строку ячеек последовательностью
чисел 1,2, … N, где N — количество ячеек. Например, на рис. 1
представлен результат выполнения макроса в случае, если выделен диапазон
ячеек В2:Е2.
А |
В |
С |
D |
Е |
F |
|
1 |
||||||
2 |
1 |
2 |
3 |
4 |
||
3 |
Рис.1. Заполнение программным путем диапазона В2:Е2
Для этого:
а) перейдите из Excel в среду программирования VBA;
б) добавьте модуль и в окне редактирования модуля наберите следующие команды:
Public Sub Заполнение_строки()
‘ В макросе
используются следующие переменные:
‘ N— количество
ячеек в строке,
‘ i — номер
текущей колонки,
‘ k — число,
записываемое в ячейку
Dim N As Integer, i
As Integer, k As Integer
N =
Selection.Columns.Count
k=l
For i =
1 To N
Selection.Cells(1,i)
= k
k = k+l
Next i
End Sub
2. Вернитесь
в Excel, выберите
диапазон ячеек A2:D2 и выполните
макрос.
Дополните макрос
возможностью закраски заполняемых ячеек зеленым цветом. Для этого после
команды » Selection.Cells(1, i) = k
вставьте команду
» Selection.Cells(1, i).Interior.Color = vbGreen«
3.
Вернитесь в Excel и проверьте работу макроса, выбрав ячейки
В1:С1.
Самостоятельно!!!
Самостоятельно
составьте макрос «Заполнение_колонки», который будет заполнять
ячейки выделенной колонки последовательными числами от 1 до М,
где М — количество ячеек. Так, на рис. 2 представлен
результат выполнения макроса в случае, если выделен диапазон ячеек В2:В5.
А |
В |
С |
|
1 |
|||
2 |
1 |
||
3 |
2 |
||
4 |
3 |
||
5 |
4 |
||
6 |
Рис. 2.
Заполнение программным путем диапазона В2:В5
При разработке
макроса учтите, что:
•
Количество
ячеек в столбце определяется количеством строк выбранного диапазона,
поэтому вместо .Columns.Count используйте .Rows.Count.
• В объекте Cells(i, j) i определяет № строки, a j — № колонки. Поскольку макрос должен
работать только с одной колонкой, в цикле нужно обращаться к объекту Cells(i, 1).
6. Запишите составленный макрос в модуль,
выделите в таблице диапазон ячеек ВЗ:В5 и выполните макрос. Каким образом
теперь выглядит таблица? Текст макроса приведите в отчете по лабораторной работе.
Задание 2
Создать процедуру расчета факториала числа, введенного
пользователем.
- В открывшемся окне редактора набираем код:
Sub Lab5
s=InputBox(«Введите
число»)
n=val(s)
f=1
for i=1 to n
f=f*i
next i
MsgBox(«Факториал введенного числа равен » & f)
End Sub
- В этом коде до начала цикла со счетчиком в переменную f
записывается 1. Далее в теле цикла со счетчиком в переменной f
накапливается произведение чисел от 1 до введенного пользователем числа.
Так на первом шаге цикла в f записывается 1*1, на втором шаге цикла
1*2, на третьем – берем то, что было в f на втором шаге 1*2 и * на значение
счетчика 3, получается 1*2*3 и так далее.
Самостоятельно!!!
1.
Измените предыдущую
процедуру так, чтобы рассчитывалась сумма чисел от 1 до введенного
пользователем числа.
2.
Напишите процедуру
считающую количество положительных чисел, введенных пользователем. Сначала
задается общее количество чисел.
3.
Написать программу, находящую сумму всех четных чисел, меньших
заданного числа N. Сначала задается общее количество чисел и число N.
Задание 3
Разработаем пользовательскую форму и
составим программу для поиска всех двузначных чисел, сумма квадратов цифр которых
делится на 13.
Для создания данной пользовательской
формы перейдем в редактор и добавим форму (рис. 3).
Свойства объектов формы представлены в таблице 2.
Для обработки событий нажатия кнопок «Рассчитать», Очистить» и «Выход»
введем следующий код:
На рабочем листе «Пример 3» разместим
кнопку «Открыть форму» для вызова формы «Пример 3» и запустим данную форму .
Самостоятельно!!!
В соответствии с вариантом задания
разработать пользовательскую форму и составить программу в редакторе VB MS
Excel. Подобрать контрольный пример.
1. |
Найти все |
2. |
Найти такие четыре последовательных двузначных |
3. |
Найти все трехзначные числа, квадрат которых |
4. |
Найти все трехзначные числа, которые можно |
5. |
Найти все трехзначные числа, средняя цифра которых |
6. |
Найти все двузначные числа, удовлетворяющие условию: |
7. |
Найти сумму целых положительных чисел, больших 20, |
8. |
Найти среднее |
9. |
Найти максимальное |
10. |
Найти максимальный |
Контрольные вопросы и
задания:
1. Какой объект служит для
обращения к выделенному диапазону ячеек?
2.
Как найти
количество строк и колонок выделенного диапазона?
3.
Что
означает запись «Selection.Cells(3, 1)»?
4.
Сколько
раз выполнится команда «Selection.Cells(l, i) = k» внутри цикла «For i = 1 То N … Next
i«? Какие действия она выполняет?
5.
Что
означает команда k = k + 1?
6. Дайте определение циклическому алгоритму? Что
такое цикл?
7.
Для чего
предназначен оператор For…Next?
ПРАКТИЧЕСКАЯ РАБОТА №6
СОЗДАНИЕ
ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ MS EXCEL
Основные
сведения
Одной
из возможностей VBA является создание новой
функции MS Excel, которую впоследствии можно использовать аналогично встроенным функциям
(СУММ, МАКС, ЕСЛИ и др.). Это целесообразно в тех случаях, если необходимой
функции нет в стандартном наборе встроенных функций MS Excel, на- пример формулы
Пифагора, а ей приходится часто пользоваться.
Пример
1
Создадим пользовательскую
функцию, вычисляющую по формуле Пифагора длину гипотенузы прямоугольного
треугольника. Для этого:
1.
Откроем MS Excel и перейдем в редактор VB.
2.
В новом модуле (Insert ® Module) через команду Insert ® Procedure зададим имя и остальные
параметры новой функции (рис. 12). Нажмем кнопку «ОК».
3.
В окне кода между двумя появившимися строчками
напишем программный код для данной функции, учитывая, что для нахождения длины
гипотенузы по формуле Пифагора нужно знать значения двух катетов:
Public Function Пифагор(a As Single, b As
Single)
‘аргументы а и b вещественные
Пифагор = Sqr(a ^ 2 + b ^ 2)
End Function
4.
Закроем редактор VB и воспользуемся нашей функцией.
5.
В ячейки А1, В1 и С1 введем соответственно символы
а, b, и с; в ячейки А2 и В2 – значения
катетов (3 и 4), а в ячейку С2 вставим формулу, воспользовавшись кнопкой «fBxB» на панели инструментов либо командой Вставка
® Функция и выбрав созданную функцию в категории
«Определенные пользователем» диалогового окна Мастер функций.
Пример 2
Создадим функцию пользователя, математически определенную как y = sin(px)e—2 xи построим ее график. Для этого в редакторе VB MS Excel в новом модуле
через команду Insert ® Procedure
создадим функцию с именем «Y» и
напишем для нее программный код:
Public Function Y(x As Single)
Y = Sin(Application.Pi() * x)
* Exp(-2 * x) End Function
Здесь мы воспользовались стандартной функцией Pi(),
которая возвращает значение постоянной p (в Excel –
функция пи()). Так как она не является внутренней функцией VBA, то
ее необходимо записать в виде Application.Pi().
Теперь
проверим работу созданной функции и построим ее график:
Пример
3
Создать макрос Вышивка линейного
алгоритма в приложении MS Excel с помощью Visual Basic for Application.
1.1.
Вызовите окно программы Visual Basic
1.2.
Добавьте новый объект в проект. Insert (Вставка)
выберите Module (модуль).
1.3.
Наберите первую строку тела процедуры, начиная
с указания объекта Range(“A1”), т.е. ячейка с адресом А1.
Range(«A1»).Interior.ColorIndex = Rnd()
* 8
Rnd(), -. генерация
произвольного числа от 0 до 1.
1.4.
Но это число слишком мало, для его увеличения
умножьте функцию на 8.
1.5.
Скопируйте содержимое еще семь раз и смените
адреса ячейки, опираясь на текст программы
1.6.
Продолжите работу самостоятельно, учитывая, что
первый блок меняет случайным образом цвет номерами 0-8 в ячейках в
диапазоне А1:D2
1.7.
Во втором блоке с помощью метода (т.е.
стандартной команды действия) с названием .Copy
происходит поочередное копирование в буфер обмена 4 клетки в первом ряду. С
помощью метода .PasteSpecial происходит вставка в
соответствующие адресам клетки
1.8.
Самостоятельно
разберитесь с третьим и четвертым блоками, запоминая, что метод .Select – это выделение указанного диапазона ячеек.
Пример 4
Усовершенствовать
макрос Узор линейного алгоритма в приложении MS Excel с
помощью Visual Basic for Application.
1.1. Переключитесь в окно MS Excel.
1.2. Вызовите панель Формы (Вид/Панели инструментов/Формы).
1.3. Выберите инструмент Кнопка, разместите кнопку справа от
орнамента разметом 2х3 см.
1.4.
Автоматически, после размещения элемента на
экране, панель Формы вызывает окно Назначить макрос объекту.
Выберите из списка, если таковой имеется, макрос Узор. Нажмите ввод.
1.5. Перейдите в окно Visual Basic (ALT+F11).
1.6. Объект Range удобен, когда точно
известны адреса ячеек, но его можно заменить на более универсальный объект Cells().
Измените в программе текст, как указано в отрывке ниже, опираясь на теорию.
1.7. Проверьте работу программы и исправьте ошибки, если таковые имеются.
I.Объекты MS Excel 1. Range(«диапазон»), где диапазон Range(«C1»), Range(«A1:H2»), 2. Cells(номер ряда, номер колонки). Cells(1, 1) – ячейка А1, Cells(1, 2) — ячейка В1. Range(Cells(1, |
3. Row— ряд. Y = ActiveCell.Row 4. Column – колонка. Х
Workbooks(«Cogs.xls»).Worksheets(«Sheet1»).Activate 7. 8. |
1.8. Опишите переменные, которые будут использованы в тексте программы с
целью сделать ее универсальной (применимой во многих сходных задачах, в
данном случае: при любых координатах начальной ячейки).
1.9. Запишите строку Dim X,Y as
Byte. Здесь X,Y – переменные, а Byte –
тип данных (один из многих). Помощник предложит вам список, где выберите тип
данных.
1.10. Разместите в окне MS Excel
дополнительную кнопку, которой назначьте макрос run(). Напишите на кнопке – Диагональ.
1.11. Активизируйте ячейку А1 и нажмите кнопку Диагональ шесть
раз. Это поможет глубже объяснить текст кода.
1.12. Активизируйте ячейку В6 и нажмите кнопку Диагональ четыре раза.
1.13. Выделите произвольную ячейку. Проверьте работу кнопки.
Пример
5
Используя
VBA в MS Excel, разработаем
пользовательскую форму «Расчет прибыли» для расположенной ниже таблицы.
Выручка от реализации (ВР) |
Себестои- мость (С) |
Внереализацион- ный доход (ВД) |
Балансовая прибыль (БП) |
Налог на прибыль (НП) |
Сумма на- лога (СН) |
Размер при- были (РП) |
900,00 |
400,00 р. |
150,00 |
(ВР |
20,0 |
(БП × НП) |
(БП |
Для создания пользовательской
формы откроем новую рабочую книгу MS Excel и на «Листе1» в первой строке введем
наименование полей таблицы, а строкой ниже установим в ячейке, соответствующей
графе НП, процентный формат, а в остальных шести – денежный. Расчертим таблицу
(рис. 18).
Перейдем к разработке
пользовательской формы, для чего откроем редактор VB:
1.
Добавим форму, воспользовавшись командой Insert ® UserForm.
2.
Разместим на форме с помощью панели элементов Toolbox
слева семь надписей (элемент Label), справа – семь полей (элемент TextBox),
а ниже — четыре командных кнопки (элемент CommandButton).
3.
С помощью окна свойств установим свойства данных объектов.
Объект |
Свойство |
Объект |
Свойство |
UserForm1 |
Caption = Расчет прибыли |
TextBox6 |
Name = txtSN Locked = True |
CommandButton1 |
Name Caption |
TextBox7 |
Name = txtRP Locked = True |
CommandButton2 |
Name = printToTable Caption = Заполнить таблицу |
Label1 |
Caption = Выручка от реализации AutoSize = True |
CommandButton3 |
Name Caption |
Label2 |
Caption = Себестоимость AutoSize = True |
CommandButton4 |
Name |
Label3 |
Caption AutoSize = True |
TextBox1 |
Name |
Label4 |
Caption AutoSize |
TextBox2 |
Name Locked |
Label5 |
Caption = Балансовая прибыль AutoSize = True |
TextBox3 |
Name |
Label6 |
Caption = Сумма налога AutoSize = True |
TextBox4 |
Name |
Label7 |
Caption = Размер прибыли AutoSize = True |
TextBox5 |
Name |
Перейдем
к обработке события, возникающего при нажатии на кнопку (со- бытие называется Click). Для этого выполним двойной щелчок
мышью по командной кнопке «Расчет». Откроется окно редактора кода VB, в котором вве дем программный код:
Dim VR, VD, S, NP As Single ‘задание
типа переменных
Dim BP, SN, RP As Single Private Sub calc_Click()
VR = Val(txtVR.Text) ‘считывание значения
выручки от реализации
S = Val(txtS.Text) ‘считывание
значения себестоимости
VD = Val(txtVD.Text) ‘считывание значения
внереализационного дохода
NP = Val(txtNP.Text) / 100 ‘считывание
значения налога на прибыль и перевод
его в доли
BP = VR + VD – S ‘вычисление балансовой прибыли
SN = BP * NP ‘вычисление суммы налога
RP = BP – SN ‘вычисление размера прибыли
txtBP.Text = BP ‘вывод
балансовой прибыли в текстовое поле
txtSN.Text = SN ‘вывод
суммы налога в текстовое поле
txtRP.Text = RP ‘вывод
размера прибыли в текстовое поле
‘изменение
цвета фона
кнопки для
визуализации того,
что процесс
вычислений выполнен
calc.BackColor = Rnd * 10 ^ 5
End Sub
Аналогично введем программный код для оставшихся кнопок:
Private Sub printToTable_Click()
Cells(2, 1)
= VR ‘вывод значения выручки
от реализации в ячейку А2
Cells(2, 2)
= S ‘вывод значения
себестоимости в ячейку В2
Cells(2, 3)
= VD ‘вывод значения
внереализационного дохода в ячейку С2
Cells(2, 4)
= BP ‘вывод значения
балансовой прибыли в ячейку D2
Cells(2, 5) = NP ‘вывод значения налога на прибыль в ячейку
E2 Cells(2, 6) = SN ‘вывод значения суммы налога в ячейку F2
Cells(2, 7)
= RP ‘вывод значения размера
прибыли в ячейку G2 printToTable.BackColor = Rnd * 10 ^ 5‘изменение
цветового фона кнопки
End Sub
Private Sub clean_Click()
txtVR.Text = Clear ‘очистка текстовых полей
txtS.Text = Clear
txtVD.Text = Clear txtNP.Text = Clear txtBP.Text =
Clear txtSN.Text = Clear txtRP.Text = Clear
Cells(2, 1).ClearContents ‘очистка ячеек
A2:G2
Cells(2, 2).ClearContents
Cells(2, 3).ClearContents
Cells(2, 4).ClearContents
Cells(2, 5).ClearContents
Cells(2, 6).ClearContents
Cells(2, 7). ClearContents
End Sub
Private Sub exitForm_Click()
End
End Sub
Теперь
вернемся на «Лист1» и с помощью инструмента Кнопка разместим ниже таблицы
кнопку и назначим макрос ОткрытьФорму. Далее, дважды щелкнув по кнопке,
перейдем в редактор VB и в модуле «Лист1» введем
программный код:
Private Sub
ОткрытьФорму_Click()
UserForm1.Show ‘вывод
формы на экран
End Sub
Задания
к лабораторной работе 7
Задание
1
В соответствии с вариантом (№ п/п) создать пользовательскую функцию MS Excel и
воспользоваться ей в формулах, размещаемых на рабочем листе.
Задание 2
Создайте в имеющемся модуле Примера 3
процедуру Цветок(), продолжив ниже новый текст. Код программы
закрашивает стебель цветка в зеленый цвет, а для лепестков генерирует цвета в
пределе 56
Задание 3
Создайте в имеющемся модуле Примера 4
процедуру Обратно(), продолжив ниже новый текст. Код программы рисует
диагональ как в процедуре run(), но в обратном направлении, т.е. í и
другим цветом.
Задание 4
Используя
VBA в MS Excel, разработать пользовательскую форму по Примеру 5,
предназначенную для
выполнения расчетов, соответствующих варианту задания (№ п/п). Форма должна содержать:
ПРАКТИЧЕСКАЯ
РАБОТА №7
Цель работы: изучить основные приемы работы с
встроенными диалоговыми окнами.
Методические указания
ВСТРОЕННЫЕ ДИАЛОГОВЫЕ
ОКНА
Возможности ввода
вывода информации в VBA
чрезвычайно велики. Объектно–ориентированная структура языка позволяет
программисту использовать в своих пользовательских приложениях все возможности,
созданные для организации многооконной работы, развитых диалогов ввода-вывода,
работы с мышью, а также файловой работы. Имеющиеся возможности организации
ввода-вывода можно условно разбить на следующие основные группы в соответствии
с имеющими в составе VBA объектами
и методами:
§ встроенные
диалоговые окна;
§ средства
создания пользовательского интерфейса;
§ средства
создания панели инструментов;
§ средства
работы с графическими объектами;
§ средства
построения диаграмм и графиков;
§ средства
работы с файлами.
Встроенные
диалоговые окна являются простейшей формой организации ввода-вывода и могут
рассматриваться как операторы ввода-вывода языка VBA. Функция InputBox выводит на
экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим
ожидания ввода текста пользователем или нажатия кнопки, а затем возвращает
значение типа String,
содержащее текст, введенный в поле. Формат оператора:
InputBox(prompt[,title][,default][,Xpos][,Ypos][,helpfile,context])
Здесь prompt –
строковое выражение, которое будет отображаться как сообщение в диалоговом
окне, title —
сообщение, отображаемое в заголовке окна (если оно опущено, то отображается имя
приложения), default –
сообщение, которое будет выводиться в строке при запуске, Xpos и Ypos задают
положение окна на экране, helpfile и context –
соответственно имя файла и номер раздела справочной системы.
Функция
MsgBox выводит на
экран диалоговое окно с сообщением и ожидает нажатия кнопки пользователем
возвращая значение нажатой кнопки как число типа Integer. Формальная
запись функции выглядит как:
MsgBox(prompt[,buttons][,title][, helpfile,context]
Одноименные с
функцией InputBox аргументы
имеют тот же самый смысл, а значение buttons определяется как
сумма констант, задающих число и тип отображаемых кнопок, тип используемого
значка и основную кнопку (см. табл.1).
Таблица
1. Константы аргумента buttons и возвращаемые значения функции MsgBox
Информационные |
Значение |
Значок |
VbCritical |
16 |
|
VbQuestion |
32 |
|
VbExclamation |
48 |
|
VbInformation |
64 |
|
Основная |
Значение |
Номер |
VbDefaultButton1 |
0 |
Кнопка |
VbDefaultButton2 |
256 |
Кнопка |
VbDefaultButton3 |
512 |
Кнопка |
VbDefaultButton4 |
768 |
Кнопка |
Возвращаемое |
Значение |
Нажатая |
VbOK |
1 |
Нажато |
VbCancel |
2 |
Нажата |
VbAbort |
3 |
Нажата |
VbRetry |
4 |
Нажата |
VbIgnore |
5 |
Нажато |
VbYes |
6 |
Нажато |
VbNo |
7 |
Нажато |
Порядок
выполнения работы.
Пример 1
– Изучите функцию MsgBox
Sub sample_1()
MsgBox «Фильтровать?»,
vbOKCancel + vbQuestion + vbDefaultButton2,
«Отбор данных»
MsgBox «Отбор
данных произведен», vbOKOnly + vblnformation, «Отбор данных»
MsgBox «Ошибка в
данных!», vbOKOnly + vbCritical, «Отбор данных»
MsgBox «Ошибка в
данных!», vbCritical + vbAbortRetrylgnore, «Отбор
данных»
End Sub
Форматирование
значения данных
Для того, чтобы получить
любой формат отображения данных, преобразовать числа или даты в строки или
отформатировать строки в соответствии с вашими требованиями, можно использовать
функцию Format Функция Format использует те же самые символы формата, что и Excel (откройте
окно Формат—Ячейки -Число и в списке «Числовые форматы» укажите «все
форматы»). Обращение к функции:
Format (переменная, «строка формата»)
Для создания
пользовательских форматов данных используются символы, приведенные в табл. 7.
например, отображение
текущей даты может быть записано по-разному:
Символ |
Описание |
0 |
Резервирует место для цифры, отображается либо |
# |
Резервирует место для числового разряда, |
. |
Точка разделяет целую и дробную части числа |
% |
Устанавливает процентное отображение числа, |
d |
День месяца без лидирующего нуля |
dd |
День месяца с лидируюшим нулем |
ddd |
Краткое название дня недели |
dddd |
Полное название дня недели |
w |
Номер дня недели (воскресенье — 1) |
ww |
Неделя года в виде целого числа от1 до 54 |
111 |
Номер месяца без лидирующего нуля |
niiii |
Номер месяца с лидир^тощим нулем |
mmm |
Краткое название месяца |
mmmm |
Полное название месяца |
у |
День года |
УУ |
Гол |
УУУУ |
Полное |
/ |
Разделитель |
q |
Номер |
h или hh |
Отображает |
n или nn |
Минуты |
s или ss |
Сек>»нды |
: |
Двоеточие |
@ |
Отображает |
& |
Отображает |
> |
Отображает |
< |
Отображает |
Пример 2
Sub sample2()
MsgBox «Сегодня » & Format(Date,
«dd.mm.yy»)
MsgBox «Сегодня » & Format(Date,
«dddd, dd mmmm, yyyy»)
End Sub
Используя числовые форматы, можно изменять вид отображения
числа.
Sub sample3()
р = 123.4506
MsgBox Format(p,
«00000.000»)
MsgBox Format(p,
«###0.00»)
MsgBox Format(p,
«#0.00%»)
End Sub
Использование
MsgBox для обеспечения возможности выбора
Как уже отмечалось
ранее, при помощи необязательного аргумента Buttons можно использовать
VBA-процедуру MsgBox как функцию для получения выбора от пользователя в ответ
на сообщения или вопросы, которые отображает процедура. Для многих простых
вариантов выбора использование функции MsgBox для получения ответа от
пользователя является гораздо более легким, чем получение текстового ввода с
помощью функции InputBox и последующий анализ этого текста для определения
того, какой выбор сделал пользователь. При включении аргумента Buttons с
необходимыми круглыми скобками оператор MsgBox работает подобно функции и
отображает окно сообщения, содержащее различные командные кнопки. MsgBox
возвращает численный результат, указывающий, какую командную кнопку выбрал
пользователь. Число и тип командных кнопок, отображаемых диалоговым окном
MsgBox, выдается с помощью аргумента Buttons.
Пример 3. Создать
макрос, определяющий нажатие кнопки в окне ввода
РАБОТА С
VBA-ОБЪЕКТАМИ
1. Флажок (CheckBox)
CheckBox – флажок.
Используется для включения и отключения каких-либо опций. Элемент управления
представляет собой поле, где можно устанавливать и снимать флажок и надпись,
где обычно выводится название и назначение флажка.
Если флажок установлен
– его свойство Value (Значение) устанавливается в True (Истина),
если не установлен – в False (Ложь). Для того чтобы программно
установить или снять флажок, можно воспользоваться его свойством Value,
приравняв ему True или False, соответственно.
Еще одно важное
свойство флажка – TripleState. Если оно включено – флажок помимо True
или False может иметь значение Null, которое можно
интерпретировать как «Пустой флажок». Null-флажок нельзя
модифицировать – он закрашен серым цветом.
Сами по себе, без
использования специальных конструкций языка, флажки приносят мало пользы.
Эффективно работать с ними можно, используя операторы принятия решений.
С флажком можно
сопоставить событие Change (Изменить). Оно выполняется всякий раз при
установке или снятии флажка.
2.Переключатель (OptionButton)
Элемент управления OptionButton (переключатель) создается с помощью кнопки Переключатель (OptionButton). Он позволяет выбрать, один из нескольких взаимоисключающих
параметров или действий. Переключатели обычно отображаются группами,
обеспечивая возможность выбора альтернативного варианта.
Приведем наиболее часто используемые свойства элемента управления OptionButton.
Value |
Возвращает True, если переключатель выбран и False |
Enabled |
Допустимые значения: True (пользователь может выбрать переключатель) |
Visible |
Допустимые значения: True (переключатель отображается во время |
Caption |
Надпись, отображаемая рядом с переключателем |
Основными событиями
переключателя являются события Click и Change.
Пример 4.
Разработать программу
выполнения одной из четырех арифметических операций над двумя числами по выбору
пользователя. Исполняемая операция устанавливается за счет выбора
соответствующего переключателя.
Рис.: Использование переключателей.
Private Sub CommandButton1_Click()
Dim a As Integer, b As
Integer, c As Integer
a = TextBox1.Value
b = TextBox2.Value
If OptionButton1.Value = True
Then
c = a + b
End If
If OptionButton2.Value = True
Then
c = a — b
End If
TextBox3.Value = c
End Sub
Пример 5. Создать программу
«Времена года», по которой в зависимости от выбранного положения переключателя
(зима, весна, лето, осень) выдается изображение соответствующего времени года.
1. Добавить на форму
объекты:
Объект |
Свойство |
Значение |
||
Label (надпись) |
Name |
LabelSeason |
||
Caption |
Времена года |
|||
Font |
Tahoma. 22 |
|||
Image (рисунок) |
Name |
Image 1 |
||
Visible |
False (вначале рисунок невидим) |
|||
PictureSizeMode |
1 |
|||
Pic toe |
(вставить рисунок зимы) |
|||
Height |
180 |
|||
Width |
180 |
|||
Command Button (кнопка) |
Name |
CmdExit |
||
Caption |
Выход |
|||
Frame (рамка) |
Name |
Frame 1 |
||
Caption |
Выберите время года |
|||
Font |
Tahoma. 12 |
|||
Все |
||||
OptionButton (переключатель) |
Name |
OptWinter |
||
Caption |
Зима |
|||
Fore Color |
(синий — выбирается в палитре Pelette) |
|||
Font |
Tahoma. 14. полужирный |
|||
OptionButton (переключатель) |
Name |
Opt Spring |
||
Caption |
Весна |
|||
Fore Color |
(светло-зеленый) |
|||
Font |
Tahoma. 14. полужирный |
|||
OptionButton (переключатель) |
Name |
OptSummer |
||
Caption |
Лето |
|||
Fore Color |
(темно-зеленый) |
|||
Font |
Tahoma. 14. полужирный |
|||
OptionButton (переключатель) |
Name |
OptAutumn |
||
Caption |
Осень |
|||
Fore Color |
(оранжевый) |
|||
Font |
Tahoma. 14. полужирный |
|||
2. Запрограммировать щелчок на переключателях:
a) Запрограммировать переключатель Зима (OptWinter),
чтобы в поле рисунка загружался файл, например, winter.jpg (свойство Picture
и функция LoadPicture). Поскольку каталог с приложением может
находиться в разных папках, то к имени файла надо добавить путь к файлу с
приложением
(ActiveWorkbook.Path). После этого надо поле с рисунком сделать
видимым (свойство Visible).:
Private
Sub OptWinter_Click()
Image1.Picture
= LoadPicture(ActiveWorkbook.Path & «winter.jpg»)
Image1.Visible = True
End Sub
b) Аналогично запрограммировать остальные переключатели.
Option Explicit
Private Sub CmdExit_Click()
End
End Sub
Private Sub OptAutumn_Click()
Image1.Picture = LoadPicture(ActiveWorkbook.Path
& «Autumn.jpg»)
Image1.Visible = True
End Sub
Private Sub OptSpring_Click()
Image1.Picture = LoadPicture(ActiveWorkbook.Path
& «spring.jpg»)
Image1.Visible = True
End Sub
Private Sub OptSummer_Click()
Image1.Picture = LoadPicture(ActiveWorkbook.Path
& «summer.jpg»)
Image1.Visible = True
End Sub
Private Sub OptWinter_Click()
Image1.Picture = LoadPicture(ActiveWorkbook.Path
& «winter.jpg»)
Image1.Visible = True
End Sub
Private Sub CheckBox1_Click()
Call Month
End
Sub
Задания
к лабораторной работе 8
Задание 1. Вывести 5 различных диалоговых окон и 2 окна с
возможностью выбора
Задание 2. Создать пользовательскую форму и написать
программу для решения следующей задачи с использованием переключателей:
- Выбирается число от 1 до 7, определяющее день недели. Дать краткое
название этого дня. - Выбирается число от 1 до 5. Дать название этого числа.
- Вводится нецелое число. Вывести либо его целую часть, либо дробную
в зависимости от выбора пользователя. - Банк предлагает три вида срочных вкладов: на 3 месяца под 27 %, на
6 месяцев под 29 % и на год под 30 %. Вкладчик положил N
у. е. на один из срочных вкладов. Какую сумму он получит по истечение
срока? - Задано расстояние в метрах. Пересчитать это расстояние в
километрах, милях, футах или ярдах на выбор пользователя ( 1 миля=1,609
километра, 1 метр=1,094 ярда, 1 метр=3,281 фута). - Дан объем в литрах. Пересчитать этот объем в пинтах, галлонах,
бушелях и квартах (английские меры объема жидких и сыпучих тел) на выбор
пользователя (1 литр=1,706 пинты, 1 литр=0,220 галлона, 1 бушель=36,35
литра, 1 кварта=1,136 литра). - Дана масса в килограммах. Пересчитать эту массу в пудах, фунтах,
центнерах или тоннах на выбор пользователя (1 пуд=16,38 кг, 1 фунт=0,409
кг, 1т=1000 кг, 1 ц=100 кг.). - Дано расстояние в метрах. Пересчитать его в верстах, саженях,
аршинах или вершках на выбор пользователя (1 верста=1,067 км, 1
сажень=2,134 м, 1 аршин=0,7112 м, 1 вершок=4,445 см.).
Контрольные вопросы.
1.
В чем отличие функций InputBox и
MsgBox?
2.
Каков смысл аргумента title?
3.
Каков смысл аргумента default?
4.
Каков смысл аргумента buttons?
5.
Каков смысл аргумента prompt?
6.
Каков смысл аргумента context?
7.
Каков смысл аргументов helpfile,context?
8.
Как получить любой формат
отображения данных?
9.
Назначение CheckBox?
10.
Назначение OptionButton?