Краткая история языка VBA

Несмотря на новизну языка Visual Basic for Applications, история его проявления почти так же стара, как и вся компьютерная промышленность. Про язык VBA можно сказать, что он является диалектом языка BASIC, который появился в начале 60-х.

Хотя по сегодняшним понятиям язык BASIC был довольно ограниченным и, как теперь говорят, варварским, он был прост для изучения и очень скоро получил широкое распространение. Версии BASIC выпускался для всех типов компьютеров. Язык GWBASIC производство компании Microsoft был одним из первых языков программирования для современных персональных компьютеров. Он поставлялся со всеми операционными системами MS DOS до 5-й версии. Ранние персональные компьютеры производства компании IBM даже имели версию BASIC, встроенную в ПЗУ.

С годами первоначальная версия BASIC была существенно доработана. Менялась технология программирования, и вместе с ней под влиянием разработчиков программного обеспечения менялся сам BASIC. Современный его диалект включает многие черты и свойства, характерные для более поздних и совершенных языков, таких как Pascal, C и C++.

В конце 80-х Microsoft выпускает существенно улучшенную версию BASIC, названную QuickBASIC во все версии MS DOS, начиная с 6-й (но не Windows 95).

После нескольких версий QuickBasic в 1992 году Microsoft выпускает Visual Basic for Windows.

Язык VBA в основном совпадает с Visual Basic for Windows, но имеет и существенное отличие. В частности, макросы VBA хранятся в файле документа того приложения, в котором вы создаете этот макрос.

Внедрив один язык макросов во все свои приложения, Microsoft гарантирует, что большая часть того, что вы выучите о VBA применительно к одному приложению, будет справедлива и для остальных.

3.3.2 Зачем изучать язык VBA.

На первый взгляд может показаться, что если вы можете записать макрос средствами программы Excel и потом воспроизвести его, то вам совсем не нужно учить язык VBA. Однако это не так. Записанный макрос не универсален, поскольку он может только повторить однажды выполненную последовательность команд, и только в том же самом порядке, в котором вы ее записали. С помощью VBA можно создать макрос, который будет проверять некоторые заданные вами условия и в зависимости от них менять последовательность или состав выполняемых команд.

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

Если вам нужно циклически повторить несколько раз некоторую последовательность команд, записанный макрос - плохой помощник. Ведь при выполнении он повторит эту последовательность ровно столько раз, сколько раз вы повторили ее при записи - по крайней мере, до тех пор, пока вы не отредактируете его или не перезапишите.

Другое дело VBA - макрос, который может проверить заданное вами условие или просто перед выполнением запросить информацию о количестве повторений и о том, нужно ли вообще выполнять то или иное действие.

Представьте себе, что вы записали макрос, который меняет ширину столбцов в листе Excel. Если вам требуется, чтобы он менял ширину всех трех столбцов вручную. Записанный макрос всегда будет менять ширину столбцов со второго по четвертый. Отредактировав записанный макрос с помощью VBA, вы добьетесь того, чтобы он спрашивал вас, сколько столбцов нужно обработать и какие именно. Вы даже сможете задать новую ширину.

Это только самый простой пример того, что вы можете делать с макросом с помощью VBA. На самом деле существует очень много обстоятельств, требующих проверки условия для принятия решения или выполнения циклических операций. И единственный способ сделать это - включить в записанный макрос операторы VBA.

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

Например, вы можете регулярно импортировать данные из базы данных в лист Excel, формировать, эти данные, строить на их основании диаграмму, а затем посылать и диаграмму, и отформатированный отчет на печать.

Для того чтобы собрать все эти, вполне независимые задания, в одно, и оформить их в виде макроса, вам понадобится записать по макросу для каждого задания - макроса для импорта данных, макрос для форматирования, макрос для построения диаграммы и для вывода на печать. Потом вы сможете запускать эти макросы на выполнение с помощью VBA в нужной последовательности.

Кроме того, с помощью VBA вы можете управлять выполнением других программ, воспользовавшись таким средством, как автоматизация, и сможете организовать обмен данными с помощью OLE.

3.3.3. Описание подпрограмм и функций, использованных в документе.

