Добавил:
По своей натуре перфекционист. Поэтому люблю все аккуратно оформлять и упорядочивать, складывать по полочкам. Вот, не пропадать же добру, нажитому за четыре кропотливых семестра. Тут я выложил все мои ответы, курсовые, отчеты и некоторые ДЗ. Они могут вам помочь для получения зачета или сдачи экзамена. Если чего-то не нашли в папочках, то попытайте удачу в разделе НЕОТСОРТИРОВАННОЕ на моей страничке, там все 4 семестра разложены по папкам. ГРУППА КТ-43-15. Годы обучения 2015-2019. Коллекция будет пополняться. Что ж, удачки :З Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VBA (Стеценко) / VBA_ЛБ_13v2

.pdf
Скачиваний:
45
Добавлен:
15.09.2017
Размер:
1.87 Mб
Скачать

Стеценко А. А.

21

К4. Объясните свойства Index и Name членов коллекции. Какой цели служат эти свойства?

К5. Объясните метод Add коллекции Sheets.

К6. Английские слова before (впереди) и after (позади) применяются как параметры для обозначения места вставки нового листа. Напишите инструкцию, которая вставляет новый рабочий лист после k-го листа.

К7. В подпрограмме ДобавитьЛист имеется инструкция

On Error GoTo Lbl

Какую роль она выполняет?

ActiveSheet.Name = "Сегодня"

К8. Объясните назначение инструкции

Set WL = Sheets(NameNewSheet)

К9. В подпрограмме ДобавитьЛист имеется метка Lbl. Объясните её назначение.

К10. Как в подпрограмме ДобавитьЛист определяется место вставки нового листа?

К11. Составьте и объясните главную программу для испытания подпрограммы ДобавитьЛист.

К12. Объясните метод Copy. К13. Объясните метод Move. К14. Объясните метод Delete.

К15. В Excel существует понятие "очень скрытый лист". Объясните, что оно выражает.

К16. Как сделать лист очень скрытым?

К17. Как можно отобразить очень скрытый лист?

К18. Напишите и продемонстрируйте программу, которая скрывает все листы диаграмм.

К19. Напишите и продемонстрируйте программу, которая скрывает все рабочие листы, кроме первого.

К20. Какие действия будут выполнены по инструкции

If Sheets(1).Name <> "Сегодня" Then _

Sheets("Сегодня").Move before:=Sheets(1)

К21. Как узнать имя, индекс и тип активного листа?

Работа VBA4. Объекты Range и Selection

Цель работы: освоение взаимодействия программы VBA с ячейками и диапазонами ячеек рабочего листа.

Введение

Ячейки являются основой электронной таблицы. Каждой ячейке выделяется память для данного и память для формулы. Все вычисления выполняются в ячейках, исходные данные и результаты хранятся в памяти ячеек. Но электронные таблицы устроены так, что ячейки не являются объектами, и програм-

22

Программирование в среде электронных таблиц Microsoft Excel

ма не может без предварительной подготовки обратиться к ячейке по её адресу, например, D7, или имени, например, "Ставка".

Общее правило состоит в том, что сначала требуется представить ячейку объектом или членом коллекции объектов. Объект обладает свойствами, к которым может обратиться программа, чтобы узнать или изменить их значение. Такими объектами и такими коллекциями в отношении ячеек являются объекты Range и Selection. Разница между ними в способе создания. Объект Range образуется специальными программными действиями, программа может создать несколько объектов Range. Объект Selection изначально не требует никаких программных действий и представляет объект, выделенный на рабочем листе или листе диаграмм.

Объект Range

Объект Range нормально содержится в объекте Workbook или в объекте Worksheet, но может находиться в другом объекте Range. В зависимости от способа создания объект Range может представлять одну ячейку или диапазон ячеек (смежный или несмежный). Существуют четыре способа создания объек-

та Range:

свойство Range объекта Worksheet или объекта Range;

свойство Cells объекта Worksheet или объекта Range;

свойство Offset объекта Range;

метод Union объекта Application.

Свойство Range

Синтаксис:

expression.Range(Ячейка1, Ячейка2)

expression – переменная, представляющая объект Worksheet. По умолчанию подразумевается активный рабочий лист.

Ячейка1 – имя ячейки (или диапазона) или ссылка на ячейку в стиле А1. Ссылка может содержать знак доллара, но он игнорируется. Ячейка1 может содержать оператор пересечения (пробел) или оператор объединения (запятую). Ячейка1 – обязательный аргумент.