Описывая полностью язык VBA можно затратить немало времени – этому посвящены объемные тома насчитывающие не одну сотню страниц. Поэтому поступим следующим образом: ограничимся описанием подпрограмм и функций которые были написаны для реализации поставленной задачи (идеи, алгоритма программ, описания операторов использованных в процессе написания этих подпрограмм и функций. Использование стандартных средств Excel (функций включенных в стандартный набор) оказалось недостаточно для решения задачи. Было необходимо сделать, например, так чтобы был автоматизирован поиск параметров по справочным таблицам, подстановка наименований электроприемников из каталога. Это возможно было организовать с помощью программирования, определения функций которые реализовывали бы подобные задачи.

Загружая файл Метод упорядоченных диаграмм.xls, и затем загружая редактор VBA, мы увидим следующую структуру проекта VBA: два модуля в которых содержатся основные процедуры и функции. Перечислим их и укажем их назначение:

Modul1

1) ПоискNэzv поиск промежуточного значения nэ* по значениям Р1* и n1

2) ПОИСКPном1 поиск промежуточного значения Рном1 используя диапазон C7:C16 (номинальные мощности электроприемников группы А)

3) КОЭФМАКС функция поиска значения коэффициента максимума по значениям средневзвешенного коэффициента использования (ячейка Е17) и приведенного числа электроприемников (K7)

 

Это три функции определенные пользователем которые используются в документе.

Modul2

1) ПОИСКN1 – функция поиска промежуточного значения n1

2) Подст – процедура служащая для подстановки наименований электроприемников из каталога в расчетную таблицу

 

Также открывая значки объектов Лист1, Лист2, Лист3 мы увидим одинаковые процедуры вызываемые нажатием кнопки «Просчитать».

Опишем эти функции.

1) Функция ПоискNэzv поиск промежуточного значения nэ* по значениям Р1* и n1*

Идея состоит в том чтобы реализовать поиск nэ* по справочной таблице приведенной в Приложении 2.

Это можно реализовать следующим образом. Разбить таблицу на равные интервалы по Р1* и по n1*. Т. е. например (см. Приложение 2) будем считать что на интервалах 0.975<Р1* =<1 и 0<n1*.<0.0075 nэ* = 0.005, затем при 0.925<Р1* =<0.975 и 0<n1*.<0.0075 nэ* = 0.005 b и т.д. Это в принципе удовлетворяет условиям округления.

Приведем текст программы с комментариями

 

Public Function ПоискNэzv(Pzv As Double, n1zv As Double) ‘заголовок

Dim znach As Double ‘описание переменной

 

If Pzv <= 1 And Pzv > 0.975 Then ‘проверка условия

Select Case n1zv ‘работка вариантов выбора

Case 0 To 0.0075

znach = 0.005

Case 0.0075 To 0.0175

znach = 0.009

Case 0.0175 To 0.0275

znach = 0.02

Case 0.0275 To 0.0375

znach = 0.03

Case 0.0375 To 0.0475

znach = 0.04

Case 0.0475 To 0.055

znach = 0.05

Case 0.055 To 0.065

znach = 0.06

Case 0.07 To 0.09

znach = 0.08

Case 0.09 To 0.125

znach = 0.09

Case 0.125 To 0.175

znach = 0.14

Case 0.175 To 0.225

znach = 0.19

Case 0.225 To 0.275

znach = 0.24

Case 0.275 To 0.325

znach = 0.29

Case 0.325 To 0.375

znach = 0.33

Case 0.375 To 0.425

znach = 0.38

Case 0.425 To 0.475

znach = 0.43

Case 0.475 To 0.525

znach = 0.48

Case 0.525 To 0.575

znach = 0.52

Case 0.575 To 0.625

znach = 0.57

Case 0.625 To 0.675

znach = 0.62

Case 0.675 To 0.725

znach = 0.66

Case 0.725 To 0.775

znach = 0.71

Case 0.775 To 0.825

znach = 0.76

Case 0.825 To 0.875

znach = 0.8

Case 0.875 To 0.99

znach = 0.85

Case Is > 0.99

znach = 0.95

End Select

End If

 

If Pzv <= 0.975 And Pzv > 0.925 Then

Select Case n1zv

Case 0 To 0.0075

znach = 0.005

Case 0.0075 To 0.0175

znach = 0.011

Case 0.0175 To 0.0275

znach = 0.02

Case 0.0275 To 0.0375

znach = 0.03

Case 0.0375 To 0.0475

znach = 0.04

Case 0.0475 To 0.055

znach = 0.05

Case 0.055 To 0.065

znach = 0.06

Case 0.07 To 0.09

znach = 0.08

Case 0.09 To 0.125

znach = 0.1

Case 0.125 To 0.175

znach = 0.16

Case 0.175 To 0.225

znach = 0.21

Case 0.225 To 0.275

znach = 0.26

Case 0.275 To 0.325

znach = 0.32

Case 0.325 To 0.375

znach = 0.37

Case 0.375 To 0.425

znach = 0.42

Case 0.425 To 0.475

znach = 0.47

Case 0.475 To 0.525

znach = 0.53

Case 0.525 To 0.575

znach = 0.57

Case 0.575 To 0.625

znach = 0.63

Case 0.625 To 0.675

znach = 0.68

Case 0.675 To 0.725

znach = 0.73

Case 0.725 To 0.775

znach = 0.78

Case 0.775 To 0.825

znach = 0.83

Case 0.825 To 0.875

znach = 0.88

Case 0.875 To 0.99

znach = 0.92

Case Is > 0.99

znach = 1

End Select

End If

………………………

программа далее состоит из нескольких блоков которые похожи друг на друга поэтому опустим несколько таких блоков

………………………

 

If Pzv <= 0.1 And Pzv > 0.175 Then

Select Case n1zv

Case 0 To 0.0075

znach = 0.34

Case 0.0075 To 0.0175

znach = 0.52

Case 0.0175 To 0.0275

znach = 0.71

Case 0.0275 To 0.0375

znach = 0.81

Case 0.0375 To 0.0475

znach = 0.86

Case 0.0475 To 0.055

znach = 0.9

Case 0.055 To 0.065

znach = 0.92

Case 0.07 To 0.09

znach = 0.94

Case 0.09 To 0.125

znach = 0.95

Case 0.125 To 0.175

znach = 1

Case 0.175 To 0.225

znach = 1

Case 0.225 To 0.275

znach = 1

Case 0.275 To 0.325

znach = 1

Case 0.325 To 0.375

znach = 1

Case 0.375 To 0.425

znach = 1

Case 0.425 To 0.475

znach = 1

Case 0.475 To 0.525

znach = 1

Case 0.525 To 0.575

znach = 1

Case 0.575 To 0.625

znach = 1

Case 0.625 To 0.675

znach = 1

Case 0.675 To 0.725

znach = 1

Case 0.725 To 0.775

znach = 1

Case 0.775 To 0.825

znach = 1

Case 0.825 To 0.875

znach = 1

Case 0.875 To 0.99

znach = 1

Case Is > 0.99

znach = 1

End Select

End If

 

ПоискNэzv = znach ‘присвоение функции значения перемнной

End Function ‘конец функции

В программе использовались следующие операторы:

Условный оператор

If условие Then оператор

 

Например, If N>=0 and N<=9 Then Print “Ok”

 

Описание переменных

Dim имя переменной As тип переменной

 

Оператор Select Case

 

Позволяет обрабатывать несколько вариантов выбора.

 

Select Case переменная или выражение

Case оператор проверки условия

действие 1

.

.

.

Case . . . . . .

действие n-1

End Select

 

Использовался тип переменных :

DoublePrecision “#”. Числа с точностью до 16 цифр и длиной до 300 символов. Вычисления приблизительны, а скорость небольшая. Используется для научных расчетов.

 

2) КОЭФМАКС функция поиска значения коэффициента максимума по значениям средневзвешенного коэффициента использования (ячейка Е17) и приведенного числа электроприемников (K7)

 

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

 

Текст программы:

 

Public Function КОЭФМАКС(КОЭФИСП As Double, Nэ As Double)

Dim km As Double

If КОЭФИСП >= 0.1 And КОЭФИСП < 0.125 Then

Select Case Nэ

Case 4

km = 3

Case 5

km = 3.23

Case 6

km = 3.04

Case 7

km = 2.88

Case 8

km = 2.72

Case 9

km = 2.56

Case 10 To 11

km = 2.42

Case 11 To 14

km = 2.24

Case 14 To 18

km = 1.99

Case 18 To 23

km = 1.84

Case 23 To 28

km = 1.71

Case 28 To 35

km = 1.62

Case 35 To 45

km = 1.5

Case 45 To 55

km = 1.4

Case 55 To 80

km = 1.32

Case 80 To 120

km = 1.21

Case 120 To 180

km = 1.17

Case 180 To 200

km = 1.15

Case Is > 200

km = 1

End Select

End If

………………………..

………………………..

If КОЭФИСП >= 0.75 And КОЭФИСП < 0.85 Then

Select Case Nэ

Case 4

km = 1.14

Case 5

km = 1.12

Case 6

km = 1.1

Case 7

km = 1.09

Case 8

km = 1.08

Case 9

km = 1.08

Case 10 To 11

km = 1.07

Case 11 To 14