Ячейка2 – необязательный аргумент, обозначающий левый верхний или правый нижний угол диапазона. Это может быть объект Range, который содержит либо одну ячейку, либо целую строку или целый столбец, или имя отдельной ячейки.

В табл. 1 приводится несколько простых примеров синтаксиса свойства Range. Отметим, что синтаксис позволяет строить причудливые схемы выделения ячеек в объект Range, но не стоит увлекаться сложными построениями.

 

Таблица 1

 

Примеры создания объекта Range

Код

Объект Range представляет

Range("A1")

ячейку A1

Стеценко А. А.

23

Range("B4, D7")

Range("E4:G7")

Range("H5","J8")

Range("F14:G17", "К4:М8")

Range("b14:c16", "d2:f5")

Range("Группа")

Range(var)

ячейки B4 и D7 (две ячейки) диапазон E4:G7

диапазон H5: J8

несмежный диапазон F14: G17, К4:М8 смежный диапазон B2:F16 именованный диапазон "Группа" именованный диапазон, имя которого находится в переменной var типа String

Примеры использования объекта Range:

а) записать текст "Наименование" в ячейку В4 активного листа:

Range("В4").Value = "Страна"

б) переменной var присвоить значение ячейки С5 активного листа:

var = Range("C5").Value

в) очистить содержимое несмежного диапазона (H14:I17, J7:K11) на первом рабочем листе:

Worksheets(1).Range("h14:i17,j7:k11").ClearContents

г) объектной переменной Diap присвоить соответствие именованному диапазону "Группа":

set Diap = Range("Группа")

Применительно к ячейке возможен другой синтаксис, использующий квадратные скобки:

[В4].Formula = "=Rand()" var = [С5]

Свойства объекта Range

На момент написания настоящих указаний объект Range имеет 96 свойств и 89 методов; с ними можно ознакомиться на сайте Microsoft1.

Некоторые свойства объекта Range понятны без подробных пояснений.

Свойство Value, значение, используется наиболее часто, поэтому предполагается по умолчанию. Сколько бы ни было ячеек в диапазоне Range, им всем сразу можно присвоить одно значение:

Range("A3:F208").Value = "=Pi()"

или, что то же

Range("A3:F208") = "=Pi()"

или, что то же

[A3:F207] = "=Pi()"

Свойства Row и Column – это координаты левой верхней ячейки объекта.

1 http://msdn.microsoft.com/en-us/library/office/ff838238.aspx

24

Программирование в среде электронных таблиц Microsoft Excel

Свойства Rows и Columns – это коллекции строк и столбцов в объекте Range. Коллекции Rows и Columns имеют свойство Count, определяющее количество строк и столбцов в соответствующей коллекции.

Свойство Count объекта Range выражает количество ячеек. Count – это

целое

число типа Long, максимальное значение этого числа равно

231 -1 =

2 147 483 647. Рабочий лист Excel 2007 и более поздних версий имеет 1

048 576

строк

и 16 384 столбца. Всего

в рабочем листе 2 147 483 647 16 384 =

17 179

869 184 ячейки. Поскольку

Count не может выразить число ячеек, когда

выделен весь лист, в Excel 2007 появилось свойство CountLarge, которое использует тип данных Double с максимальным значением 1,79 10308. Если применение свойства Count порождает ошибку, нужно воспользоваться свойством

CountLarge.

Свойство Area и коллекция Areas определяют отдельный смежный диапазон и коллекцию смежных диапазонов в составе объекта Range.

Свойство Name, обязательное для всех объектов, имеют и объекты Range, но объекты Range остаются, как правило, безымянными. Связано это с тем, что объекты Range создаются "на лету" для доступа к тем или иным ячейкам, и "забываются", когда операции с ячейкой закончены.

Объект Selection

Объект Selection – это объект, выделенный в окне Excel на активном листе до запуска программы. Это может быть ячейка или диапазон ячеек на рабочем листе, это может быть диаграмма или часть диаграммы, например, область построения или ряд данных на диаграмме. Для образования объекта Selection не требуется предварительных программных действий, программа может работать только с одним объектом Selection, хотя программа может заменить один объект Selection другим. Программа может узнать тип объекта Selection, используя метод TypeName.

Программа tstSelectionType (листинг 9) выводит в окно Immediate имя типа объекта Selection и, если объект существует, то имя листа (свойство Parent), в котором выделен объект. Если курсорная рамка стоит на одной из ячеек листа "Секрет", то программа tstSelectionType выдаст

Range Секрет

Листинг 9

Sub tstSelectionType ()

'09.07.13.

Debug.Print TypeName(Selection),

If TypeName(Selection) <> "Nothing" Then _

Debug.Print Selection.Parent.Name

End Sub

Если активным является лист диаграмм, в котором ничто не выделено, то программа tstSelectionType выдаст Nothing, т.е. нет выделенного объекта.

Стеценко А. А.

25

Программа, работающая с объектом Selection, должна предварительно проверить тип объекта Selection. Пример начальной части такой программы приведён в листинге 10.

Листинг 10

Sub InputSelection () Dim Buffer

If TypeName(Selection) <> "Range" Then

MsgBox "Необходимо выделить диапазон ввода"

Exit Sub End If

Buffer = Selection.Value

. . .

End Sub

Если объект Selection не является объектом Range, программа InputSelection (листинг 10) выдаёт предупреждающее сообщение и завершает работу. Иначе значения ячеек выделенного диапазона пересылаются в переменную

Buffer.

Может вызвать недоумение инструкция

Buffer = Selection.Value

Сколько значений может принять переменная Buffer, объявленная как простая переменная без указания типа? Здесь действует несколько правил "по умолчанию". Если тип переменной не указан, то подразумевается обобщённый тип Variant. Переменная типа Variant превращается в массив типа Variant таких размеров и такой размерности, чтобы принять все данные диапазона. Если объект Selection представляет диапазон A1:H128, то переменная Buffer превращается в двумерный массив Buffer(1 To 8, 1 To 128). Хотя по умолчанию индексы массивов отсчитываются с 0, массив Buffer представляет математическую копию диапазона. А как индексы отсчитываются в матрице или в векторе? С 1!

Пусть Selection представляет диапазон, выделенный в одном столбце или в одной строке. Что тогда будет представлять массив Buffer? Сохраняется полная аналогия: Buffer будет двумерным массивом из одного столбца или из одной строки. Уточним сказанное на примере.

Пример. На активном рабочем листе выделен диапазон В3:В122, содержащий числовые данные, после чего запускается программа InputSelection. Нужно найти сумму элементов.

Решение. В программу InputSelection добавляем строки:

Dim Sum As Double, p As Integer

Sum = 0

For p = 1 To UBound(Buffer, 1)

Sum = Sum + Buffer(p, 1)

Next p

Обратите внимание на UBound(Buffer, 1) и Buffer(p, 1): мас-

сив Buffer – двумерный. Если написать Buffer(p), то будет генерироваться

26

Программирование в среде электронных таблиц Microsoft Excel

ошибка индексации, потому что при обращении к элементу двумерного массива нужно указывать два индекса.

Метод Select создаёт объект Selection, если применяется к объекту Range:

Range("F5:G215").Select

Selection.Font.Bold = True

Объект Selection, если он относится к ячейкам рабочего листа, в любой момент можно представить объектом Range:

Dim RngA As Range

Set RngA = Selection

Рабочее задание

Р1. Откройте свою книгу, прочтите ещё раз приветствие, которое Вы сделали в работе VBA2.

Р2. Подготовьте программу, которая:

а) создаёт объект Range из диапазона В4:В23 на листе "Секрет"; б) присваивает диапазону имя "Выработка";

в) используя свойство Value (или Formula), вводит в ячейки диапазона формулу "=Int(Rand()*100)"; формулу предварительно запишите в строковую переменную. Сверьте свою программу с программой Rnd (листинг 11).

Согласуйте текст программы с преподавателем.

Листинг 11

Sub Rnd()

'Заполнение диапазона случайными числами

Dim Rng As Range

Dim Frml As String

Frml = "=Int(Rand()*100)"

Set Rng = Worksheets("Секрет").Range("b4:b23")

Rng.Value = Frml

End Sub

Р3. Войдите в среду VBA, вставьте модуль "ОбъектRange" и наберите в нём созданную программу.

Р4. Выполните подготовленную программу. Посмотрите результат на рабочем листе. Обратите внимание: формула в ячейках отличается от формулы, заданной в программе. Excel перевёл английские имена функций в русифицированные аналоги.

Список функций Excel можно найти на сайте Microsoft: Excel 2003:

http://office.microsoft.com/en-us/excel-help/excel-functions-by- category-HP005204211.aspx

Стеценко А. А.

27

Excel 2010:

 

 

 

 

http://office.microsoft.com/en-us/excel-help/excel-functions-by-

 

 