km = 1.07

Case 14 To 18

km = 1.07

Case 18 To 23

km = 1.06

Case 23 To 28

km = 1.06

Case 28 To 35

km = 1.05

Case 35 To 45

km = 1.05

Case 45 To 55

km = 1.04

Case 55 To 80

km = 1.03

Case 80 To 120

km = 1.02

Case 120 To 180

km = 1.02

Case 180 To 200

km = 1.01

Case Is > 200

km = 1

End Select

End If

 

If КОЭФИСП >= 0.85 And КОЭФИСП <= 0.9 Then

km = 1

End If

КОЭФМАКС = km

End Function

 

Используются те же операторы и типы переменных.

3) ПОИСКPном1 поиск промежуточного значения Рном1 используя диапазон C7:C16 (номинальные мощности электроприемников группы А)

 

Идея здесь состоит в реализации алгоритма нахождения Pном1 описанного в разделе 2

Мощности находятся в диапазоне C7:C16, нужно сначала найти максимальное значение, а затем сумму значений больше либо равных половине максимального

 

Текст программы

 

Public Function ПОИСКPном1(Диапазон As Range) ‘заголовок

Dim Cell As Object ‘описание переменных

Dim m As Double, N As Double

 

m = 0

N = 0

For Each Cell In Диапазон

If Cell.Value > m Then m = Cell.Value

Next Cell

For Each Cell In Диапазон

If Cell.Value >= m / 2 Then N = N + Cell.Value

Next Cell

ПОИСКPном1 = N

End Function

 

Операторы использованные в программе.

 

Для создания циклов объектного типа используется структура For Each (для каждого элемента…), которая применяется к массивам и наборам объектов. В VB такие циклы встречаются очень часто.

 

For Each элемент In набор

..........................................

Exit For

..........................................

Next элемент

 

Пременная Cell задается как объект.

 

4) ПОИСКN1 – функция поиска промежуточного значения n1

 

Эта функция реализует поиск значения n1 (см. раздел 2). Поиск этого значения вытекает из реализации предыдущей функции. Разница в том что необходимо найти сумму не мощностей больше или равных половине максимальной а сумму числа однотипных электроприемников мощности которых больше или равны половине максимальной среди номинальных мощностей. Это можно осуществить используя метод Offset.

 

Текст программы

 

Public Function ПОИСКN1(Диапазон1 As Range)

Dim Cell1 As Object, w As Double, q As Double

w = 0

q = 0

For Each Cell1 In Диапазон1

If Cell1.Value > w Then w = Cell1.Value

Next Cell1

For Each Cell1 In Диапазон1

If Cell1.Value >= w / 2 Then q = q + Cell1.Offset(0, -1).Value

Next Cell1

ПОИСКN1 = q

End Function

 

Используемые операторы

Метод Offset работает аналогично Cells, с тем отличием, что возвращаемый объект всегда задается относительно верхнего левого угла текущего объекта. Числа здесь на 1 меньше, чем в методе Cells. Метод Offset чаще всего используется для создания объекта относительно текущей активной ячейки в рабочей таблице.

4) Подст – процедура служащая для подстановки наименований электроприемников из каталога в расчетную таблицу

Наименования электроприемников заносятся в расчетную таблицу из списка находящегося на этом же листе, но подстановка параметров соответствующих наименованиям осуществляет данная процедура.

Текст процедуры.

 

Public Sub подст() ‘заголовок

Dim Cell1 As Object, Cell2 As Object ‘описание переменных

Dim Cell3 As Object, Cell4 As Object

For Each Cell1 In Range("A7:A16")

For Each Cell2 In Range("A30:A89")

If Cell1.Value = Cell2.Value Then ‘проверка равенства наименований в расчетной таблице и в списке

 
 


Cell1.Offset(0, 2).Value = Cell2.Offset(0, 1).Value

Cell1.Offset(0, 4).Value = Cell2.Offset(0, 2).Value

Cell1.Offset(0, 5).Value = Cell2.Offset(0, 3).Value

End If

Next Cell2

Next Cell1

 
 


For Each Cell3 In Range("A19:A23")

For Each Cell4 In Range("A30:A89")

If Cell3.Value = Cell4.Value Then

Cell3.Offset(0, 2).Value = Cell4.Offset(0, 1).Value

Cell3.Offset(0, 4).Value = Cell4.Offset(0, 2).Value

Cell3.Offset(0, 5).Value = Cell4.Offset(0, 3).Value

End If

Next Cell4

Next Cell3

End Sub