category-HP010079186.aspx

 

 

 

 

 

Р5. Оставьте лист "Секрет" активным и запишите макрос СпецВставка по следующему сценарию:

а) выделить диапазон B4:B23;

б) выполнить копирование значений из диапазона B4:B23 в диапазон С4:С23 с помощью правой клавиши мыши (выделите заданный диапазон, удерживая нажатой правую клавиши мыши, сдвиньте выделенный диапазон вправо на один столбец, отпустите правую клавишу мыши и из контекстного меню выберите "Копировать только значения").

Р6. На основе макроса СпецВставка подготовьте программу, которая из одного диапазона копирует в другой только значения. Сравните свою программу с программой ВставкаЗначений (листинг 12).

Листинг 12

Sub ВставкаЗначений()

'30.06.13.

Dim Rng1 As Range, Rng2 As Range

Set Rng1 = Worksheets("Секрет").Range("B4:B23") Set Rng2 = Worksheets("Секрет").Range("d4") Rng1.Copy

Rng2.PasteSpecial Paste:=xlPasteValues

End Sub

Р7. Выполните подготовленную программу. Проверьте результат на рабочем листе, покажите программу и результат преподавателю.

Р8. Проанализируйте программу tstSelection (листинг 9) и составьте на её основе программу, которая выводит в окно Immediate количество смежных диапазонов (областей) в зоне выделения и для каждой области

координаты начала области;

количество строк, столбцов и ячеек.

Согласуйте текст программы с преподавателем.

Р9. Вставьте в свой проект VBA новый модуль, дайте ему подходящее имя и наберите в нём подготовленную программу. Проверьте программу на от-

сутствие ошибок (команда Debug | Compile VBAProject).

Р10. На каком-либо рабочем листе выделите несмежный диапазон (из двух-трёх областей) и запустите подготовленную программу на выполнение. Проверьте, совпадает ли выдача программы с действительностью.

Покажите результат преподавателю. Сохраните книгу.

28

Программирование в среде электронных таблиц Microsoft Excel

Контрольные вопросы к работе VBA4

К1. Объясните назначение объекта Range.

К2. Объясните синтаксис свойства Range. Приведите примеры.

К3. Объясните, как сделать объект Range, представляющий несмежный диапазон. Приведите примеры.

К4. Объясните свойство Value объекта Range. Приведите примеры использования свойства Value для чтения и для записи.

К5. Объясните свойства Row и Column объекта Range. Может ли программа изменить эти свойства?

К6. Объект Range может размещаться в объекте WorkSheet или в другом объекте Range. Объясните разницу между двумя вариантами объекта Range.

К7. Объясните, как организовать просмотр всех ячеек объекта Range.

К8. Объясните свойства Area и Areas. Когда возникает необходимость их использования?

К9. Объясните разницу между объектами Range и Selection. К10. Сколько объектов Range может быть в одной программе?

К11. Сколько объектов Selection может быть в одной программе? К12. Может ли программа изменить объект Selection? Докажите.

Работа VBA5. Свойства Cells и Offset, метод Union

Цель работы: приобретение навыков использования в программе свойств Cells и Offset и метода Union, закрепление навыков работы со свойством Range.

Введение

Свойство Cells может использоваться в объектах Worksheet и Range. Основной синтаксис свойства Cells в объекте Worksheet использует два аргумента:

Cells(r, c)

r и c – номера строки и столбца ячейки, которую представляет создаваемый объект Range. В следующем примере переменной var присваивается значение ячейки С5 активного листа:

var = Cells(5, 3).Value

Номер столбца можно указывать строковой константой:

var = Cells(5, "С").Value

Применительно к объекту Range свойство Cells чаще используется с одним аргументом или без аргументов. Пусть, например, объектная переменная Diap представляет именованный диапазон "Группа". Тогда:

Diap.Cells(k)

представляет k-ю ячейку диапазона "Группа". Ячейки отсчитываются построчно от левого верхнего угла диапазона, причём первая ячейка имеет номер 1.

Стеценко А. А.

29

Предположим, что в именованном диапазоне "Фиалка" содержится комплектация на изделие "Фиалка": в первом столбце диапазона записаны марки комплектующих, во втором столбце – количества на одно изделие. Требуется внести значение 17 в столбец 2 строки 3 диапазона "Фиалка". Решение:

k=6

Range("Фиалка").Cells(k) = 17

Здесь опущено свойство Value, т.к. оно подразумевается по умолчанию.

Синтаксис с одним аргументом опасен тем, что Visual Basic не контролирует выход аргумента за пределы диапазона. Если в предыдущем примере диапазон "Фиалка" содержит 50 строк, т.е. в диапазоне всего 100 ячеек, а переменная k примет значение 200, то никакой ошибки зафиксировано не будет и значение 17 попадёт в ячейку, в которой должно храниться совсем другое данное.

Синтаксис Cells без аргументов используется, когда нужно сослаться на все ячейки диапазона. В следующей инструкции свойство Cells ссылается на все ячейки диапазона "Фиалка":

Range("Фиалка").Cells

Синтаксис без аргументов обычно используется в тех случаях, когда программа должна просмотреть все ячейки диапазона. В следующем фрагменте подсчитывается количество ячеек с числовыми данными в диапазоне "Фиалка":

Dim cel As Range

Dim Cnt As Integer, k As Integer

Cnt = 0

For Each cel In Range("Фиалка").Cells

If IsNumeric(cel.Value) Then Cnt = Cnt + 1

Next cel

Здесь IsNumeric функция VBA, которая принимает значение True, если её аргументом является число. Цикл For Each…Next заставляет объектную переменную cel "пробегать" по всем ячейкам, входящим в коллекцию

Range("Фиалка").Cells.

С помощью свойства Cells можно задать границы диапазона для свойства Range. В следующем примере в диапазон ячеек А4:В23 на листе "Secret" записывается функция Pi (функция ПИ в русскоязычных версиях Excel), возвращающая число :

Dim Rng1 As Range

Set Rng1 = Worksheets("Secret").Range(Cells(4, 1), _

Cells(23, 2))

Rng1.Value = "=Pi()"

Казалось бы, проще определить объект Rng1 как

Set Rng1 = Worksheets("Secret").Range("А4:В23")

Однако возможны случаи, когда номер строки и/или номер столбца заранее неизвестны (свойство End рассматривается в работе VBA6).

30

Программирование в среде электронных таблиц Microsoft Excel

Свойство Offset применяется только к объекту Range и имеет единственный синтаксис:

expression.Offset(ro,co)

expression определяет объект Range.

ro и co – сдвиги по строке и столбцу относительно верхней левой ячейки объекта Range. Значения сдвигов ro и co могут быть положительными, отрицательными и нулевыми.

Существенная особенность свойства Offset: оно представляет объект Range, подобный исходному, но смещённый на заданные значения ro по строкам и co по столбцам. Если, например, объект Rng1 определён как

Set Rng1 = Range("A3:F3")

то объект

Rng1.Offset(1,0)

ссылается на диапазон A4:F4, сдвинутый относительно исходного на одну строку вниз (и 0 столбцов вправо).

Программа Зебра (листинг 13) раскрашивает зеброй предварительно выделенный диапазон Selection. Свойство Offset используется для ссылки на очередную закрашиваемую строку выделенного диапазона.

Листинг 13 Демонстрация применения свойства Offset

Sub Зебра()

'Раскраска диапазона зеброй

'24.06.13.

Dim RngA As Range, rRow As Range

Dim C1 As Long, C2 As Long

Set RngA = Selection

C1 = RngA.Column

C2 = RngA.Column + RngA.Columns.Count - 1

Set rRow = Range(Cells(RngA.Row, C1), _

Cells(RngA.Row, C2))

Do While rRow.Row < RngA.Row + RngA.Rows.Count

rRow.Interior.Color = RGB(200, 250, 150)

Set rRow = rRow.Offset(2, 0)

Loop

End Sub

Метод Union объединяет объекты Range, заданные аргументами, в один объект. В программе tstUnion (листинг 14) создаются объекты Rng1, Rng2 и Rng3 типа Range, затем они объединяются в один объект bigRng. Во все ячейки объекта bigRng вводится формула, возвращающая число . Метод Union может иметь не более 30 аргументов.

Листинг 14

Sub tstUnion()

Dim Rng1 As Range, Rng2 As Range, Rng3 As Range Dim bigRng As Range

Соседние файлы в папке VBA (Стеценко)
  • #
    15.09.201752.92 Кб19SergeevA.xlsm
  • #
    15.09.20171.87 Mб45VBA_ЛБ_13v2.pdf
  • #
    15.09.2017799 б16ВосГазСорт.dat
  • #
    15.09.2017799 б16ВоспламГаз.dat
  • #
    15.09.201724.18 Кб18ВосплГаз.xlsm