Первые шаги

http://www.firststeps.ru/

Всё для начинающих программистов. На сайте вы найдёте информацию по следующим темам:

  • TASM
  • Html&WEB
  • PHP
  • VRML
  • Java
  • CGI
  • Perl
  • Linux
  • Visual C++
  • Справка WinAPI
  • Visual Basic
  • Visual FoxPro
  • C Sharp & .NET
  • C++ Builder
  • VBA by Step
  • 1C
  • GIS
  • SQL by Step
  • Алгоритмы
  • Безопасность
  • Протоколы
  • MS Office


Авторы сайта

artem.jpg (17465 b)

Каев Артем Геннадьевич (E-mail)

Родился: 13 октября 1972 года.

Московский геологоразведочный техникум. Московская Государственная Геологоразведочная Академия (бывший MГРИ), горный инженер геолог, специализация геоинформатика, математические методы в геологии. В 1996 - 1997 служба в армии. Одиннадцатая отдельная воздушно-десантная бригада. г.Улан-Удэ.

Специализированное обучение: разработка приложений - VC++, геоинформационные системы - ArcInfo.

Верхне-Индигирская геологоразведочная экспедиция, руководитель ВЦ.

С 1 января 2002 года, начальник ГИЦ Верне-Индигирской экспедиции

Увлечений практически нет. Работа и сайт - Первые шаги.

dron.jpg (12417 b)

Кузин Андрей Владимирович (E-mail)

Родился: 9 апреля 1980 года.

Московский Институт Электронной Техники - МИЭТ. Специализация - "Организация и технология защиты информации". Защитил диплом на отлично 7 июня 2002 года, тема "Контроллер защищенного канала передачи данных в сети Ethernet".

Вебмастер сайта "Первые Шаги". Системный администратор сети МЖК "Зеленоград".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 1 - Первый макрос

Шаг 1 - Первый макрос

Создаются макросы в меню Сервис - Макрос - Макросы (Alt-F8):

1_1.gif (5659 b)

Появится табличка "макросы". В поле имя введите "MY", а место нахождения в поле "Находится" выберите - "Это книга". Кнопка "Создать" станет активной нажмите её. Появится редактор VBA введите код, как на рисунке ниже.

1_2.gif (7227 b)

Здесь используется функция MsgBox, которая выводит на экран окно сообщения. Закройте редактор VBA файл - закрыть.

Дальше мы привяжем макрос к кнопке. Для этого создадим свою панель Инструментов. Вид - панели инструментов - Настройка. Нажмите создать и у Вас появится панель инструметнов настраиваемая 1. Теперь перейдем к вкладке команды в категории выбираем макросы. Хватаем веселую желтую рожицу и тащим на панель.

1_3.gif (7264 b)

Теперь на рожице нажимаем правой кнопкой мыши и выбираем пункт меню "назначить макрос". Выбираем наш макрос. Нажимаем Ok и закрываем окно настройки. Теперь можно испытать. Нажмите кнопку, макрос выполняется и появляется надпись.

Классно, работает.

Следующий Шаг
Автор Каев Артем.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 2 - Объектная модель Excel

Шаг 2 - Объектная модель Excel

Мы будем изменять наш макрос, зайдите в пункт меню "макросы", выберите наш и скажите "изменить":

Sub Test()
    Dim book As String
    Dim sheet As String
    Dim addr As String
    addr = "C"
    book = Application.ActiveWorkbook.Name
    sheet = Application.ActiveSheet.Name

    Workbooks(book).Activate
    Worksheets(sheet).Activate

    Range("A1") = book
    Range("B1") = sheet

    Dim xList As Integer
    xList = Application.Sheets.Count
    For x = 1 To xList
        Dim s As String
        s = addr + LTrim(Str(x))
        Range(s) = x
    Next x
End Sub

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

Application
    Workbook
    ........
        Worksheets
        ......
            Cell
            .....

То есть главный обьект - приложение. В приложении могут быть несколько книг ( Workbook ), внутри которых находятся листы ( Worksheets ) и листы разбиты на ячейки ( Cell ). При работе активными могут быть только одна книга и один лист. Вот я своим макросом и пытаюсь это выяснить. А заодно сколько листов в текущей книге.

DIM - обьявляет переменную с типом string. Используя обьект Application, мы получаем имена текущих книг и листа. С помощью Range("...") можно выделить ячейку и поместить значения в неё или считать. Вообщем обьекты имеют огромное количество свойств. Задача программиста на VBA знать эти свойства и методы. Ну я думаю мысль этого шага понятна :-))

Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 3 - Коллекции в VBA

Шаг 3 - Коллекции в VBA

В любом языке программирования массивы (коллекции) занимают большое место. При этом именно понятие коллекция принимает широкое распространение. В Visual C++ понятие коллекция аналогична шаблону. При программировании на VBA понятие коллекции приобретает большой смысл. Коллекции встречаются на каждом шагу.

Обычно колекции имеют 4 метода:

Add
Remove
Count
Item

Было бы наверно логично подумать, что в MS OFFICE есть специализированный класс колекций, на подобии шаблонов в С++. Но это не так. Для каждого типа объектов объявляется своя коллекция. Так же есть некоторые коллекции, которые отличаются названием методов. Всё это немного странно, но что сделаешь :-)

Для понимания работы с коллекциями создадим имитирующий коллекцию книг в Excel:

Sub Test()
    Dim MyCollection As New Collection
    With MyCollection
        .Add ("Книга 1")
        .Add ("Книга 2")
        .Add ("Книга 3")
        MsgBox (Str(.Count))
        MsgBox (.Item(1))
        .Remove (1)
        MsgBox (.Item(1))
    End With
End Sub

Первой строкой мы создаем переменную типа коллекция. Дальше мы используем оператор With, чтобы не использовать многократно MyCollection и тем самым сократить код. Методом Add мы добавляем данные в коллекцию. Count возвращает Вам количество элементов в коллекции. Item возвращает элемент коллекции, а Remove удаляет по индексу.

Метод Remove опасен тем, что он может выйти за пределы массива и вы получите подобную ошибку.

3_1.gif (2753 b)

Обработку ошибок мы расмотрим позже.

Заканчивая краткое описание коллекций следует отметить, что они могут содержать и элементы разных типов, что отличает их от массивов. Размер коллекции динамически изменяется. При удалении дырок не обнаруживается. Лафа вообще после C++ :-))


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 4 - Коллекция Workbooks в Excel

Шаг 4 - Коллекция Workbooks в Excel

Итак, в Excel самую верхушку составляет объект Application. Это объект приложение. И этот объект содержит ряд коллекций. Первая коллекция это коллекция рабочих книг Workbook. Вот как это выглядит на экране (визуализуется). То что есть внизу на экране и есть отображение коллекции книг.

4_1.gif (2742 b)

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

Первая коллекция это коллекция книг. Первое, что нужно узнать это сколько книг отрыто. Вот как это сделать.

Sub Test()
    MsgBox (Str(Application.Workbooks.Count))
End Sub

Функция Str переводит число в строку. Метод Count Вам исвестен. Он возвращает количество элементов коллекций. Как и на рисунке сверху у меня две книги, о чем и сообщит мне окно сообщения.

Данная коллекция обладает некоторой спецификой. Это связанно с тем, что книги могут храниться в файлах. Поэтому при работе с этой коллекцией предусмотрено две функции добавления Add и Open:

Add(template)

Добавляется книга на основе некоторого шаблона. Шаблоном может выступать, как настояший шаблон с расширением xlt, так и просто файл xls. Смотрим пример:

Sub Test()
    Application.Workbooks.Add ("Книга")
End Sub

Откуда я взял имя шаблона Книга? Вот смотрите сами.

4_2.gif (2192 b)

А здесь как он оказался. Молодцы !!! Честное слово. Это важный вопрос. Сначала, что такое шаблон. Шаблон это специальная рабочая книга, образец для создания документов. Тип файлов шаблонов xlt, то есть такое расширения носят шаблоны. Что задается в шаблоне ?

  • Форматы ячеек
  • Пользовательсякие меню, макросы и панели инструментов
  • номера и типы листов
  • стили строк и колонок
  • текст, даты формулы . можно некторые константы и графика.

Когда на основе шаблона создается документ , это просто копия шаблона, полная копия. Имея созданную книгу её можно сохранить как шаблон. Для этого используйте пункт меню "Сохранить как тип шаблона". Конечно шаблоны хранятся в некоторой папке, путь к ней указан в реестре:

HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Common\FileNew\Local Templates

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

Следующий метод Open, у которого куча параметров. Но единственный важный это имя файла, остальные можно опустить.

Sub Test()
    Application.Workbooks.Open ("c:\1\My.xls")
End Sub

Приведу я параметры на всякий случай:

expression.Open(FileName, UpdateLinks, ReadOnly, Format,
    Password, WriteResPassword, IgnoreReadOnlyRecommended,
    Origin, Delimiter, Editable, Notify, Converter, AddToMRU)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 5 - Далее про Workbooks в Excel

Шаг 5 - Далее про Workbooks в Excel

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

Sub Test()
    Application.Workbooks.Item(1).Close
End Sub

В таком варианте закроются все книги:

Sub Test()
    Application.Workbooks.Close
End Sub

Функция Close имеет ряд необязательных параметров. Вот они.

expression.Close(SaveChanges, FileName, RouteWorkbook)

Первый параметр SaveChanges типа BOOL, если установить TRUE сделанные изменения сохранятся, в противном случае нет. Если параметр упускается, то при закрытии появляется диалоговое окно с вопросом о необходимости сохранения.

5_1.gif (2033 b)

Следующий параметр FileName необходим, когда идет вопрос о закрытии книги не связанной еще с именем файла. Последний параметр связан с одновременной работой над книгой. Он типа BOOL.

Получить доступ к книгам в коллекции можно используя метод Item():

Sub Test()
    MsgBox (Application.Workbooks.Item(1).Name)
    MsgBox (Application.Workbooks.Item("Test.xls").FullName)
End Sub

Как видите, доступ можно получить по индексации и по имени книги, следует знать, что имя книги это имя файла, в котором он хранится. Получив доступ по индексу в первой строке я узнал имя. А во второй по имени получил доступ к свойствам обьекта WorkBook и получил полное имя, название файла и путь, который и вывел на экран в виде сообшения.

Еще одно свойство - это создатель книги, и называется он Creator

Sub Test()
    If (Application.Workbooks.Creator = &H5843454C) Then
        MsgBox "Excel Creator"
    Else
        MsgBox "Not Excel Creator"
    End If
End Sub

С помощью Parent можно получить доступ к старшему объекту коллекции при выполнении кода изложенного ниже, появится MS Excel, ну а Вы что подумали ? :-)

Sub Test()
    MsgBox (Application.Workbooks.Parent.Name)
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 6 - Имена ячеек и адресация в Excel

Шаг 6 - Имена ячеек и адресация в Excel

Раз мы че-то задумали программировать нужно разобраться с тем, как Excel производит адресацию ячеек и как можно им давать имена. По умолчанию используется стиль A1. Это когда по строкам используется алфавит, а по горизонтали цифры. Например D10 это десятая строка в колонке D. Есть и стиль называемый R1C1, который наиболее полезен при вычислении позиции строки и столбца в макросах, а также при отображении относительных ссылок. В стиле R1C1, после буквы "R" указывается номер строки ячейки, после буквы "C" номер столбца.

Стиль А1:

6_1.gif (1327 b)

Стиль R1C1:

6_2.gif (1464 b)

При работе стили переключаются в меню Сервис -> Параметры -> Общие -> Стиль ссылок, при реальном программировании наиболее удобно пользоваться не этими стилями, а именами ячеек. Тогда работа с вашей ячейкой похожа на роботу с обычной переменной. Что многим более привычно и удобно. Например для констант или полей форм.

Для того, чтобы дать имя ячейке наведите на неё курсор. Выберите меню Вставка -> Имя -> Присвоить. Появится диалоговое окно, куда надо ввести имя и нажать кнопочку OK.

6_3.gif (3380 b)

После присваивания имени вы введите число в эту ячейку, а в другой создайте формулу:

=MyName+10

Данная запись намного информативнее, кроме того вы можете не заботиться о местоположении имени в таблице , можете менять его местоположение не заботясь о том, что Ваши формулы будут изменены. А особенно это важно при программировании. Эта мелочь позволит избежать Вам сложной адресации и отслеживания данных.

Узнать все имена можно здесь:

6_4.gif (3062 b)

И здесь так же можно быстро переместиться к ячейке с заданным именем. Выберите её из списка и где бы она не находилась Вы окажетесь там :-)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 7 - Запись макросов и что это дает

Шаг 7 - Запись макросов и что это дает

Попробуем записать макрос. Для этого выбираем пункт меню Сервис -> Макрос -> Начать запись, в ответ на это Вы получите следующее диалоговое окно.

7_1.gif (3070 b)

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

7_2.gif (934 b)

А теперь выполните следующие действия. Создайте новую книгу, введите два числа в колонку, примените автосуммирование , сохраните книгу. После чего остановите запись макроса нажав на эту квадратную синюю кнопку. Зайдите в меню Сервис -> Макрос -> Максросы, у вас в диалоговом окне появится название вашего макроса. Выделите его мышкой и нажмите Изменить. Должен появиться такой код:

Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 31.10.99 (Admin)
'
'
    Application.WindowState = xlMinimized
    Application.WindowState = xlNormal
    Workbooks.Add
    ActiveCell.FormulaR1C1 = "12"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "23"
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
    Range("A4").Select
    ChDir "C:\WINDOWS\Рабочий стол"
    ActiveWorkbook.SaveAs FileName:="C:\WINDOWS\Рабочий стол\Книга2.xls", _
        FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
End Sub

Да Вы не ошиблись это код VBA. Этот код ваших операций. Конечно здесь нет циклов и массивов. Но здесь есть решение задачи. Если вы знаете как сделать в ручную, но не знаете как запрограммировать, запишите макрос, добавьте функциональность за счет выбора и циклов, продумайте адресацию. Но общая стратегия у Вас есть. Кроме того, если вы хотите запрограммировать, например, открытие файла DBF в Excel, то чего гадать с параметрами. Запишите макрос и посмотрите.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 8 - Коллекция Sheets

Шаг 8 - Коллекция Sheets

Данная коллекция представляет собой коллекцию листов (Sheets) в книге (WorkBook). Первое, что мы с Вами сделаем это получим количество листов в книге.

Sub Test()
    MsgBox (Str(Application.Workbooks.Item("Test.xls").Sheets.Count))
End Sub

Но под листом понимается не только клетки, но и диаграмма. Так же как и лист для расчетов диаграмма будет включена в подсчет листов. Как посмотреть имена листов. Просто. Есть свойтсво Name:

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        For x = 1 To .Sheets.Count
            MsgBox (Sheets.Item(x).Name)
        Next x
    End With
End Sub

А как же лист с формулами отличить от диаграммы ? Попробуйте так. Type вернет Вам тип. Только не знаю документированный способ это или нет.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        For x = 1 To .Sheets.Count
            MsgBox (Sheets.Item(x).Type)
            If Sheets.Item(x).Type = 3 Then
                MsgBox Sheets.Item(x).Name
        Next x
    End With
End Sub

К коллекции листов есть возможность добавлять свои листы, для этого существует метод Add. Этот метод требует 4 параметра Add(Before, After, Count, Type). Все эти параметры необязательные. Первые два отвечают за место вставки листа. Дальше количество вставляемых листов Count и тип листа. Типы могут быть, например, такие. xlWorkSheet для расчетного листа, xlChart для диаграммы. Если местоположение не указывать, то лист будет вставляться относительно текущего листа.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Sheets.Add
    End With
End Sub

Метод Parent позволяет узнать какой книге принадлежит текущий лист.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        MsgBox (Sheets.Parent.Name)
    End With
End Sub

Если у Вас есть желание, то некоторые листы можно убрать из обзора. Это бывает полезно, если у Вас есть константы или расчеты, которые Вы не хотите чтобы видели на экране в виде листов. Для этого можно использовать метод Visible. Устанавливая это свойство в TRUE или FALSE вы сможете убирать и показывать лист.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
    .Sheets.Item("Лист5").Visible = False
    End With
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 9 - Еще о Sheets

Шаг 9 - Еще о Sheets

Один из полезный методов это метод Copy. Он позволяет создавать новый лист на основе существующего, то есть использовать лист как шаблон для других листов. Переименуйте любой лист в имя Test. Это можно сделать нажав правую кнопку мыши на названии листа и выбрав пункт меню Переименовать. Создайте на листе любое форматирование. after это лист, после которого произойдет вставка.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Sheets("Test").Copy , after:=Sheets("Лист3")
    End With
End Sub

У метода Copy есть особенность. Если не указывать параметры, то будет создана новая книга с копируемым листом.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Sheets("Test").Copy
    End With
End Sub

При необходимости передвинуть лист есть метод Move:

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Sheets("Test").Move , after:=Sheets("Лист3")
    End With
End Sub

Так как коллекция эта содержит обьекты листа у неё есть несколько полезных методов. Один из них PrintPreview позволяющий вызывать предварительный просмотр.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Sheets("Test").PrintPreview
    End With
End Sub

Программным путем можно и выделять листы. Это метод Select. У него один параметр типа BOOL, если он установлен в TRUE, то происходит выделения листа, а если FALSE, то выделение объединяющее. Выделите другой лист и запустите следующий макрос.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Sheets("Test").Select (False)
    End With
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 10 - Использование Range

Шаг 10 - Использование Range

Мы с вами будем использовать это свойтсво для выделения ячеек. Но прежде давайте просто посмотрим, как вообще можно их выделять. Конечно, если вы установите курсор на любую ячейку это то же выделение. Вы можете вводить в неё формулы или числа, менять формат. Выделить можно и несколько ячеек. Если установить курсор в одну ячейку и не отпуская левую кноку мыши тащить, то выделится целый диапазон. Так же можно выделять отдельные ячейки, как на рисунке ниже.

10_1.gif (5774 b)

Реализуется это довольно просто. Выделяете первую ячейку, держите клавишу Ctrl и не отпуская её другие ячейки. С выделенными диапазовами можно проводить большое количество операций. Вот для программной реализации этих возможностей и служит свойтсво Range. Оно есть у очень многих обьектов Excel.

Этот пример показывает как выделить ячейку и поместить туда число.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Worksheets("Лист2").Activate
        Range("A2") = 2
        Range("A3") = 3
    End With
End Sub

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

С помощью этого метода можно помещать и формулы:

......
Range("A4") = "=A2+A3"
......

Можно указать и целый диапазон:

......
Range("A2:A5") = 2
......

Если вам захочется наоборот получить из ячейкм формулу или значение, то Вам ни кто не мешает сделать вот так:

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Worksheets("Лист2").Activate
        Range("A2") = 2
        Range("A3") = "=A2+2"
        MsgBox Range("A3").Formula + "  - " + Str(Range("A3").Value)
    End With
End Sub

Следующий пример очень важен, он показывает возможности абсолютной и относительной адресации. Мы создаем обьект типа Range, а на основе его производим адресацию. В следующем примере число поместится не в A1, а в D3. То есть у нас есть возможность выделять диапазон по абсолютному адресу, а внутри его использовать относительную адресацию.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Worksheets("Лист2").Activate
        Dim HelloRange As Range
        Set HelloRange = Range("D3:D10")
        HelloRange.Range("A1") = 3
    End With
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 11 - Дальше о Range

Шаг 11 - Дальше о Range

Разговаривая о выделении ячеек с помощью Range мы с Вами должны знать, что возвращает этот метод множество. Это множество может состоять из одной или нескольких ячеек. А если множество, то информатика говорит о необходимости иметь возможность их объединения.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Worksheets("Лист2").Activate
        Dim HelloRange As Range
        Set HelloRange = Range("D3:D10, A3:A10 , F3")
        HelloRange.Select
    End With
End Sub

А вот результат работы этого кода.

11_1.gif (7200 b)

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

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Worksheets("Лист2").Activate
        Dim HelloRange As Range
        Set HelloRange = Range("A1:A20  A8:D8")
        HelloRange.Value = "Hello"
    End With
End Sub

Будет выделена всего одна ячейка. Как Вы видите из предыдущих примеров отличаются типом обьявления - "D3:D10, A3:A10" это объединения, а "A1:A20 A8:D8" это пересечение. Используя пересечения и объединения можно строить область любого уровня сложности.

Получив объединение можно узнать количестов ячеек.

Sub Test()
    With Application.Workbooks.Item("Test.xls")
        Worksheets("Лист2").Activate
        Dim HelloRange As Range
        Set HelloRange = Range("A1:A20,  D1:D20")
        MsgBox (Str(HelloRange.Count))
    End With
End Sub

Да пора бы уже расказать о этой Str. Эта функция переводит число в строку. Вот пример:

Sub Test()
    Dim x As Integer
    x = 10
    Dim s As String
    s = Str(x)
    MsgBox (s)
End Sub

Или так с типом Double она сама определит как переводить, простая и умная, как женщина моей мечты :-)

Sub Test()
    Dim x As Double
    x = 10.333333
    Dim s As String
    s = Str(x)
    MsgBox (s)
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 12 - Обработка ошибок VBA

Шаг 12 - Обработка ошибок VBA

Программирование это как хождение по минному полю. Неизвестно где взорвешься. Наверно так. Вы наслышаны о том, что Windows напичкан ошибками, о том что среда разработки любая при том - тоже. Мне попадались исследования на эту тему. Типа, что на каждые 1000 строк кода одна ошибка, у хорошего программиста естественно :-). В общем это закон такой. Все равно ошибешься где-нибудь. Проводя аналогию между женщиной и компьютером :-))) вообщем понятно.

Для обработки ошибок в VBA и VB есть специальный оператор On Error. Его задача при возникновении ошибки передать управление в то место( процедура или кусок кода), в котором это ждут. Посмотрим пример:

Sub Test()
    On Error GoTo Errors1
    Dim x As Integer
    Dim a As Integer
    Dim c As Double
    x = 20
    a = 0
    c = x / a
    MsgBox (" Этого не должно быть")
    GoTo Ends:
Errors1:
    MsgBox ("Ну ты блин Тикурила Даещь")
Ends:
End Sub

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

Sub Test()
    On Error GoTo Errors1
    Dim x As Integer
    Dim a As Integer
    Dim c As Double
    x = 20
    a = 0
    c = x / a
    MsgBox ("Опаньки !!!")
    GoTo Ends:
Errors1:
    MsgBox ("Ну ты блин Тикурила Даещь")
    Resume Next
Ends:
End Sub

А вот, если Вы вообще не хотите ничего говорить по поводу ошибки, то можете поступить очень сурово. Вот так. Я рекомендую применять это для бухгалтерских расчетов. Ни кто и не догадается :-)))

Sub Test()
    On Error Resume Next
    Dim x As Integer
    Dim a As Integer
    Dim c As Double
    x = 20
    a = 0
    c = x / a
    x = 10
    a = 3
    c = 10 / 3
    MsgBox ("Опаньки !!!")
End Sub

Над резюме можно немного поэкспериментировать, вот возможные описания:

Resume Next
Resune строка
Resume метка
Resume 0

Пример ниже будет упорно требовать, чтобы ввели число отличное от 0:

Sub Test()
    On Error GoTo Error1
    Dim x As Integer
    Dim a As Integer
    Dim c As Double
    x = 20
    a = Str(InputBox("введите число"))
    c = x / a
    x = 10
    MsgBox ("Опаньки !!!")
    GoTo Ends:
Error1:
    MsgBox ("думай о программировании, а не о женщинах")
    a = Str(InputBox("введите число"))
    Resume 0
Ends:
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 13 - Объект Err

Шаг 13 - Объект Err

Да, странное совпадение, 13 шаг и зловещий обьект Err, от которого одни неприятности. Этот обьект хранит информацию о последней ошибке в результате выполнения того, что вы запрограммировали. Ну давайте попробуем.

Sub Test()
    On Error GoTo Error1
    Sheets.Item(1000).Delete
    GoTo Ends
Error1:
    MsgBox "Error detected"
    MsgBox (Str(Err.Number))
    MsgBox (Err.Source)
    MsgBox (Err.Description)
Ends:
End Sub

Итак, Number - это номер ошибки Source, где она появилась, а Description описание. В данном случае Вам скажут о выходе за гарницу массива. Вот это здорово. Особенно при создании программ. Получить такое сообщение пользователю не очень приятно, а вот программисту :-)) даже думать не надо.

У объекта Err есть метод очистки Clear, он все очишает. Вот в этом случае Вы не получите никаких сообщений. После обработки ошибки неплохо применить этот метод. Так, ради профилактики.

Sub Test()
    On Error GoTo Error1
    Sheets.Item(1000).Delete
    GoTo Ends
Error1:
    Err.Clear
    MsgBox "Error detected"
    MsgBox (Str(Err.Number))
    MsgBox (Err.Source)
    MsgBox (Err.Description)
Ends:
End Sub

Нельзя не сказать, что этот обьект автоматически очистится после ..

Resume
Exit Sub(Function)
On Error

При отладке или специально в программе вы и сами можете сгенирировать ошибку методом Raise, только надо знать, что ошибки до 1000 зарезервированы VBA, а максимальный код 65535. Любое правило подвержено изменениям и поэтому есть специальная константа, от которой вы можете сложением получать коды ошибок. Она называется vbObjectError.

Sub Test()
    On Error GoTo Error1
    Err.Raise 1001, "Test()", "Это я сделал"
Error1:
    MsgBox "Error detected"
    MsgBox (Str(Err.Number))
    MsgBox (Err.Source)
    MsgBox (Err.Description)
Ends:
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 14 - События обьектов

Шаг 14 - События обьектов

Обработать можно события следующих обьектов Excel:

Application
WorkBoor
WorkSheet
Chart

Функции обработки создаются автоматически. Открывайте Excel и любую кигу. Запускайте редактор VBA.

14_1.gif (6915 b)

Появится редактор VBA. Нас интересует список обьектов в окне VBAProject. Выбирите Лист1 и два раза шелкните по нему. Появится белое окно. Вам нужно выбрать обьект и событие, смотрите как на рисунке ниже, да я чуть не забыл, код VBA еще нужен.

14_2.gif (6234 b)

Пришло время испытаний. Переключитесь на Лист2, потом назад на Лист1 должно появиться диалоговое окно о том, что активизирован лист. Это очень полезно. Например у Вас есть скрытый лист, пользователь открывает его и пробует смотреть, а Вы ему format.com за это :-). Хотя не смешно, Вам и восстанавливать.

Многие события имеют параметры. Вот как это.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
    ......
End Sub

И еще события посылают не только по иерархии обьектов вниз, но и вверх. Вот то же событие активации обрабатывается и на верхнем уровне.

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    MsgBox (Sh.Name)
End Sub

Попробуйте его создать и проверить.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 15 - Пользовательские формы

Шаг 15 - Пользовательские формы

Создавайте новую книгу. Запускайте редактор VBA, как в прошлый раз. Наводим курсор на Microsoft Excel Обьекты, правую кнопку мыши, вставить UserForm. Да смотрите сами ниже. Чего это Я.

15_1.gif (7579 b)

У Вас появится диалоговое окно (форма), панель ниструментов, и окно свойств. В окне свойств нас интересует совйство Caption, которое позволяет нам изменить заголовок окна. Поменяйте его на осмысленное имя, например, первая форма :-). Разместите на форме кнопки. Выбираете инструмент кнопка. Незнаете какой он ? Подводите к каждому и задержите мышку, Вам подскажут. Нам надо две кнопки. Одна с именем "тест", а вторая с именем "выход". Имя у кнопок так же меняется в Caption. Все должно быть вот так.

15_2.gif (2367 b)

Пора добавить к кнопкам код. Это просто. Двойной шелчок на кнопке и вы попадете в код вызываемый при нажатии кнопки. Давайте для кнопки Test.

Private Sub CommandButton1_Click()
    MsgBox ("Test Button Press")
End Sub

И для второй:

Private Sub CommandButton2_Click()
    Unload Me
End Sub

Unload Me выгружает форму из памяти. А вот теперь нам нужно создать макрос для загрузки. Создавайте масрос с именем FormsRun или другим. Код ниже.

Sub FormsRun()
    UserForm1.Show
End Sub

Вот теперь запустите макрос. Появится диалоговое окно. Нажмите кнопку Test, появится сообщение, нажмите кнопку Выход, окно диалога закроется.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 16 - Чтение и запись текстовых файлов

Шаг 16 - Чтение и запись текстовых файлов

Наверно можно смело утверждать, что умение читать и записывать информацию в текстовый файл это основа импорта и экспорта :-) Практически любая серьезная программа хранящая информацию позволяет сохранить её в текстовом формате, какое бы он расширение не имел. Открываются файлы командой Open.

Sub Test()
    Open "c:\1.txt" For Input As #1
    Close #1
End Sub

Команда Open может открывать для чтения Input и для записи Output. Цифра после as это идентификатор файла. На основании его производится чтение и запись файла.

Следующий пример демонстрирует запись и чтение файла

Sub Test()
    Open "c:\1.txt" For Output As #1
    Print #1, "Hello File"
    Close #1

    Open "c:\1.txt" For Input As #1
    Dim s As String
    Input #1, s
    MsgBox s
    Close #1
End Sub

Как видите, для записи можно использовать Print, а для чтения Input воспользовавшись идентификатором открытого файла. Естественно здесь свои тонкости работы. Вот, если Вы запишите такую строку:

......
Print #1, "Hello , File"
......

То оператор Input #1 прочитает только Hello и все. Запятая воспринимается как разделитеть. И это правильно. Есть форматы текстовых файлов когда числа разделены запятой. В коде ниже:

......
Input #1, s
MsgBox s
Input #1, s
MsgBox s
.....

Последовательно выведутся надписи Hello и File, но с этим можно бороться оператором Line Input.

Sub Test()
    Open "c:\1.txt" For Output As #1
    Print #1, "Hello , File"
    Close #1

    Open "c:\1.txt" For Input As #1
    Dim s As String
    Line Input #1, s
    MsgBox s
    Close #1
End Sub

Этот код прочитает строку целиком. Следом возникает важный вопрос, а как узнать конец файла ? Для этого есть функция EOF(идентификатор), которая позволяет вам определить конец файла.

Sub Test()
Open "c:\1.txt" For Output As #1
    Print #1, "Hello , File"
Close #1
Open "c:\1.txt" For Input As #1
    Dim s As String
    While Not EOF(1)
        Input #1, s
        MsgBox s
    Wend
Close #1
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 17 - Win32 API и VBA

Шаг 17 - Win32 API и VBA

На данный момент использование Win32 API является стандартом для любой среды или языка программирования, это и понятно, как иначе писать программы для Windows ? Вместе с тем пользоваться этим же API надо осторожно, реализации в версиях Windows отличаются вплоть до присутсвия некоторых функций. Для того, чтобы использовать функции Win 32 API их необходимо объявить, используя Declare.

В общей области (в описании) надо объявить функцию. Сделать это можно поднявшись на самую верхнюю строчку окна редактирования макроса и ввести описание.

Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal buffer As String, ByVal nSize As Long) As Long

Вот тут-то Вы и должны быть поражены. Говорят VBA это для ...... Так вот. Использовать подобную функцию на VC++ намного проще. Во-первых, Вам наверно всё равно, где она находится :-))) в kernel, user или gdi, и вам вообще-то и не надо знать её имя в виде GetWindowsDirectoryA, а если вы пользуетесь каркасной библиотекой типа MFC, то часто получаете упрощеный вид функции типа AfxMessageBox. Вот и думай теперь чего проще :-))

Давайте на Declare посмотрим повнимательнее. У него два синтаксиса для функции или процедуры.

REM то что в скобках необязательно
[Public или Private] Declare Sub имя_процедуры lib "имя_динамической_библиотеки" [Alias "псевдоним"] [(параметры)]
[Public или Private] Declare Function имя_процедуры lib "имя_динамической_библиотеки" [Alias "псевдоним"] [(параметры)] [as тип возврата]

Вот так надо знать где находится и псевдоним, если нужно и все параметры. Вот он язык для домохозяек :-)

А теперь применение. Вот тут все стало опять просто.

Sub Test()
    Dim buffer As String
    Dim lens As Long
    buffer = String(256, 0)
    lens = GetWindowsDirectory(buffer, Len(buffer))
    buffer = Left(buffer, lens)
    MsgBox (buffer)
End Sub

Объявляю переменные, buffer = String(256, 0) - заполняю строку нулями имитируя строку символов char. Зачем ? Ну есть подозрение, что Windows написан на C или ASM, даже без ++ и поэтому другого он не понимает :-), не на бейсике точно. Вызываем функцию, передавая параметры. Полученную строку обрезаем функцией Left.

Наверно лучше создавать описания в отдельном модуле и просто его экспортировать в проект, дабы не мучаться. И, наверно, есть уже готовые модули. Но этот метод позволяет Вам подключить любую динамическую библиотеку. Посмотрите в разделе MFC шаг за шагом : "Шаг 46 - Dll для Excel".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 18 - Просмотр объектов

Шаг 18 - Просмотр объектов

Весь Office 97 можно рассматривать как набор объектов. Кроме того операционная система предоставляет дополнительные объекты. Каждый объект имеет свои свойства. Объекты операционной системой предоставляются с использованием технологии OLE и интерфейсов следующих поколений на базе него.

Редактор VBA позволяет вам просмотреть доступные Вам обьекты и их свойства. Для этого Вам необходимо запустить Просмотр объектов из меню Вид (F2).

18_1.gif (4194 b)

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

18_2.gif (5872 b)

Как вы видите количество библиотек ограничено. Вот тут Вы должны возмутиться, а где библиотеки ACCESS или DAO. И вообще мало .... Не мало. Просто их необходимо подключить. Точнее надо. Если вы будете работать с базами данных или хотите расширить возможности среды, то их нужно подключать. Делается это из меню Сервис-Ссылки. Выберите этот пункт меню.

18_3.gif (8186 b)

Подключаем Microsoft DAO 3.5 Object Library. Без этой библиотеки Вы не сможете работать с базами данных на основе DAO. Только библиотека должна быть зарегистрирована в системе, иначе в списке её не будет. Что делать тогда ? В окне подключения библиотек есть кнопка Обзор, которая позволяет Вам подключить их используя, например, TLB файлы.

Что же произойдет после подключения? В списке объектов появиться DAO и все связанные с ним свойства.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 19 - Информация о типе переменной

Шаг 19 - Информация о типе переменной

А зачем, вы спросите, иметь информацию о типе переменной в ходе работы программы ? Ведь это делает программист. Опаньки :-). В VBA есть тип переменной Variant, который может быть любого типа за исключением пользовательского. Не верите ? Смотрите код:

Sub Test()
    Dim string_var As String
    Dim int_var As Integer
    Dim test_variant As Variant
    string_var = "Hello Variant"
    int_var = 123
    test_variant = string_var
    test_variant = int_var
End Sub

Как видите, и Variant можно передавать в процедуры, поэтому определение типа нужно, конечно если подобными вещами вы будете пользоваться. Для определения кода есть функция TypeName (...), которая вернет строку с именем переменной. Вот так, например, можно её использовать:

Sub Test()
    Dim string_var As String
    Dim int_var As Integer
    Dim test_variant As Variant
    string_var = "Hello Variant"
    int_var = 123
    test_variant = string_var
    MsgBox (TypeName(test_variant))
    test_variant = int_var
    MsgBox (TypeName(test_variant))
End Sub

Кроме этого есть ряд вспомогательных функций позволяющих получить информацию о переменных. IsArray позволяет проверить является ли переменная массивом.

Sub Test()
    Dim arr_var(10) As String
    If IsArray(arr_var) Then
        MsgBox ("Массив")
End Sub

IsEmpty проверка инициализации (наличия) переменной. Запустите код ниже, а потом раскомментируйте строку.

Sub Test()
    ' Dim arr_var As String
    If IsEmpty(arr_var) Then MsgBox ("NO")
End Sub

IsDate проверяет можно ли преобразовать переменную к типу даты. Ниже надпись YES появится один раз.

Sub Test()
    Dim arr_var As String
    arr_var = "01.01.1998"
    If IsDate(arr_var) Then
        MsgBox ("YES")
    arr_var = "41.01.1998"
    If IsDate(arr_var) Then
        MsgBox ("YES")
End Sub

Так же проверяется можно ли перевести в число IsNumeric:

Sub Test()
    Dim arr_var As String
    arr_var = "not numeric"
    If IsNumeric(arr_var) Then MsgBox ("YES")
    arr_var = "1998"
    If IsNumeric(arr_var) Then MsgBox ("YES")
End Sub

Есть еще ряд подобных функций:

  • IsObject - проверка, что переменная обьект
  • IsNull(выражение) - проверка на пустое значение
  • IsError(выражение) - проверка выражения, представляет ли оно значение ошибки


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 20 - Пользовательские классы

Шаг 20 - Пользовательские классы

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

20_1.gif (8757 b)

В результате у Вас появится окно для кода класса, и в окне просмотра проекта появится значок класса. Вероятнее всего с именем Класс1. Объявим переменные для внутреннего использования. Private говорит о том, что использоваться они будут только внутри класса.

Private NamePiple As String
Private DatePiple As String

Теперь создадим функцию GetPipleName. Пишите ниже:

Public Sub GetPipleName()
    NamePiple = InputBox("Enter Name - ")
End Sub

Теперь свойства для получения имени. Пишите ниже:

Property Get PipleName() As String
    PipleName = NamePiple
End Property

И для установки тоже. Пишите ниже:

Property Let PipleName(s As String)
    NamePiple = s
End Property

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

20_2.gif (2870 b)

Настало время испытать его в действии:

Sub Test()
    Dim vars As New Класс1
    vars.GetPipleName
    MsgBox vars.PipleName
    vars.PipleName = "VBA"
    MsgBox vars.PipleName
End Sub

По удобству и простоте это круче C++ и MFC и так далее. Кроме того класс легко сохранить для дальнейшего использования. Вообщем класс. Просто оцените эту возможность даже если вы читате просто так.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 21 - Пользовательские типы

Шаг 21 - Пользовательские типы

В общей части Вы должны описать структуру и объявить переменную типа этой структуры. Смотрите картинку.

21_1.gif (3903 b)

Итак мы создадим тип с элементами x,y, типа Integer и с с типом Variant. Ох уж этот Variant, он позволяет нам в структуру помещать все, что угодно. Хоть массив. Мы то сделаем. Но разве Вас не впечатляет простота и мощь. Ведь так можно создать структуры любой сложности очень просто. Нет OLE, нет указателей. После C++ это просто сказка.

' Описание
Private Type MyType
    x As Integer
    y As Integer
    c As Variant
End Type

Sub Test()

'--------------------------
' Область функции
Sub Test()
    Dim a(2) As MyType
    Dim arrays(2) As String
    arrays(1) = "Hello"
    arrays(2) = "Cool"
    a(1).x = 1
    a(1).y = 2
    a(1).c = arrays
    a(2).x = 10
    a(2).y = 20
    arrays(1) = "Hello 2"
    arrays(2) = "Cool !!!"
    a(2).c = arrays
    Debug.Print "a1"
    Debug.Print a(1).c(1)
    Debug.Print a(1).c(2)
    Debug.Print "a2"
    Debug.Print a(2).c(1)
    Debug.Print a(2).c(2)
End Sub

Во всем этом есть и подводный камень. Создавать структуры можно только на уровне модуля. Не зря она у нас Private. Но можно создавать классы, которые умеют с ними работать :-) Это несколько радует.

Для просмотра результата Вам необходимо открыть окно отладки. Это можно сделать в меню Вид - Окно отладки (CTRL-G).

21_2.gif (12319 b)

Вот такой результат вы должны увидеть:

a1
Hello
Cool
a2
Hello 2
Cool !!!


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 22 - For Each

Шаг 22 - For Each

Этот цикл придуман для того, чтобы облегчить дествия над массивами и наборами. Он позволяет произвести однотипные операции над всем массивом. Описание его такое:

For Each переменная In массив

    Действия

Next переменная

Переменная должна иметь тип Variant или Object, в котором можно хранить практически всё. Пример ? Пожалуйста.

Sub Test()
    Dim arrays(1) As String
    arrays(0) = "Hello"
    arrays(1) = "Each :-)"
    Dim vari As Variant
    For Each vari In arrays
        MsgBox (vari + " - Steps")
    Next vari
End Sub

For Each очень удобен для работы с коллекциями. Вот так можно пробежаться по открытым кигам.

Sub Test()
    Dim vars As Variant
    For Each vars In Workbooks
        MsgBox (vars.Name)
    Next vars
End Sub

Или по листам книги:

Sub Test()
    Dim vars As Variant
    For Each vars In Workbooks.Item("Test.xls").Sheets
        MsgBox (vars.Name)
    Next vars
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 23 - Работа с каталогами

Шаг 23 - Работа с каталогами

Первым делом определим откуда запущенно приложение. У обьекта Application есть свойства path, которое и позволит нам получить информацию.

Sub Test()
    MsgBox (Application.Path)
End Sub

Команды создания и удаления каталогов очень похожи на DOS аналоги. Это MkDir и RmDir. Ниже создаем каталог на диске С.

Sub Test()
    MkDir ("c:\test")
End Sub

И удаляем.

Sub Test()
    RmDir ("c:\test")
End Sub

А вот теперь важный вопрос. Помещается ли удаленный каталог в корзину. Нет не помещается. Это очень возмутительно. Почему ???? Ведь программа создана для Windows c использованием среды разработки от Microsoft и такое возмутительное безобразие. Ладно Linux им судья. Для того, чтобы убедиться в этом запустите следующий код и загляните в корзину.

Sub Test()
    MkDir ("c:\test")
    RmDir ("c:\test")
End Sub

Для получения текущего каталога есть функция CurDir.

Sub Test()
    MsgBox (CurDir)
End Sub

Для того, чтобы сменить каталог тоже есть функция - chdir:

Sub Test()
    ChDir ("c:\windows")
    MsgBox (CurDir)
End Sub

Команда dir позволяет просмотреть все файлы в каталоге. Только использование её несколько специфично. Сначала Вы вызываете dir с параметрами и получаете первое имя файла, в дальнейшем можно вызвать её без параметров и получить следующее имя и так до тех пор, пока не вернется пустое имя файла.

Sub Test()
    Dim s As String
    s = Dir("c:\windows\inf\*.*")
    Debug.Print s
    Do While s <> ""
        s = Dir
        Debug.Print s
    Loop
End Sub

Результат работы в Окне отладки (Ctrl-G).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 24 - Использование Automation

Шаг 24 - Использование Automation

Использование элементов ActiveX на базе можели COM - компонентная модель объектов, позволяет создавать сложные составные документы, то есть там могут находиться материалы из разных программ - Excel, Access, PowerPoint и так далее. Кроме этого есть возможность пользоваться другим приложением для решения задач. Например Excel может использовать Access для хранения данных или наоборот Access может использовать Excel для расчетов. Вобщем это можно назвать построением пользовательских приложений на базе готовых программ.

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

  • ACCESS - База данных
  • EXCEL - Расчеты
  • WORD - Текстовый редактор
  • PowerPoint - Презентационная графика
  • Office Binder - Интеграция документов
  • Outlook - Служба управления документами
  • Internet Exploler - Работа с интернет

Объект с вашим приложением можно связать используя позднее и ранее связывание. Позднее связывание происходит на этапе выполнения кода и для него используется понятие Object. Ниже будет приведен код для программы Corel Draw и использование её в качестве объекта для Automation.

Sub Test()
    Dim objCorel As Object
    Set objCorel = CreateObject("CorelDraw.Graphic.8")
    MsgBox ("press")
End Sub

В момент когда на экране появится сообщение PRESS нажмите Ctrl-Alt-Delete для просмотра активных объектов. Вот смотрите ниже.

24_1.gif (9636 b)

Для позднего связывания используется меню Сервис - Ccылки, в предыдущих шагах мы об этом пункте меню упоминали. Вот пример для Excel.

Sub Test()
    Dim objExcel As Excel.Application
    Set objExcel = CreateObject("Excel.Application")
End Sub

Ну и напоследок как можно использовать объект Word из Excel:

Sub Test()
    Dim objWord As Word.Application
    Set objWord = CreateObject("Word.Application")
    MsgBox (objWord.Caption)
    MsgBox (objWord.UserName)
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 25 - О функции SendKeys

Шаг 25 - О функции SendKeys

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

SebdKeys строка, [режим ожидания]

Этот макрос прокрутит таблицу на страницу вниз.

Sub Test()
    SendKeys ("{PGDN}")
End Sub

Режим ожидания это как будет произведен возврат. Если TRUE возврат в процедуру будет только после обработки кодов. Обработка может быть длительной, если у Вас есть обрабочики событий. FALSE вернет сразу ничего не ожидая.

Вы обратили внимание на фигурные скобки. В них указываются команды и символы:

+
^
%
~
(
)
DEL {DEL}
INS {INS}
и так далее :-) догадаетесь?
{BS} {BREAK} {CAPSLOCK} {ENTER} {DOWN} {PGUP}

Это не все, но направление понятно.

Функция ниже переведет указатель на страницу ниже, введет 123 и даже ENTER нажмет :-)

Sub Test()
    SendKeys ("{PGDN}")
    SendKeys ("123{ENTER}")
End Sub

Вот так можно вызвать функциональную клавишу:

Sub Test()
    SendKeys ("{F1}")
End Sub

Когда экспериментируете запускайте макрос из активной рабочей книги.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 26 - Заполнение списка на форме из таблицы

Шаг 26 - Заполнение списка на форме из таблицы

Итак, задача простая. У нас есть в таблице список девушек и мы ходим создать макрос, который будет зачитывать этот список и выводить в диалоговом окне. Вот под эту таблицу создавался макрос.

26_1.gif (4212 b)

Создайте точно такую таблицу, если не трудно :-)

Теперь переходим в редактор Visual Basic и создаем форму. На эту форму надо поместить два элемента управления: кнопку и список. Вот она какая.

26_2.gif (8678 b)

Шелкайте два раза по кнопке и вы попадете в редактирование события нажатия. Введите код:

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Что означает "уничтож меня" :-). То есть форму. Это me похожа на this в C++ и идентифицирует объект, в котором производятся события. Даже спрашивать не надо, где я нахожусь. Unload и всё.

Заполнять список мы будем при активизации формы. Поэтому нам необходимо обработать событие инициализации. Щелкните по форме два раза и выберите из меню событий (справа) Activate. И код.

Private Sub UserForm_Activate()
    ' Активизируем нужный лист
    Worksheets.Item("Test").Activate
    ' Выбиделяем диапазон
    Dim девушки As Range
    ' Объект выделения
    Set девушки = Range("K2:K6")
    ' Выделяем
    Dim vars As Variant
    ' Пойдем по девчатам :-)
    For Each vars In девушки
        ' Добавляем в список
        UserForm1.ListBox1.AddItem (vars)
    Next vars
End Sub

Код прокомментирован и наверно понятен. Использование русских слов для переменных это не ошибка. Наконец это делать можно. Здесь в VBA можно использовать русские буквы для имен переменных.

И макрос для запуска формы:

Sub Test()
    UserForm1.Show
End Sub

В макросе написано - "форма покажись". Ну вот. Запускайте. Вот как это получится:

26_3.gif (2516 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 27 - Обмен данными между формой и таблицей

Шаг 27 - Обмен данными между формой и таблицей

Задача. Я хочу сделать ряд справок и страницу с константами. Одной из констант будет фамилия директора, которая используется в справках. При изменении этой константы фамилия в справке должна автоматически меняться. И я хочу менять фамилию из формы.

Создаем лист Константы и на нем ячейке даем имя.

27_1.gif (5072 b)

И любое количество листов со справками. Ссылаясь на ячейку с фамилией.

27_2.gif (4881 b)

Как вы понимаете, сколько я листов не создам, воспользовавшись ссылкой на ячейку =director, стоит мне изменить данные в ячейки с фамилией директора она везде поменяется. Это само нормально. Вот только менять я хочу из формы, например, чтобы с константами спрятать лист подальше от пользователя. Ну давайте создавать форму. Идем в редактор VBA:

27_3.gif (7413 b)

При запуске формы мы должны прочитать данные с листа:

Private Sub UserForm_Activate()
    Worksheets.Item("Konst").Activate
    UserForm1.TextBox1.Text = Range("Director").Text
End Sub

При нажатии на кнопку "Новый" заменить данные на листе константы (автоматически поменяются на справках):

Private Sub CommandButton2_Click()
    Range("Director").Value = UserForm1.TextBox1.Text
End Sub

По нажатию на "Хватит" закрыть форму:

Private Sub CommandButton1_Click()
    Unload Me
End Sub

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 28 - Работа с Датами

Шаг 28 - Работа с Датами

Для работы с датой в VBA предусмотрен специальный тип Date. Этот тип занимает 8 байт. Оно вам надо ? Это так для информации :-). Пробуем.

Sub Test()
    Dim MyDate As Date
    MsgBox (Str(Year(MyDate)))
End Sub

У меня выдает 1899 год. Это говорит, что при создании этой переменной она не инициализируется текущей датой. Это плохо. Поместить Дату и время можно из строки воспользовавшись функциями DateValue и TimeValue.

Sub Test()
    Dim MyDate As Date
    MyDate = DateValue("1/1/96")
    Debug.Print Year(MyDate)
End Sub

Так же и со временем:

Sub Test()
    Dim MyDate As Date
    MyDate = TimeValue("10:10:12")
    MsgBox Str(Minute(MyDate))
End Sub

Только одновременно хранить и время и дату так не удастся, вот этот код приведет к очень интересному результату.

Sub Test()
    Dim MyDate As Date
    MyDate = DateValue("6/1/72")
    MsgBox Str(Year(MyDate))
    MyDate = TimeValue("10:10:12")
    MsgBox Str(Minute(MyDate))
    MsgBox Str(Year(MyDate))
End Sub

Если вы хотите хранить вместе и дату и время, то поступите так:

Sub Test()
    Dim MyDate As Date
    MyDate = DateValue("6/1/72") + TimeValue("10:10:12")
    MsgBox Str(Minute(MyDate))
    MsgBox Str(Year(MyDate))
End Sub

Чтобы извлекать части даты и часов используйте такие функции:

Month(переменная типа Date)
Day(переменная типа Date)
Year(переменная типа Date)
Hour(переменная типа Date)
Minute(переменная типа Date)
Second(переменная типа Date)
WeekDay(переменная типа Date)

WeekDay - это день недели, если Вам это нужно, то вы можете написать что-то типа этого.

Sub Test()
    Dim MyDate As Date
    MyDate = DateValue("9/1/72")
    If (WeekDay(MyDate) = vbSunday) Then
        MsgBox ("Sunday")
End Sub

vbSunday это константа, есть еще vbMonday, ну дальше понятно.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 29 - Использование With

Шаг 29 - Использование With

Оператор With используется для явного указания обьекта, к свойствам которого мы хотим получить доступ. Вот так это выглядит в глобальном плане.

With объект
    операции с объектом
End With

Давайте рассмотрим пример. Ниже реализованы два сообщения, которые выводят имя и статус видимости объектов:

Sub Test()
    MsgBox (Application.Worksheets.Item(1).Name)
    MsgBox (Str(Application.Worksheets.Item(1).Visible))
End Sub

Используя With это можно сделать так:

Sub Test()
    With Application
        With .Worksheets
            MsgBox (.Item(1).Name)
            MsgBox (Str(.Item(1).Visible))
        End With
    End With
End Sub

Используя With можно получить доступ и к пользовательским структурам.

'----------- Описание --------
Type Family
    Name_I As String
    Name_Cat1 As String
    Name_Cat2 As String
End Type

'----------- Код --------

Sub Test()
Dim fam As Family

With fam
    .Name_I = "Pety"
    .Name_Cat1 = "Vasi"
    .Name_Cat2 = "Fisa"
    MsgBox (.Name_I)
End With

End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 30 - Рекурсия в VBA

Шаг 30 - Рекурсия в VBA

При программировании многие задачи решаются на основе рекурсии. Т.е. есть ряд задач, которые вообще без рекурсии не решаются. Это задачи имитации человеческого интелекта на основе перебора вариантов. Без рекурсии есть возможность решить подобные задачи только для частных случаев. Понятие рекурсии довольно молодое. Вот справка:

1958 год. В руководстве по программированию ЕРМЕНТ
появилось понятие рекурсивности. Рутисхаузер.

Рекурсивная процедура - это процедура вызывающая сама себя. Классический пример подсчет факториала. Мы то его и реализуем:

Sub Test()
    MsgBox Str(Fact(3))
End Sub

Function Fact(n As Integer)
    If n < 1 Then
        Fact = 1
    Else
        Fact = Fact(n - 1) * n
    End If
End Function

Всё это хорошо, только для рекурсивных функций используется стековая память, которая имеет предел :-(. В этой памяти размещаются и аргументы. Если их много или они большие по памяти хранения - финиш настанет еще быстрее. С рекурсивными функциями связанно еще и время выполнения. То же в плохую сторону.

В Excel нет рекурсивных обьектов. Листы, книги, ячейки не рекурсивные. Но вот данные :-) им всё ни почем. Вы можете создавать используя Type структуры и создавать деревья. Для обработки их удобно использовать рекурсию.

Что происходит при вызове рекурсивных процедур можно увидеть выполняя программу по шагам (F8) и просматривая окно локальных переменных или сразу стек вызовов из меню Вид.

30_1.gif (14366 b)

Я тут ставил эксперимент и оказалось, что факториал числа больше 100 можно расчитать, но вот 200 уже нельзя. Переполнение говорит. Вот так.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 31 - Работаем с выделенным диапазоном

Шаг 31 - Работаем с выделенным диапазоном

Наша задача научиться обрабатывать выделенный диапазон. Я надеюсь, что кнопка до сих пор связанна у Вас с макросом. Как ниже. То есть пользователь выделяет диапазон, а по нажатию на кнопку над ним производится работа. Например умножения всех чисел на два.

31_1.gif (1473 b)

Попробуем получить информацию о выделенном диапазоне:

Sub Test()
    ' обьявим переменнуб типа Range
    Dim cur_range As Range
    ' активный расчетный лист
    With ActiveSheet
        ' объект Range включает выделенный диапазон
        Set cur_range = Selection
        ' активизируем Range
        cur_range.Activate
        ' Адрес и количество строк и колонок
        Debug.Print cur_range.Address
        Debug.Print cur_range.Columns.Count
        Debug.Print cur_range.Rows.Count
    End With
End Sub

А вот и код. Ниже написана функция, которая значения в ячейках умножит на 2. Будь то одна ячейка или диапазон ячеек.

Sub Test()
    Dim cur_range As Range
    With ActiveSheet
        Set cur_range = Selection
        cur_range.Activate
        For x = 1 To cur_range.Rows.Count
            For y = 1 To cur_range.Columns.Count
            ' значению ячейки присвоить значение умноженно на 2
                cur_range(x, y) = cur_range(x, y).Value * 2
            Next y
        Next x
    End With
End Sub

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 32 - Перемещение по ячейкам и информация

Шаг 32 - Перемещение по ячейкам и информация

Вас может заинтересовать, а как можно сдвинуться влево или вправо назад или вперед от текущей ячейки. Для этого у объекта Range есть метод Offset, который и позволяет производить подобные действия.

Sub Test()
    Dim cur_range As Range
    Set cur_range = Range("A1")
    Set cur_range = cur_range.Offset(1, 0)
    Debug.Print cur_range.Address
End Sub

А вот результат работы. Мы от текущего объекта сдвинулись влево на 1 колонку.

$A$2

Если вы хотите узнать максимальные размеры листа, то у Вас есть возможность это сделать используя UsedRange. У вас будет объект типа Range, из которого вы сможете узнать максимальную колонку или строку.

Sub Test()
    With ActiveSheet
        Dim cur_range As Range
        Set cur_range = .UsedRange
        Debug.Print cur_range.Address
    End With
End Sub

Адресовать ячейки можно и двумя цифрами по колонки и сроке. Это избавляет Вас от утомительного разбора адресов типа $A10. Так как адрес строка придеться её резать и собирать. Использования Cells(x,y) очень гибко в использовании и позволяет строить легкие циклы. Пример ниже находит на листе левый верхний угол из всех ячеек с введенными данными и в эту ячейку записывает слово.

Sub Test()
    ' объект Range
    Dim cur_range As Range
    ' Весь лист
    With ActiveSheet
        Set cur_range = .UsedRange
        Debug.Print cur_range.Address
        ' у меня печатает $C$5:$J$48
        Dim y_min As Integer
        ' минимальная колонка
        y_min = cur_range.Columns.Column
        Dim x_min As Integer
        ' минимальная строка
        x_min = cur_range.Rows.Row
        Set cur_range = Range(Cells(x_min, y_min), Cells(x_min, y_min))
        cur_range = "lef up"
    End With
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 33 - Встроенные диалоговые окна

Шаг 33 - Встроенные диалоговые окна

Excell имеет несколько встроенных диалоговых окон. Несколько это слабо сказано, их более 200. Предназначенны они для облегчения работы и программирования. Например, вашему приложению необходимо вызывать окно диалога для выбора цвета ячейки. Вот код:

Sub Test()
    Application.Dialogs(xlDialogActiveCellFont).Show
End Sub

А вот результат работы при запуске макроса. Это окно появится и будет изменять свойства выделенного диапазона.

33_1.gif (4481 b)

Кроме типа окна далее можно передавать параметры. Вот, например, для открытия DBF файла.

Sub Test()
    Application.Dialogs(xlDialogOpen).Show "*.dbf"
End Sub

Появится диалоговое окно с предложением выбрать DBF файл. Как вы заметили для отображения окна используем метод Show и уникальную константу диалогового окна.

С аргументами особый разговор. Во-первых их может быть много. Если нужно оставить аргумент по умолчанию, то используйте вот такую конструкцию "*.dbf", ,TRUE. Две запятые позволяют пропустить аргумент ( оставить по умолчанию). Так же следует знать, что аргументы нужно задавать строго в определенной последовательности при работе со встроенными диалоговыми окнами.

Аргументы могут быть именованными. Ниже пример аналогичен примеру с двумя запятыми.

Sub Test()
    Application.Dialogs(xlDialogOpen).Show arg1 = "*.dbf", arg3 = True
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 34 - Архитектура программ VBA

Шаг 34 - Архитектура программ VBA

Одна из концептуальных идей Windows и программирования для Windows заключается в том, что объекты обмениваются сообщениями. Именно обмен, получение и обработка сообщения являются смыслом жизни любого объекта. Давайте посмотрим. У нас есть диалоговая панель и кнопка. Например такая.

34_1.gif (1046 b)

Эту панель можно создать, показать методом Show и убрать методом Unload. Между вызовами этих процедур объект живет. То есть получает и обрабатывает сообщения. Наример, при нажатии на кнопку.

Посылку сообщения можно рассматривать, как вызов метода соответствующего объекта. Например, Вы нажимаете на кнопку мышкой. Нажатие состоит из кучи сообщений - мышка двигается, клавиша вниз, клавиша вверх и другие. При этом обрабатывается последовательность сообщений и система делает вывод о сообщении более высокого уровня - нажата кнопка. В результате вызовется метод. То есть сообщения нажатия на кнопку вызывает метод Click этой кнопки.

Private Sub CommandButton2_Click()
    ......
End Sub

Вообще-то сообщения примерно так и работают и в реальном мире. Сообщите жене, что у Вас появилась другая женщина и у жены будет вызван соотвествующий метод. Реализация этого метода зависит от конструкции объекта жена :-). Или позвоните 03 и сообщите адрес со словами пожар. То же будет реакция. Вобщем как в жизни. Только для получения реакции нужно послать сообщение.

Модель VBA подразумевает три составляющих:

  • Визуальная
  • Системная
  • Обработчик событий

Посмотрите рисунок ниже.

34_2.gif (3483 b)

Визуальная часть это то, что видно на экране, т.е. интерфейс пользователя. Это окна диалога, кнопки, списки и т.д. При работе с программой пользователь постоянно её теребит - нажимает кнопки, двигает окна и еще производит кучу действий. Он использует интерфейсные объекты (элемены управления) для генерации событий. В ответ на это системная составляющая, которая включает в себя:

  • средства операционной системы
  • средства языка прогарммирования

определяет соответсвующее событие и формирует сообщение объекту (вызывает метод объекта). Обработчик событий это код, который будет вызван при возникновении события.

VBA для OFFICE полностью соответсвует этой концепции. Офис предоставляет Вам средства интерфейса, VBA реакцию на события. Вы проектируете интерфейс и реакцию. Системная часть Вас не волнует. Это на совести разработчика VBA и OFFICE.

Рассуждать о преимуществах и недостатках данной системы можно долго. Только идея здесь следующая. Операционная система и реализация среды программирования может меняться (она и меняется 3.1, 95, 98 etc.) , меняется VBA ( 95 , 97 etc.), а вроде как ваши программы от этого вообще не зависят. Например, если в следующей версии WINDOWS кнопка будет допустим галлографическая, то ваша программа будет с ней работать :-). Вам придется при необходимости добавить новые методы.

Визульный он потому, что код рождается от визуального интерфейса. То есть стройте интерфейс потом только код релизации. Бейсик потому, что он и есть Бейсик с дополнительными возможностями. Представляете как далеко смотрели в будущее наши учителя, по школьной программе изучается Бейсик.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 35 - Дополнительные компоненты

Шаг 35 - Дополнительные компоненты

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

35_1.gif (6412 b)

В панели компонент появится земной шар. Выберите его и поместите на диалоговую панель.

35_2.gif (10545 b)

Два раза щелкните на кнопки и привежите код к событию нажатия.

Private Sub CommandButton2_Click()
    WebBrowser1.GoHome
End Sub

Вернитесь к редактированию диалогвой панели. Её тут же можно запустить на исполнение. Смотрите на рисунке обведено кружком. Установите соединение с интернетом. Нажмите на кнопку. Загрузится страница HOME. Там про то, что "Добро пожаловать".

Как видите подключение и ипользование дополнительных компонент дело в принципе несложное. Это только в принципе :-).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 36 - Где хранятся настройки панелей инстументов

Шаг 36 - Где хранятся настройки панелей инстументов

Это очень интересный вопрос. Вот пример. Я создал настройки панелей инструментов как на картинке.

36_1.gif (2285 b)

Всё это я сохранил в файле. Теперь открывая Excel такой вид будет у всех книг. Значит информация о настройках панелей инструментов где-то хранится. Конечно !!!

Параметры модифицированных панелей инструментов хранятся в файле.

WINDOWS\ИМЯ_ПОЛЬЗОВАТЕЛЯ.XLB

или

WINNT\ИМЯ_ПОЛЬЗОВАТЕЛЯ.XLB

Что понимается под именем пользователя? Вот я вхожу в NT и к имени Administrator ввожу пароль. Поэтому этот файл имеет имя Administrator.xlb. Там все настройки. Если вы хотите запуститься с настройками по умолчанию переместите его в другое место и Excel сам настроит панели инструментов по умолчанию. Вот смотрите. Сейчас он загружается как на рисунке сверху в смысле панелей инструментов. Переношу файл из каталога WINNT на рабочий стол. И вот.

36_2.gif (3282 b)

Настраивать панель инструментов можно также из Visual Basic используя объект CommandBar.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 37 - Создание приложений с использованием Excel

Шаг 37 - Создание приложений с использованием Excel

Внимание! Это личный взгляд автора на построение
решений на базе Microsoft Office. Притензии идеи
и коментарии принимаются по почте.

Итак, нам нужно построить приложение. Любое приложение состоит из 3 частей.

  1. Место хранения информации
  2. Интерфейс
  3. Логика.

Всё это конечно можно реализовать с помошью Excel, вопрос какой ценой ? Вообще в этой жизни можно всё. Например, взломать сеть используя только NotePad. Можно, пишите в командах процессора, потом переименуйте txt в exe и готово. Теоритически можно. Вы можете ? Я нет. Вот и о чем речь. Сколько и какой ценой.

Итак мой опыт такой. Неправильное использование инсрументов ведет к головной боли программистов. Любое приложение можно сделать, например, и в Excel, и в Access. Но только реально начнете работать то тут стоп. В Excel легко создавать формы и отчеты, считать, но хранить данные тяжело. А Access нет проблем с хранением, контролем за информацией, но все остальное труднее. Все просто. Каждый инструмент для своей задачи. Вот мой взгляд.

37_1.gif (2774 b)

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

Связь между Access и Excel можно организовать по разному. Например, на основе DAO. Но встает вопрос, чей VBA, то есть какого программного продукта ? Я склоняюсь к Excel. Вот почему. Работа происходит так:

работа с формой
    нужна информация
    запрос с базе
    получение результатов
возврат на форму

То есть основное количество логических операций производится в интерфейсе. Поэтому удобно пойти от Excel туда и поместить код VBA. Все, что нужно сделать это научить тесно взаимодействовать Excel и Access.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 38 - Зачем нужна рабочая область

Шаг 38 - Зачем нужна рабочая область

Без тебя лето зима
Без тебя метель в июле
        A Студио.

Рабочая область - это набор файлов Excel. Она позволяет открывать эти файлы одновременно. Вобщем-то это специальный файл, который содержит информацию о том какие рабочие книги должны быть открыты. Его расширение XLW. А выглядит он вот так:

38_1.gif (921 b)

Рабочая область имеет смысл, если у Вас есть несколько рабочих книг связанных между собой. Давайте попробуем. Создавайте рабочий каталог с именем TestWorkspace. Теперь создадим файл Excel с именем Test1 и поместим его в рабочий каталог. Давайте занесем информацию. Смотрите ниже. Три участка с фамилиями. Красным это сумма полученная автосуммированием.

38_2.gif (5618 b)

Сохраните этот файл и, не закрывая его, создайте новый. Дайте ему имя Test2.xls и сохраните в тот же каталог. Теперь мы занесем в него информацию ссылаясь на суммы в первой книге (Test1.xls).

38_3.gif (3012 b)

Теперь сохраним рабочую область и проведем эксперименты. Выбираем меню "Файл -> Сохранить рабочую область". И сохраняем в тот же каталог с именем Test. Закрывайте Excel в вашем каталоге должно быть три файла.

Test1.xls
Test2.xls
test.xlw

Экспериментируем. Откройте Test2.xls. Вы получите сообщение:

38_4.gif (2630 b)

Это нормально. Связи то есть. А вот теперь закройте все и откройте рабочую область. Всё пройдет без сообщений. Конечно откроются сразу все файлы в рабочей области. Это удобно если предпологается обмен данными между многими книгами. При этом всё должно быть динамично.

Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 39 - Автозапуск и шаблоны

Шаг 39 - Автозапуск и шаблоны

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

  • Из каталога шаблонов
  • Из каталога автозапуска

Из шаблонов:

39_1.gif (4951 b)

Папки автозапуска:

39_2.gif (2289 b)

Весь прикол в том, что эти папки разные :-))) Все равно Вы не захотите, чтобы Ваши документы создавались всегда одинаково !!!

C:\Program Files\Microsoft Office\Шаблоны   		- Здесь шаблоны
C:\Program Files\Microsoft Office\Office\XLStart	- А здесь книга на автосоздание

Давайте убедимся, что это разные вещи. Создайте шаблон скажем с желтой верхней строкой и сохраните в шаблоны, тоже самое сделайте только с красной и сохраните в папку автозапуска. Создавайте шаблоны с именами Книга.xlt. Закройте Excel, а теперь попробуйте два варианта и результат будет разный. Это важно. Важно особенно при программировании, чтобы быть уверенными, что все элементы в книге есть.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 40 - О многозадачности Windows и циклах

Шаг 40 - О многозадачности Windows и циклах

Как Вы знаете Windows 9x является многозадачной средой. Это везде пишется. Но на самом деле это далеко не совсем так. То есть в ней нет четкой установки приоритетов. Не верите ? Создайте макрос в Excel и запустите вот этот пример.

Sub Test()
    For x = 1 To 1000000000000
        Debug.Print x
    Next x
End Sub

Любая работа в этот момент будет проблематична. Это связанно с проблемами еще от Windows 3.1, тогда при программировании от Вас требовали периодически особенно в процессе длительных циклов передавать управление операционной системе. VBA до сих пор не избавлен от этой проблемы. Вам все равно надо это делать. Делается это с помошью DoEvents.

Используйте функцию DoEvents для передачи управления операционной системе каждый раз прохода цикла. Но она может быть полезна и при дисковых операциях ввода вывода, операциях с DDE. Давайте изменим наш пример.

Sub Test()
    For x = 1 To 1000000000000
        DoEvents
        Debug.Print x
    Next x
End Sub

Если Ваша программа тормозит выполнение других программ вспомните об этом шаге.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 41 - Подключаем DAO

Шаг 41 - Подключаем DAO

Следующая серия шагов будет посвящена проблемме Excel-Access
Задача сделать форму Excel, которая будет расчитывать стоимость товара в рублях
из цены в долларах оперируя информацией из Access в зависимости от даты.

В Excel много методов работы с базами данных. Давайте попробуем DAO для того, чтобы получить доступ к классам DAO нам необходимо их подключить. Это делается из меню "Ссылки":

41_1.gif (1498 b)

Откроется диалоговое окно, в котором нам надо найти DAO Object Library.

41_2.gif (3042 b)

С этого момента вы можете многое. Например, просмотреть список классов и их свойств и методов. Сразу скажу, что это надежнее документации. Там есть то, чего нет в описаниях и помощи. Зайдите в меню "Вид -> Просмотр объектов" и выберите DAO.

41_3.gif (7916 b)

Теперь мы можем использовать классы DAO.

41_4.gif (2135 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 42 - Готовим данные

Шаг 42 - Готовим данные

Для того, чтобы быть ближе к жизни я пошел на сайт Центрального Банка России за курсом доллара. Вот его адрес, чтобы долго не ходить (http://www.cbr.ru/scripts/daily.asp)

А вот как выглядит страница с курсами:

42_1.gif (7836 b)

Я просто выделил и скопировал в текстовый файл через буфер обмена. Он примерно такой с именем Curs.txt. Он есть в проекте если кому лень.

01/01/2000  1  27,0000
06/01/2000  1  26,9000
07/01/2000  1  27,2300
11/01/2000  1  27,7300
12/01/2000  1  28,4400
......

Теперь мы из этого текстового файла сделаем базу данных. Запустим Access создадим новую БД с именем curs и меню "Импорт":

42_2.gif (3670 b)

А дальше "Текстовый файл" и "фиксированной ширины". В результате появится таблица со следующей структурой и заполненными значениями.

42_3.gif (4840 b)

Для особенно ленивых этот файл есть в проекте curs.mdb. Только если вы настолько ленивы зачем вообще читаете ???

Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 43 - Готовим форму

Шаг 43 - Готовим форму

Итак, нам необходимо подготовить форму, к которой мы будем обращаться. Конечно это лист Excel. Запустите Excel, создайте файл с именем TestCurs и оставьте на нем один лист. Теперь на этом листе напишем "Цена товара в $" и "Цена товара в РУБ", также отдельно "Курс РУБ за $". Нужна и ячейка "Дата". И дадим имена ячейкам.

Цена в рублях 	RUB
Цена в $		BAKS
Курс		KURS
Дата		DATES

43_1.gif (4584 b)

Теперь дело за формулами. Идея ясна как белый день. Стоимость руб = Стоимость в $ * курс. Вот это и запрограммируем:

43_2.gif (5703 b)

Вводить мы будем цену в долларах, выбирать дату и видеть цену в рублях. Цену в долларах ввести не тяжело :-))). Все остальное посчитается, если будет курс. Курс привязан к дате. То есть мы должны.

  • Ввести дату
  • Получить курс
  • А дальше вводить цену в долларах

Вот теперь надо все подготовить для ввода даты. Надо задать, что это ячейка даты. Выделите её пойдите в "Формат", дальше "Ячейки", потом установите тип ячейки "Дата".

43_3.gif (5276 b)

После того как введена дата нужно будет получить курс. Для этого поместим кнопку на лист. Нам нужно в меню "Вид -> Панели инструментов -> Элементы управления" выбрать кнопку и поместить её рядом с датой. Нажимая на неё мы будем получать курс.

43_4.gif (2681 b)

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

Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 44 - Считаем

Шаг 44 - Считаем

Голос тихий таинственный
Где ты милый единственный
            Алсу.

Итак, нам нужно связывать Excel и Access. Где находится Excel мы знаем, а вот где файл MDB нужно знать и указывать. Но этих проблем можно избежать, если применить такой ход. Если mdb будет в том же каталоге, что и XLS, то можно создать функцию, которая будет получать этот путь.

44_1.gif (2957 b)

Итак мы её поместим в отдельный модуль для этого его еще нужно создать. А вот код.

Function stDBGetPath() As String
    Dim stTemp As String
    ' взять путь нахождения активной книги
    stTemp = ActiveWorkbook.Path
    ' прибавить имя базы данных
    stDBGetPath = stTemp + "\" + "curs.mdb"
End Function

Вот теперь можно открывать базу данных используя объекты DAO. Вот код:

Private Sub CommandButton1_Click()
    '---------- объявление переменных ------
    ' переменная типа базы данных
    Dim dbAccess As Database
    ' переменная типа набор записей
    Dim reRecordSet As Recordset
    ' здесь будет SQL запрос
    Dim stSQL As String
    ' переменная типа даты
    Dim daDate As Date

    ' а вдруг ошибка
    On Error GoTo ErrorsDB

    ' ---------- получаем данные из ячейки
    daDate = Range("DATES").Value
    ' ---------- работа с базой ------------
    ' откроем базу данных
    Set dbAccess = OpenDatabase(stDBGetPath)
    ' Строим SQL запрос
    stSQL = "SELECT * FROM[Curs] WHERE[Поле1] =""" & daDate & """"
    ' получаем набор значений
     Set reRecordSet = dbAccess.OpenRecordset(stSQL)
    ' если данные получены тогда занести в ячейку
    If (reRecordSet.RecordCount > 0) Then
        ' поместить значение в ячейку
        Range("KURS").Value = reRecordSet!Поле3
    Else
        MsgBox "Not Found"
    End If

    ' закрываем набор записей
    reRecordSet.Close
    ' закрываем базу данных
    dbAccess.Close
    ' все в норме конец
    GoTo Ends
    ' ошибка где-то однако
ErrorsDB:
    MsgBox "Произошла ошибка"
Ends:
End Sub

Поле с датой в файле Curs.mdb нужно перевести в текстовый формат. Теперь испытания. Введите дату и цену в $ и нажмите кнопку рядом с датой. Если дата есть, то курс поменяется, иначе получите сообщение, что нет данных Not Found. Поменяйте дату и опять нажмите кнопку. Все пересчитается. Вот пример работы:

44_2.gif (7468 b)

Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 45 - Начало и конец данных

Шаг 45 - Начало и конец данных

Если мы захотим изменить наш пример в плане, что нам цена нужна не только одного товара, но и нескольких скажем картошка, лук и апельсины, то возникнет вопрос как это сделать. Ответ это именованный диапазон. Тогда как определить его начало и конец ? В том смысле где находятся цифры ? Вот этим мы и займемся в этом шаге.

Создаем новую книгу и колонку A переименовываем в диапазон rrrrr.

45_1.gif (5385 b)

Так как диапазон есть, теперь к нему можно применять всякие там методы. Выделяем его Range, у Range есть метод End - мол где конец или начало :-))), а у End есть адрес вообще-то говоря смотрите !!!

Sub TestRange()
    Dim r As Range
    Set r = Range("rrrrr")
    MsgBox (r.Columns.End(xlUp).Address)
    MsgBox (r.Columns.End(xlDown).Address)
End Sub

Вот теперь мы и знаем адрес первой и последней ячейки !!!. Привяжем вызов данной процедуры к нажатию кнопки.

Private Sub CommandButton1_Click()
    TestRange
End Sub
Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 46 - Доступ к одинаковым элементам управления

Шаг 46 - Доступ к одинаковым элементам управления

Артем привет!
Есть вот такой код:
    str1.Cells(kod_filiala + 6, 4) = Val(Form2.TextBox1.Text)
    str1.Cells(kod_filiala + 6, 5) = Val(Form2.TextBox2.Text)
    str1.Cells(kod_filiala + 6, 6) = Val(Form2.TextBox3.Text)
    str1.Cells(kod_filiala + 6, 7) = Val(Form2.TextBox4.Text)
    str1.Cells(kod_filiala + 6, 8) = Val(Form2.TextBox5.Text)
    str1.Cells(kod_filiala + 6, 9) = Val(Form2.TextBox6.Text)
    str1.Cells(kod_filiala + 6, 10) = Val(Form2.TextBox7.Text)
    str1.Cells(kod_filiala + 6, 11) = Val(Form2.TextBox8.Text)
Возможно ли все эту писанину заменить на такую
    For i=1 to n
        Условия ......
    end if
т.е. чтобы ТекстБоксы перебирались как массив.
С Уважением, Владимир.
**********************************************
With best wishes, Vladimir(Владимир)
My E-mail stilvlad@chat.ru (text only, koi-8 only, 60 kb),
          stilvlad@mail.ru (all formats).
My Web: http://stilvlad.chat.ru
**********************************************
*Пожалуйста цитируйте всю переписку со мной*

Чтож давайте попробуем. Создаем книгу. На ней расположим именованные ячейки.

TB1
TB2
TB3
TB4

46_1.gif (3563 b)

Создали форму и на ней элементы TextBox. Внимание, сначала создавайте TextBox, а потом кнопки, это позволит избежать проверки типов для Controls. Имена:

TBB1
TBB2
TBB3
TBB4

46_2.gif (8277 b)

Код по кнопке "ДА":

Private Sub CommandButton1_Click()
    ' объект элемент управления
    Dim objObject As Control
    ' объект диапазон
    Dim raRange As Range
    ' строка с адресом диапазона
    Dim stAdders As String
    ' цикл по всем элементам управления
    For x = 0 To UserForm1.Controls.Count - 3
        ' присвоить обьекту элемент управления
        Set objObject = UserForm1.Controls.Item(x)
        ' создать адрес ячейки
        stAdders = "TB" + LTrim(Str(x + 1))
        ' получить диапазон
        Set raRange = Range(stAdders)
        ' присвоить ему значение из элемента управления
        raRange.Value = objObject.Text
    Next x
    ' закрыть форму
    Unload Me
End Sub

Код кнопки "нет":

Private Sub CommandButton2_Click()
    Unload Me
End Sub

Запускной макрос:

Sub TestForm()
    UserForm1.Show
End Sub

Вот и все. Попробуйте. Можете загрузить проект и посмотреть.

Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 47 - Свойства документов MSOffice

Шаг 47 - Свойства документов MSOffice

Аналогично свойству Tag форм и элементов управления, свойства документа позволяют программисту сохранять необходимую информацию (о возможности использования свойств, точнее их значений, для поиска документов здесь упоминать не будем - это пользовательская возможность). При необходимости эту информацию можно легко извлечь и использовать.

В VBA для MSOffice определены два типа свойств документов: встроенные (BuiltIn) и пользовательские (Custom). Оба типа свойств организованы в коллекции, соответственно BuiltInDocumentProperties и CustomDocumentProperties, относящиеся к объекту(ам) Document и Template. Нумерация элементов коллекций начинается с единицы.

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

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

Добавить нужное свойство (здесь и далее будем полагать, что работаем со свойствами активного документа) можно, использовав метод Add:

ActiveDocument.CustomDocumentProperties.Add _
Name:=PropertyName, _
LinkToContent:=False, _
Value:="", _
Type:=msoPropertyTypeString

В этой инструкции:

  • Name:=PropertyName - имя свойства, может быть сроковым выражением или переменной.
  • LinkToContent:=False, булево значение, определяющее связь с элементами контейнера в самом документе. Используя False, будет создано статическое свойство, именно оно и интересно. Если установить в True, то надо дополнительно определить LinkSource, указывающий на соотвествующий объект документа.
  • Value:="", собственно значение, необязательный параметр.
  • Type:=msoPropertyType, тип свойства, определены следующие константы типов (в скобках приведены числовые значения констант, тип Long):
    • msoPropertyTypeBoolean (2),
    • msoPropertyTypeDate (3),
    • msoPropertyTypeFloat (5),
    • msoPropertyTypeNumber (1), Чем по сути различаются два последних типа - не совсем ясно, по крайней мере оба они способны хранить double число и в стандартном диалог-боксе MSWord у них один тип - Number;
    • msoPropertyTypeString (4).

Обязательными элементами являются имя, тип и LinkToContent, значение можно не задавать.

Для считывания некоторого свойства просто пишем:

varProperty = ActiveDocument.CustomDocumentProperties.Item(Name)

где Name имя свойства или номер в коллекции.

Все было бы так просто, если бы не одна маленькая неприятность (по крайней мере, в MSOffice97 это так, а с ним еще долго будут работать пользователи). Неприятность заключается в том, что нет возможности прямо проверить, создано ли уже свойство с некоторым именем, а обращение к пустому свойству или попытка создания свойства с именем, совпадающим с именем уже определенного, вызывает ошибку (коды соответственно 5 и -2147467259 - не удивляйтесь, а распечатайте err.number!). Но такое поведение можно с легкостью использовать, написав свой обработчик ошибок.

Итак, необходимо присвоить пользовательскому свойству Test значение переменной strString, при этом не известно, существует ли в данный момент пользовательское свойство (даже если вы его уже когда-то определили, то ведь пользователь мог его удалить, значит такая ситуация является общей, а не частной). Вот фрагмент кода для решения такой задачи.

Dim strString as String

strString = "тестовое значение пользовательского свойства Test"
On Error GoTo AddCustomProperty		' устанавливаем обработчик ошибок
ActiveDocument.CustomDocumentProperties.Item("Test") = strString
On Error GoTo 0				' или туда, куда он был установлен ранее

Exit Sub
' ОБРАБОТЧИК(И) ОШИБОК
AddCustomProperty:
    Select Case Err.Number
    Case 5
        ' Этот номер ошибки возникает, если пытаемся писать
        ' в свойство, которое пока не создано
        ActiveDocument.CustomDocumentProperties.Add _
        Name:=PropName, LinkToContent:=False, Value:="", Type:=msoPropertyTypeString
        Resume ' возвращаем управление в оператор присвоения значения
    Case Else
        ' Вывод сообщений о других ошибках и прерывание программы
        MsgBox(Err.Number & Chr(13) & Chr(13) & Err.Description)
        Exit Sub
End Sub

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

Dim varProperty as Variant		' Явное указание типа Variant

On Error GoTo ReadCustomProperty	' устанавливаем обработчик ошибок
strString = ActiveDocument.CustomDocumentProperties.Item("Test")
On Error GoTo 0				' или туда, куда он был установлен ранее
......

Exit Sub
' ОБРАБОТЧИК(И) ОШИБОК
ReadCustomProperty:
    Select Case Err.Number
    Case 5
        ' Этот номер ошибки возникает, если пытаемся читать
        ' свойство, которое пока не создано
        varProperty = "" ' или "Null" или "NoProperty" - как нравится
        Resume Next		' возвращаем управление следующему оператору
                ' кстати, вместо возврата строки можно и свойство создать...
    Case Else
        ' Вывод сообщений о других ошибках и прерывание программы
        MsgBox(Err.Number & Chr(13) & Chr(13) & Err.Description)
        Exit Sub
End Sub

Существенно, что при считывании значения свойства производится автоматическое приведение типа (если оно возможно), и считывание, например, числа в стоковую переменную не приводит к ошибке.

Если задан номер пользовательского свойства, то легко можно узнать все его свойства (извините за каламбур), для этого достаточно написать (пример цикла для всех свойств):

For Each prop In ActiveDocument.CustomDocumentProperties
    With prop
        MsgBox .Name & "= " & .Value & Chr(13) & _
            "Application" & " = " & .Application & _
            "Creator" & " = " & .Creator & _
            "Parent" & "= " & .Parent
    End With
Next

Для всей коллекции пользовательских свойств легко получить число определенных свойств:

ActiveDocument.CustomDocumentProperties.Count

Очевидно, что индекс в цикле перебора всех свойств может пробегать от 1 до этого значения.

Для ситуации, когда надо создать свойство, можно тоже написать обработчик ошибок, но логика его работы уже будет сильно зависеть от функциональности программы, в которой он используется. Поэтому он здесь не приводится, однако информации для его написания достаточно. Повторим, что код ошибки для ситуации повторного определения свойства с некоторым именем, равен -2147467259 (знак минус!, впрочем, "правильный" код 440).

Написал и прислал шаг Dmitri Drozdov.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 48 - Встроенные свойства документов MSOffice

Шаг 48 - Встроенные свойства документов MSOffice

Хорошо писать прикладные программы для MSWord - вставил куда-либо поле {AUTOR} и получил информацию о том, кто автор документа (иногда, правда, это делать опасно - всплывают прелюбопытные подробности). А в других программах MSOffice? Сколько, например символов в таблице Excel? Так просто не получится... :-(

Для этой задачи может помочь коллекция BuiltInDocumentProperties. В MSOffice97 определено 30 (а не 28, как в документации) свойств, названия которых приведены в таблице. Все эти свойства могут быть прочитаны в любом документе MSOffice, вне зависимости от того, какая программа документ породила. Кроме чтения программным путем, MSWord (это уже упоминалось выше) позволяет вывести значение свойств документа в сам документ при помощи полей, но это к программированию на прямую не относится.

 | Название свойства | Назначение
1 | Title | Заголовок
2 | Subject | Предмет
3 | Author | Автор (создавший документ)
4 | Keywords | Ключевые слова
5 | Comments | Комментарии
6 | Template | Шаблон документа
7 | Last Author | Тот, кто последний сохранил документ
8 | Revision Number | Число входов для редактирования
9 | Application Name | Название приложения, обрабатывающего документ
10 | Last Print Date | Дата и время последней печати
11 | Creation Date | Дата создания
12 | Last Save Time | Дата и время последнего сохранения
13 | Total Editing Time | Общая продолжительность редактирования (минуты)
14 | Number of Pages | Число страниц
15 | Number of Words | Число слов
16 | Number of Characters | Число символов
17 | Security | Секретность
18 | Category | Категория
19 | Format | Формат
20 | Manager | Менеджер
21 | Company | Компания
22 | Number of Bytes | Размер файла в байтах в момент последнего сохранения
23 | Number of Lines | Число строк
24 | Number of Paragraphs | Число абзацев
25 | Number of Slides | Число слайдов (определено в PowerPoint, в остальных, вероятно, не используется)
26 | Number of Notes | Число заметок к слайдам (определено в PowerPoint, в остальных, вероятно, не используется)
27 | Number of Hidden Slides | Число скрытых слайдов (определено в PowerPoint, в остальных, вероятно, не используется)
28 | Number of Multimedia Clips | Число клипов (определено в PowerPoint, в остальных, вероятно, не используется)
29 | Hyperlink Base | База гиперссылок
30 | Number of Characters (with spaces) | Общеечисло символов, включая пробелы

Стоит иметь в виду, что при обращении к значению свойства, которое для данного документа не определено, также возникает ошибка выполнения с кодом -2147467259 (знак минус!), что требует аккуратной работы (см. примеры обработчиков ошибок в предыдущем шаге). Также приводит к ошибке попытка записи в свойство, которое данным приложением не поддерживается, что можно установить методом проб и ошибок. Но имена выводятся для всех свойств правильно. Практически полезной может оказаться такая процедура:

Sub test()

On Error GoTo NotDefined
' В следующей стороке ActiveDocument стоит заменть на ActiveWorkbook, etc
For Each prop In ActiveDocument.BuiltInDocumentProperties
    With prop
        PName = .Name
        PValue = .Value
        PType = .Type
        Debug.Print PName & " = " & PValue & " [" & PType & "]"
    End With
Next
Exit Sub
' ОБРАБОТЧИК ОШИБОК
NotDefined:
PValue = "Value not defined"
Resume Next
End Sub

Ее польза в том, что можно исследовать, какие свойства определены для данного типа документов, не появились ли новые свойства с выходом новой версии MSOffice (и не потерялись ли старые :-) ), какие у них типы. Тип выводится в виде целого числа. Результат ее работы (копия Debug Window):

Title = Свойства документов MSOffice [4]
Subject =  [4]
Author = DD [4]
Keywords =  [4]
Comments =  [4]
Template = Normal [4]
Last author = DD [4]
Revision number = 4 [4]
Application name = Microsoft Word 8.0 [4]
Last print date = Value not defined [3]
Creation date = 17.03.00 14:13:00 [3]
Last save time = 17.03.00 15:06:00 [3]
Total editing time = 67 [1]
Number of pages = 3 [1]
Number of words = 1183 [1]
Number of characters = 7702 [1]
Security = 0 [1]
Category =  [4]
Format =  [4]
Manager =  [4]
Company = SBC [4]
Number of bytes = 45056 [1]
Number of lines = 235 [1]
Number of paragraphs = 161 [1]
Number of slides = Value not defined [1]
Number of notes = Value not defined [1]
Number of hidden Slides = Value not defined [1]
Number of multimedia clips = Value not defined [1]
Hyperlink base =  [4]
Number of characters (with spaces) = 8995 [1]

Соответствие числа и предопределенных констант типов - ниже:

1 	msoPropertyTypeNumber
2 	msoPropertyTypeBoolean
3 	msoPropertyTypeDate
4 	msoPropertyTypeString
5 	msoPropertyTypeFloat

Свойства, недоступные в данном приложении, будут иметь вид: Number of slides = Value not defined [1]

Написал и прислал шаг Dmitri Drozdov.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 49 - Связывание макроса с кнопкой на панели инструментов

Шаг 49 - Связывание макроса с кнопкой на панели инструментов

Создавая интерфейс Ваш код на VBA в виде макросов можно разместить для доступа пользователей в несколько позиций:

  • Меню
  • Панели инструментов
  • Кнопки формы

Панели инструментов являются наиболее удобными и быстрыми для доступа. Для начала давайте создадим простой макрос. Ну хотя бы вот такой:

Sub Test()
    MsgBox "Hello"
End Sub

Теперь у нас есть, что связывать. Создать свою панель инструментов можно через меню Сервис - Настройка. У Вас по вызову этого пункта меню появляется диалоговое окно с тремя вкладками. Нас интересует сейчас "Панели инструментов", на которой находится кнопка Создать.

49_1.gif (4704 b)

По нажатию на эту кнопку у Вас появится диалоговое окно с предложением ввести имя. После этого можно смело жать OK. В Excel у Вас появится новая панель инструментов. Следующим шагом является помещение на эту панель настраиваемой кнопки. Нам нужно перейти на вкладку "Команды" и в списке "Категории" найти "Макросы", у Вас справа появится значек настраиваемая кнопка. Схватите ее мышкой и перенесите на панель инструментов.

49_2.gif (5466 b)

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

49_3.gif (5589 b)

После того как выбрали значек можно и привязать макрос. Опять по правой кнопке мыши есть пункт меню "Назначить макрос". Появится стандартное диалоговое окно с выбором макроса. Выберите его. Теперь осталось закрыть диалоговое окно. Если панель нужно отредактировать выберите опять этот пункт меню.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 50 - Определяем выделенную ячейку

Шаг 50 - Определяем выделенную ячейку

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

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    MsgBox Target.Address
End Sub

У Вас теперь есть возможность щелкать по ячейкам конкретного листа, я еще раз повторяю и вы получите сообщение с адресом ячейки. Сообщение выбора ячейки обрабатывается локально. А что если у нас надо обрабатывать это сообшение с трех листов и желательно вместе. Для этого нужно создать модуль и в нем процедуру обработки. Я пока поместил туда просто вывод информационного окна.

Public Sub Selection_Cell(ByVal Addres As String, ByVal List As String)
    MsgBox Addres + " " + List
End Sub

И соотвественно надо пересылать туда данный с каждого листа.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Selection_Cell Target.Address, Target.Worksheet.Name
End Sub

Вот с этого момента можно вставлять вызов функции Selection_Cell на каждый лист в ответ на реакцию выделения.

Но это еще не все. Дело в том, что передается объект типа RANGE, то есть нет разницы передана одна ячейка или диапазон. Но при выделении диапазона внутрь него может попасть и наша ячейка. Итак, нам надо бы анализировать диапазон. Давайте договоримся, что нам надо обязательно отловить момент выделения ячейки $A$1. Вот на всех листах. У нас для этого все есть. Процедура общая, в которой есть адрес. И реакция на выделение на каждом листе. Смотрим код:

Public Sub Selection_Cell(ByVal Addres As String, ByVal List As String)
    On Error GoTo Ends
    Dim Test As Range
    Dim Find As Range
    Dim Result As Range
    Dim x As Integer

    Set Find = Range("$A$1")
    Set Test = Range(Addres)

    Set Result = Intersect(Test, Find)
    x = Result.Count
    MsgBox "$A$1"
Ends:
End Sub

Идея простая. Мы имеем переданный диапазон Test и нужный Find. Как узнать, что один включает другой ??? Вызовем операцию пересечения Intersect. Результатом будет диапазон, который содержит пересечение. Так вот если искомая нам ячейка в нем есть, то нормально, а если нет, то обращение к Count вызовет ошибку. Этим мы и воспользовались.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 51 - Изучаем события Excel Workbook

Шаг 51 - Изучаем события Excel Workbook

Открытие книги:

Private Sub Workbook_Open()
End Sub

Активация окна. Вызывается в момент активации книги. Этот момент наступает в тот момент, когда из другой активной книги вы переходите к той, в которой обрабатывается событие. Например, при переключении книги в меню "Окно".

Private Sub Workbook_Activate()
End Sub

Закрытие окна. Вызывается перед закрытием книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub

Деактивация книги. Вызывается в момент перехода к другой книге:

Private Sub Workbook_Deactivate()
End Sub

Активация листа. Вызывается в момент смены листа:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub

Деактивация листа. Вызывается в момент смены листа для того листа, с которого уходят:

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
End Sub

Смена ячейки. Вызывается в момент смены диапазона или при редактировании ячейки:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
End Sub

Пересчет данных. Вызываться при пересчете данных, обычно пересчет связан с редактирование данных, поэтому ранее вызывается SheetChange практически всегда за исключением ручного пересчета.

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
End Sub

Переход к ячейке. Вызывается при переходе от одной ячейки к другой:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
End Sub

Разрешение на печать. Вызывается при выборе меню "Печать":

Private Sub Workbook_BeforePrint(Cancel As Boolean)
End Sub

Разрешение на сохранение. Вызываеться перед сохранением документа:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub

Создание нового листа. Вызывается в момент создания нового листа. Обычно ведет за собой целую цепочку событий - Workbook_NewSheet, Workbook_SheetDeactivate, Workbook_SheetActivate:

Private Sub Workbook_NewSheet(ByVal Sh As Object)
End Sub

Изменение размера листа. Вызывается в момент изменения размера листа:

Private Sub Workbook_WindowResize(ByVal Wn As Excel.Window)
End Sub

Активизация окна. Вызывается в момент активизации окна книги, например, при переключении на книгу:

Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
End Sub

Щелчок правой кнопкой. Вызывается по нажатию правой кнопки мыши:

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
End Sub

Выводы. Часть событий связана в цепочки. То есть, например, событие Activate для одного объекта это событие Deactivate для другого объекта. Это работает для Окон, Книг и Листов. Часть событий вызывают за собой следующие события, например, ввод данных приведет к пересчету листа. Или вставка нового листа к событиям активизации. Знание событий может помочь в решении нетривиальных вопросов. Вот так можно запретить печать книги.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 52 - Автоматизация на основе СУММЕСЛИ

Шаг 52 - Автоматизация на основе СУММЕСЛИ

Excel предоставляет огромное количество возможностей и знание этих возможностей значительно может помочь при создании приложений. Давайте рассмотрим обычную ситуацию с созданием счетов. У вас есть список товаров с ценами. Вы готовите счет с набором товаров в разных количествах.

Создаем новую книгу и лист переименовываем в "Цены", а на нем создаем два именованных диапазона. Диапазон name и диапазон price. В одном будет название товара, во втором цена. Внимание название товаров должно быть уникальным. То есть в таком варианте если делать как описано в шаге. Конечно сейчас на складах есть одни и теже товары с разными ценами. Но ведь к названию можно что-то добавить ??? Правда же ??? Именовать нужно целую колонку. Зачем ??? Чтобы спокойно добавлять новые товары и не думать о изменениях. Вот посмотрите рисунок демонструющий суть идеи.

52_1.gif (5674 b)

Делаем второй лист с названием "продаем". Здесь мы будем формировать наш счет. Помножить количество на цену и получить сумму, ну это не проблема. А вот как узнать цену исходя из названия ??? Тут нам и поможет СУММЕСЛИ, вот смотрите:

52_2.gif (3815 b)

Здесь написано, что суммировать по диапазону price, если в диапазоне name попадется название равное указанному в ячейке B4. На самом деле если названия уникальны никакого суммирования не будет, просто выберется нужная цена. Почему диапазон сделан на целую колонку ??? Чтобы спокойно добавлять или удалять названия и ни о чем не думать. И еще если в диапазоне указать что-то типа A1:A100, то при растаскивании вниз Excel будет менять адреса. А вот если у Вас диапазон не на всю колонку, то при растаскивании формул диапазон не будет меняться.

Ну вот и все. Достаточно ввести название, количество и вы получите общую цену. Надо еще один товар растащите формулу вниз и она будет работать. Теперь при доработке листа вам останется лишь вводить названия и количество.

52_3.gif (3521 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 53 - Разбор строки стандартными функциями

Шаг 53 - Разбор строки стандартными функциями

Итак, ситуация простая. У нас в одной ячейке записано имя и фамилия человека. Конечно это не хорошо. Но дело сделано и так оно есть. Cтрока представляет из себя набор символов, даже если она в ячейке Excel :-)

53_1.gif (438 b)

Соотвественно раз это набор символов, то должны быть и функции для определения количества символов. Они есть. Вот она =ДЛСТР(B5), если в B5 будет та надпить, то она вернет 11. Естественно, что первая буква будет первой :-)

Чтобы разделить имя и фамилию нам надо найти символ, на котором заканчивается имя. Этим символом почти всегда является пробел. Должна быть функция, которая умеет искать место символа в строке. Она тоже есть, =НАЙТИ(" ";B5;1) вернет первую позицию, в которой находится пробел. В данном случае 7.

Для отбора строки нам надо выбрать символ от начала до пробела и от пробела до конца. Начало мы знаем - это 1, пробел знаем - это 7, конец тоже - это 11. Осталось найти только функцию вырезания.

=ПСТР(B5;1;D5)
=ПСТР(B5;D5;C5)

Эта функция вырезает из строки символы от указанного значения до указанного. Соотвественно от начало до пробела - это фамилия, а от пробела до начала - имя. Все функции есть в мастере "функция" в разделе "текстовые".

53_2.gif (4337 b)

Вывод отсюда простой. Многие задачи можно сделать и без функций работы со строками VB(A). И, наверно, разумный компромис между VBA и возможностями Excel - это и есть мастерство создания приложений на базе Excel.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 54 - Подробнее о событиях загрузки и выгрузки формы

Шаг 54 - Подробнее о событиях загрузки и выгрузки формы

Форма в VBA это каркас приложения. Как добавлять форму в Ваш проект смотрите "Шаг 15 - Пользовательские формы". В основном события формы по ее инициализации и деинициализации разворачиваются в таком порядке:

Initialize
Load
Activate
Deactivate
QueryUnload
Unload
Terminate

Но форма в VBA и VB различаются. Давайте сравним:

VBA | VB
UserForm_Initialize() | Form_Initialize()
Нет | Form_Load()
UserForm_Activate() | Form_Activate()
UserForm_Deactivate() | Form_Deactivate()
UserForm_QueryClose(Cancel As Integer,CloseMode As Integer) | Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
нет | Form_Unload(Cancel As Integer)
UserForm_Terminate() | Form_Terminate()

Получается, что событие Load и Unload в VBA не обрабатываются.

Событие Initialize

Событие Initialize (Инициализация) обычно используется для подготовки к работе приложения или формы UserForm. Переменным присваиваются исходные значения, а положение или размеры элементов управления могут быть изменены для согласования с данными, заданными при инициализации. Это событие появляется до загрузки формы и ее отображения. Это событие появляется во время загрузки формы. Давайте в него напишем код:

Private Sub UserForm_Initialize()
MsgBox "UserForm_Initialize"
End Sub

А теперь две функции, которые вызывают Load:

Sub Test()
    Load UserForm1
    Call Test2
End Sub

Sub Test2()
    Unload UserForm1
    Load UserForm1
End Sub

В результате окно с информацией о инициализации будет на экране два раза. Так же это событие сгенерирует событие Show, так как первый раз для работы с формой ее нужно загрузить. Еще это событие может быть вызвано, если в форме определена функция общего назначения. Вызов этой функции опять приводит к загрузке формы.

Private Sub UserForm_Terminate()

End Sub

Public Sub MyMessage()
    MsgBox "MyMessage"
End Sub

А вот так можно вызвать:

Sub Test()
    UserForm1.MyMessage
End Sub

Итак, событие Intialize вызывается только один раз для формы перед ее загрузкой.

Событие Load

Нет ее в VBA, а вообще в VB здесь можно что-то сделать перед выводом формы на экран.

Событие Activate и Deactivate

Событие Activate происходит, когда объект становится активным окном. А становится активным окном он может в двух случаях. Это в результате Show, когда форма становится видимой на экране и в результате получения фокуса. Событие Deactivate (Деактивизация) происходит, когда объект более не является активным окном. Эти события генерируются только при переключении между окнами одного приложения. Если вы перейдете в другую программу и вернетесь в Excel, то эти события не будут сгенерированы.

Событие QueryClose

Это событие генерируется для того, чтобы получить у пользователя разрешение на закрытие формы. В зависимости от кода возврата форма закрывается или нет.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then Cancel = 1
        UserForm1.Caption = "Close не будет работать. Выберите меня!"
    End IF
End Sub

Событие Unload

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

Событие Terminate

Данное событие происходит, когда все ссылки на экземпляр объекта удаляются из памяти с помощью присвоения всем переменным, которые ссылаются на данный объект, состояния Nothing или когда последняя ссылка на объект выходит за пределы области определения. Это событие идет вслед за Unload.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 55 - Четыре основных метода работы с формой (Load,Unload,Show,Hide)

Шаг 55 - Четыре основных метода работы с формой (Load,Unload,Show,Hide)

Давайте сформулируем краткие описания и после этого посмотрим как они взаимодействуют:

  • Load - загрузка формы в память
  • Unload - выгрузка формы из памяти
  • Show - показ формы на экране
  • Hide - спрятать форму

Мы помним, что Show может сам вызвать Load, но если форма загружена, то Load не будет вызываться. Поэтому просто надо делать так:

Начало работы
Load
Конец работы
Unload

Показывать или прятать форму можно с помощью Show и Hide. Но, если Вы проводите в методе Initialize настройку переменных, то будьте уверены, что она будет происходить при загрузке в момент вызова Load.

Вот типовые коды:

Load
Load UserForm

Unload
Unload UserForm
Из формы
Unload Me

Hide
UserForm.Hide
Из формы
Me.Hide

Show
UserForm.Show


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 56 - Настройка свойств формы

Шаг 56 - Настройка свойств формы

Свойства формы можно менять, для этого достаточно вызвать меню левой кнопкой на форме.

56_1.gif (3128 b)

В результате этого появится окно свойств формы.

56_2.gif (4545 b)

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

Private Sub CommandButton1_Click()
    UserForm1.BackColor = RGB(255, 10, 10)
End Sub

Если запустить эту форму по нажатию на кнопку, то она станет красная.

Sub test()
    Load UserForm1
    UserForm1.Show
    Unload UserForm1
End Sub

А вот результат.

56_3.gif (2455 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 57 - Элементы для формы

Шаг 57 - Элементы для формы

Элемент управления, наверно, вторая главная составляющая интерфейса VBA после форм. Элементы управления позволяют Вам добавить в программу функциональность. Их два типа:

  • Встроенные - inherent
  • Нестандартные - custom

По умолчанию в новом проекте в панели инструментов находятся только нестандартные элементы управления.

57_1.gif (5175 b)

Но у Вас есть возможность добавлять в эту панель элементы ActiveX, которые могут существенно увеличить функциональность. Эти элементы в виде файлов OCX на данный момент реализовывают практически все. Достаточно нажать правую кнопку мыши на свободном месте в форме элементов управления и появится меню.

57_2.gif (4595 b)

Щелкнув по меню "дополнительные элементы" вы сможете выбрать любой элемент из тех, которые установлены в системе. Например, выберите календарь и нажмите кнопку OK.

57_3.gif (3503 b)

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

57_4.gif (4273 b)

Отсюда его можно помещать на форму. Для удаления его с панели инструментов достаточно снять галочку напротив него в дополнительных компонентах.

57_5.gif (3033 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 58 - Наборы элементов управления

Шаг 58 - Наборы элементов управления

В шаге "Шаг 46 - Доступ к одинаковым элементам управления" я показывал код как можно пройтись по всем элементам управления, но ничего практически не рассказал. Давайте обсудим это подробнее. VBA предоставляем массив включающий все элементы на форме с именем массива Controls:

58_1.gif (4170 b)

У этого массива есть ряд методов, но только одно свойство. Это свойство Count. Данное свойство возвращает количество элементов на форме.

Private Sub CommandButton1_Click()
    MsgBox UserForm1.Controls.Count
End Sub

С помощью этого массива можно ссылаться на элемент по индексу или по имени. У меня на форме два текстовых элемента, вот я их и спрячу двумя способами по нажатию на кнопку.

Private Sub CommandButton1_Click()
    Controls(0).Visible = False
    Controls("TextBox2").Visible = False
End Sub

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

Private Sub CommandButton1_Click()
    Dim ctrl As Control
    For Each ctrl In Controls
        If TypeName(ctrl) = "TextBox" Then
            ctrl.Visible = False
        End If
    Next ctrl
End Sub

Функция TypeName возвращает значение типа String, представляющее тип переменной за исключением типа определенного пользователем с помощью Type.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 59 - Проверка ввода на уровне формы (KeyDown, KeyUp, KeyPress)

Шаг 59 - Проверка ввода на уровне формы (KeyDown, KeyUp, KeyPress)

События:

KeyDown
KeyUp
KeyPress

Посылаются форме когда производится ввод данных. Событие KeyPress возникает когда пользователь нажимает клавишу, у которой есть ASCII код. Это событие не сгенирируется при нажатии функциональных клавиш. При том эти события есть как у формы:

Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

End Sub

Так и у элементов управления TextBox, например:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

End Sub

А это в свою очередь позволяет проверять ввод. Например, если в поле нужно ввести цифру, то легко проверить, что вводит пользователь. События KeyUp и KeyDown применяются для специальных функциональных клавиш или комбинаций типа Ctrl+Del, так как событие KeyPress их не отловит. Удобно использовать данное событие для проверки заполненности полей. Вот форма:

А вот код для нее. В момент нажатия ввода символа в поле проверяется заполненость полей:

Private Sub Test()
    Dim ctrl As Control
    Dim bool As Boolean
    bool = True
    For Each ctrl In Controls
        If TypeName(ctrl) = "TextBox" Then
            If ctrl.Text = "" Then
                bool = False
            End If
        End If
    Next ctrl
    UserForm1.CommandButton1.Enabled = bool
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Call Test
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Call Test
End Sub

Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Call Test
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 60 - Проверка и настройка ввода в TextBox

Шаг 60 - Проверка и настройка ввода в TextBox

У элемента управления есть несколько свойств, которые позволяют на этапе проектирования ограничить ввод пользователя. Вот они:

MaxLength
PasswordChar
Locked

Свойство MaxLength позволяет ограничить количество символов, которые будут введены. Если пользователь попробует ввести больше, то будет звуковой сигнал. PasswordChar не дает возможности просматривать вводимые символы заменяя их на звездочки (*). Это полезно, как видно из имени, при вводе пароля. Свойство Locked определяет может ли пользователь редактировать поле. Посмотрите пример:

60_1.gif (2006 b)

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

60_2.gif (3657 b)

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

Кстати Locked говорит, что поле для чтения, но в некоторых ситуациях его можно открыть для редактирования программным путем.

Private Sub CommandButton1_Click()
    TextBox3.Locked = False
End Sub

Тоже самое и с MaxLength:

Private Sub CommandButton1_Click()
    TextBox3.Locked = False
End Sub

И PasswordChar:

Private Sub CommandButton1_Click()
    TextBox2.PasswordChar = "x"
End Sub

При изменении свойств данные в полях не пропадают.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 61 - О MaskEdBox

Шаг 61 - О MaskEdBox

Это элемент ввода, в котором можно использовать маску ввода. Вам нужно ее добавить.

61_1.gif (3491 b)

В результате на панели инструментов добавится новый значок.

61_2.gif (1882 b)

Одно из его важных свойств - это свойство Mask:

61_3.gif (2996 b)

С помошью этой маски легко задать форматирование текста. Например, вот такое для ввода телефона.

(###)###-###

Теперь при вводе у Вас будет шаблон:

61_4.gif (1274 b)

Для программной очистки необходимо ввести саму маску, например, вот так:

Private Sub CommandButton1_Click()
    MaskEdBox1.Text = "(___)___-___"
End Sub

Кодов для ограничения ввода много, но вот минимальные:

# - число
a - символ


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 62 - Maskedit - Text и ClipText

Шаг 62 - Maskedit - Text и ClipText

Эти два свойства позволяют получить данные из элемента Maskedit. Отличие этих свойств в том, что поле Text возвращает строку вместе с маской, а ClipText без маски. Давайте посмотрим. Вот данные введенные в маску.

62_1.gif (394 b)

Давайте посмотрим как они будут возвращаться в случае применения этих двух свойств. Делаем код для кнопок:

Private Sub CommandButton1_Click()
    Debug.Print MaskEdBox1.Text
    Debug.Print MaskEdBox1.ClipText
End Sub

И смотрим результат:

(12)34
1234

Данные свойства удобны при помещении данных в базу данных и обратно с маской, которую база данных не поддерживает.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 63 - Обработка ошибок в VBA

Шаг 63 - Обработка ошибок в VBA

Обрабатывать ошибки можно тремя способами:

  1. Строчная обработка
  2. Создание локального обработчика
  3. Создание глобального обработчика

Для строчной обработки ошибок применяется функция On Error Resume Next, при использовании этой функции выполнение работы программы не прерывается. В этот момент в объект Err помешается код ошибки, который можно выяснить через свойство Number. После обработки ошибки его необходимо очистить, воспользовавшись методом clear:

Sub Test()
    On Error Resume Next
    Open "c:\nullfile.nul" For Input As #1
    Select Case Err.Number
    Case 53:
        MsgBox "Not file"
    Case 55:
        MsgBox "Not access"
    End Select
    Err.Clear
End Sub

Строчный обработчик можно отключить.

On Error Goto 0

Локальный обработчик специфичен для конкретной процедуры. То есть для каждой процедуры вы создаете свой обработчик ошибок. Общий вид такой:

On Error Goto ErrorHandle
    код
Exit Sub
ErrorHandle:
    Код обработки ошибки
End Sub

Обратите внимание на Exit Sub, который предназначен для выхода из процедуры. Если этого не сделать, то код предназначенный для обработки ошибок все равно выполнится, а это недопустимо. После обработки ошибки вы должны возобновить работу программы. Есть три способа:

  • Повтор выполнения строки - Resume
  • Выполнение следующей строки - Resume Next
  • Закрытие формы - Unload Me

При отсутствии обработчика ошибок будет произведен поиск обработчика в вызывающей процедуре, если там его нет, то дальше по цепочке вызовов. Но при этом возобновление выполнения команд будет довольно сложным. Так как Resume, Resume Next будет работать в зависимости от того в какой процедуре оказалась ошибка.

Sub ErrorTest()
    On Error GoTo Error:
    Call Test
Error:
    Select Case Err.Number
    Case 53:
        MsgBox "Not file"
    Case 55:
        MsgBox "Not access"
    End Select
    Err.Clear
End Sub

Sub Test()
    Open "c:\nullfile.nul" For Input As #1
End Sub

Централизованная обработка ошибок необходима, если ошибки могут возникнуть в разных местах, а обрабатывать лучше в одном. Например, во многих местах программы производится создание файлов. Идея заключается в том, что создание файла всегда производится в одной процедуре где и проводится обработка ошибок.

Sub ErrorTest()
    Call Test
End Sub

Sub Test()
    On Error GoTo Error:
    Open "c:\nullfile.nul" For Output As #1
    Close #1
    Exit Sub
Error:
    MsgBox "error"
    Err.Clear
End Sub

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 64 - Функция автоматической проверки синтаксиса

Шаг 64 - Функция автоматической проверки синтаксиса

Как в VB, так и в VBA автоматически проверяются синтаксические ошибки, но только в том случае, если проверка включена в Сервис -> Параметры.

64_1.gif (2166 b)

Если эта опция включена, то при проверке синтаксиса Вам будет выводиться сообщение о том, что Вы неправильно пишите. Например, если не завершить IF, то сразу после набора строки Вы получите сообщение.

64_2.gif (3569 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 65 - Выделение диапазона выше текущей ячейки

Шаг 65 - Выделение диапазона выше текущей ячейки

Задача выделить диапазон выше текущей ячейки:

65_1.gif (1052 b)

А вот и код с комментариями:

Sub SelectColumnData()
    ' что делать при ошибке
    On Error GoTo errors
    ' нижний адрес
    Dim a1 As String
    ' верхний адрес
    Dim a2 As String
    ' диапазон
    Dim ran As Range
    ' если не верхняя ячейка
    If (ActiveCell.Row <> 1) Then
        ' пойти вверх
        ActiveCell.Offset(-1, 0).Select
        ' взять адрес ячейки
        a1 = ActiveCell.Address
        ' будем подниматься
        For x = 1 To (ActiveCell.Row - 1)
            ' на одну вверх
            ActiveCell.Offset(-1, 0).Select
            ' если не число выход
            If IsNumeric(ActiveCell.Value) <> True Then
                ' на одну вниз
                ActiveCell.Offset(1, 0).Select
                ' выход
                GoTo nexts
            End If
            ' если пустая
            If IsEmpty(ActiveCell.Value) = True Then
                ' на одну вниз
                ActiveCell.Offset(1, 0).Select
                ' выход
                GoTo nexts
            End If
        Next x
    nexts:
        ' получаем адрес вырехней
        a2 = ActiveCell.Address
        ' строим диапазон
        Set ran = Range(a1 + ":" + a2)
        ' выделяем
        ran.Select
    End If
    ' выходим из процедуры
    Exit Sub
    ' ошибка, зовем на помощь
errors:
    MsgBox "Ошибка сообщите разработчику"
End Sub

А вот и результат:

65_2.gif (832 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 66 - Движение по диапазону

Шаг 66 - Движение по диапазону

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

Sub FullShach()
    For Each c In Range(addressdiap)
        If c.Value > yr1 Then
            c.Select
            With Selection.Interior
                .ColorIndex = 6
                .Pattern = xlSolid
            End With
            Selection.Font.ColorIndex = yrcolor1
            If c.Value > yr2 Then
                c.Select
                Selection.Font.ColorIndex = yrcolor2
                If c.Value > yr3 Then
                    c.Select
                    Selection.Font.ColorIndex = yrcolor3
                End If
            End If
        End If
    Next c
End Sub

Основа этой функции цикл For Each c In Range(addressdiap), который будет перебирать ячейки в диапазоне и возвращать каждую ячейку в переменную цикла c. Для того, чтобы можно было произвести работу с этой ячейкой ее надо выделить c.Select.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 67 - Движение по ячейкам

Шаг 67 - Движение по ячейкам

Для движения по таблице используется функция.

переменная.Offset(RowOffset, ColumnOffset)

В качестве переменных может выступать как ячейка так и диапазон (Range) удобно пользоваться этой функцией для смещения относительно текущей ячейки.

Например, смещение ввниз на одну ячейку и выделение ее:

ActiveCell.Offset(1, 0).Select

Если нужно двигаться вверх, то нужно использовать отрицательное число:

ActiveCell.Offset(-1, 0).Select

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

Sub beg()
    Dim a As Boolean
    Dim d As Double
    Dim c As Range
    a = True
    Set c = Range(ActiveCell.address)
    c.Select
    d = c.Value
    c.Value = d
    While (a = True)
        ActiveCell.Offset(1, 0).Select
        If (IsEmpty(ActiveCell.Value) = False) Then
            Set c = Range(ActiveCell.address)
            c.Select
            d = c.Value
            c.Value = d
        Else
            a = False
        End If
    Wend
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 68 - Как сделать XLA ?

Шаг 68 - Как сделать XLA ?

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

68_1.gif (5469 b)

В результате у нас будет файл с расширением XLA.

68_2.gif (399 b)

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

Private Sub Workbook_AddinInstall()

End Sub

Private Sub Workbook_AddinUninstall()

End Sub

Они будут вызываться при установке или удалении дополнения через меню "сервис -> надстройки".

68_3.gif (2901 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 69 - Динамическое создание меню

Шаг 69 - Динамическое создание меню

Смотрим код:

Const menuname = "Геохимия"

Private Sub Workbook_AddinInstall()
    ' обработка ошибки
    On Error GoTo errors:
     Dim num As Integer
    ' получаем количество пунктов меню
     num = Application.CommandBars("Worksheet Menu Bar").Controls.Count
    ' добавляем 1 для следующего
    num = num + 1
    Dim a As CommandBarControl
    ' создаем новый пункт меню
    Set a = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, Before:=num)
    ' даем имя
    a.Caption = menuname
    Dim help As CommandBarControl
    Set help = Application.CommandBars("Настраиваемое всплывающее меню1").Controls.Add(Type:=msoControlButton, Before:=1)
    help.Caption = "Помощь"
    help.OnAction = "Help"
    Dim comms As CommandBarControl
    Set comms = Application.CommandBars("Настраиваемое всплывающее меню1").Controls.Add(Type:=msoControlButton, Before:=2)
    comms.Caption = "Расчет аномальных значений нормальный закон"
    comms.OnAction = "Anomal"
    Dim commslog As CommandBarControl
    Set commslog = Application.CommandBars("Настраиваемое всплывающее меню1").Controls.Add(Type:=msoControlButton, Before:=3)
    commslog.Caption = "Расчет аномальных значений логнормальный закон"
    commslog.OnAction = "Anomallog"
    Dim commsbeg As CommandBarControl
    Set commsbeg = Application.CommandBars("Настраиваемое всплывающее меню1").Controls.Add(Type:=msoControlButton, Before:=4)
    commsbeg.Caption = "Пробежаться по значения"
    commsbeg.OnAction = "beg"
    Exit Sub
    ' что будем делать при ошибке
errors:
    MsgBox Err.Description + " соoбщите разработчику"
    Err.Clear
End Sub

Основа кода коллекция CommandBars, которая отвечает коллекции меню. У этой коллекции есть метод Add, после которого меню надо присвоить название и имя макроса.

help.Caption = "Помощь"
help.OnAction = "Help"

Удаляется меню по имени. Вот код:

Private Sub Workbook_AddinUninstall()
    On Error GoTo errors:
    Application.CommandBars("Worksheet Menu Bar").Controls(menuname).Delete
    Exit Sub
    ' что будем делать при ошибке
    MsgBox "не могу удалить пункт меню"
errors:
End Sub

Если Вы обратите внимание, то меню устанавливается при подключении расширения Excel, а удаляются при его отключении.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 70 - Нефть, таблицы и как делать не надо

Шаг 70 - Нефть, таблицы и как делать не надо

Вот такое письмо.

Добрый день Артем.
Дело в том что с этими данными также нужно производить
другие расчеты и представлять их геологам, в Access'e по
моему это сделать будет немного проблематично да и неудобно
для передачи. так что лучше наверное все же в Excel'e. Ну ты
понял в чем именно суть проблемы да? еще раз повторюсь чтобы
уж не было непоняток, а то может объяснил я не так. имеется таблица.
1 столбец имя скважины, второй насыщение пропластка.
Выглядит это следующим образом:
1210k	Нефть
1210k	Нефть
1210k	НВ
1210k	Неясно
1231	Вода
1231	Вода
1231	Вода
1231	Вода
По скважине 1210к есть насыщение нефть, нв и неясно. соответственно тип
скважины нефтенасыщенный 1231 только вода значит водо-насыщенная и т.д.
в таком же духе. Вот.
С уважением Рустам Сафиуллин
mailto: rustam@geodata.ru

Первая мысль которая родилась у меня после этого письма послать все к черту вмеcте с автором. Это классическая задача баз данных. Любые расчеты и все такое можно решить с помощью того же ACCESS и намного проще. Кроме того большая часть кода ниже будет просто реализация стандартного SQL запроса. Кроме того, код подвержен ошибкам в данных ведь Нефт и Нефть не одно и тоже. Но мой опыт работы с геологами показывает что объяснять им что то бесполезно. Можно и на EXCEL сделать. Можно неправильно но можно. Итак таблица выгляди вот так.

70_1.gif (2762 b)

Сначала нужно определить где начинаются и заканчиваться данные, это написано в "Шаг 45 - Начало и конец данных".

Dim allbore As Range ' здесь будет храниться диапазон скважин
' выбрать колонку
Set allbore = Range("A:A")
' только с данными
Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
' выделить
allbore.Select

А вот результат:

70_2.gif (3054 b)

Теперь нам нужно создать список скважин которые есть, способ один перебрать все записи и уникальные поместить у коллекцию. Как двигаться по диапазону написано в шаге "Шаг 66 - Движение по диапазону".

Dim borename As New Collection ' это набор скважин

Sub FindOil()
    Dim allbore As Range ' здесь будет храниться диапазон скважин
    Set allbore = Range("A:A") ' выбрать колонку
    ' только с данными
    Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
    allbore.Select 		 	' выделить
    For Each bore In allbore 	' бежим по диапазону скважин
        bore.Select  		' выделяем ячейку
        borename.Add (bore.Value)   ' добавить к коллекцию
    Next bore
End Sub

Вот теперь у нас в коллекции все имена скважин. Но они повторяться же. Надо при добавлении проверять есть такое имя в коллекции или нет. Напишем функцию.

Function FindElement(name As String) As Boolean
    ' бежим по коллекции
    For Each elem In borename
        ' если имя совпадает вернуть FALSE
        If elem = name Then
            FindElement = False
            Exit Function
        End If
    Next elem
    ' нет имени
    FindElement = True
End Function

И применим ее:

Dim allbore As Range ' здесь будет храниться диапазон скважин

Sub FindOil()
    Set allbore = Range("A:A") ' выбрать колонку
    ' только с данными
    Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
    allbore.Select ' выделить
    For Each bore In allbore ' бежим по диапазону скважин
        bore.Select  ' выделяем ячейку
        If FindElement(bore.Value) = True Then
        ' если скважины нет в коллекции
            borename.Add (bore.Value)   ' добавить к коллекцию
        End If
    Next bore
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 71 - Нефть, таблицы и как делать не надо, продолжение

Шаг 71 - Нефть, таблицы и как делать не надо, продолжение

Итак, теперь нам нужно в соответствии с номером скважины делать выборку. Заведен еще один массив.

Dim allbore As Range 		' здесь будет храниться диапазон скважин
Dim alldata As Collection 	' это набор элементов
Dim borename As New Collection 	' это набор скважи

Напишем функцию которая будет заполнять коллекцию по именам скважины:

Sub SelectBore(s As String)
    Set alldata = New Collection
    For Each bore In allbore ' бежим по диапазону скважин
        bore.Select  ' выделяем ячейку
        If bore.Value = s Then  ' если это та скважина
            ActiveCell.Offset(0, 1).Select ' вправо
            alldata.Add (ActiveCell.Value) ' поместить в коллекцию
        End If
    Next bore
End Sub

Пробежим по всем скважинам и возмем значение из правой колонки поместив его а массив.

Sub FindOil()
    Set allbore = Range("A:A") ' выбрать колонку
    ' только с данными
    Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
    allbore.Select ' выделить
    For Each bore In allbore ' бежим по диапазону скважин
        bore.Select  ' выделяем ячейку
        If FindElement(bore.Value) = True Then ' если кважины нет в коллекции
            borename.Add (bore.Value)   ' добавить к коллекцию
        End If
    Next bore
    For Each elem In borename
        SelectBore (elem)
        Debug.Print (elem)
        For Each data In alldata	' пробежим по результату для того что бы
                    ' показать что массив заполнен
            Debug.Print (data)
        Next data
    Next elem
End Sub

В окне отладки можно увидеть, что массив заполнен значениями соответствующими скважинам на данный момент.

71_1.gif (2303 b)

Ну, а теперь можно исследовать этот массив на пример решения какая скважина. Вообщем то на самом деле я просто повторил работу БД. Сделал выборку. Давайте попробуем сделать простой выводы. Например если упоминается нефть но она нефтенасышенная иначе пусто.

Sub FindOil()

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

    For Each elem In borename
        SelectBore (elem)
        Debug.Print (elem)
        For Each data In alldata	' пробежим по результату для того что бы
                    ' показать что массив заполнен
            'Debug.Print (data)
              If data = "Нефть" Then
                MsgBox "Oil !!!!!! " + elem
                Exit For
            End If
        Next data
    Next elem
End Sub

При работе этой функции будет два окна для скважины с нефтью.

71_2.gif (5184 b)

Загрузить проект | Предыдущий Шаг | Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 72 - Как создать свою функцию

Шаг 72 - Как создать свою функцию

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

72_1.gif (4937 b)

Потом в модуле Вы создаете функцию:

Function Test(i As Integer) As Integer
    Test = i + 5
End Function

Все можно переходить на таблицу и использовать:

72_2.gif (1908 b)

Функция как родная.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 73 - Выделенный диапазон Выше ячейки, второй метод

Шаг 73 - Выделенный диапазон Выше ячейки, второй метод

Добрый день!

Мне очень понравился Ваш сайт. Большое Вам за него спасибо! Особенно привлекательным его делает то, что различные среды программирования Вы рассматриваете не только по отдельности, но также разбираете связь между ними, например, написание DLL для Excel в VC++.

Однако, некоторые примеры вызывают возражения. Вот, скажем, задача выделить диапазон выше текущей ячейки (см. "Шаг 65 - Выделение диапазона выше текущей ячейки"). По-моему, слишком длинное решение такой простой задачи. Я бы это сделал так, воспользовавшись методом Union:

Sub SelectColumnData()
    If ActiveCell.Row = 1 Then Exit Sub
    If ActiveCell.Offset(-1, 0) <> "" Then
        ActiveCell.Offset(-1,0).Activate
    If ActiveCell.Row = 1 Then Exit Sub
    Do While Not ActiveCell.Offset(-1, 0) = ""
        Union(Selection, ActiveCell.Offset(-1, 0)).Select
        If ActiveCell.Row = 1 Then Exit Do
    Loop
End Sub

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

Гуляев Александр Gulyaev@gw.tander.ru

Предыдущий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 1 - Что такое Access

Шаг 1 - Что такое Access

Access - это персональная База данных входящая в комплект Microsoft Office 97 Professional, хотя она входила и в более старые версии. Мы с Вами будет говорить именно об этой версии, так как я ее использую, хоть это и не скромно. Обратите внимание, что Office должен быть именно Professional. Есть выпуски где Access не поставляется в принципе. Если Access у Вас установлен, то найти его можно в меню Пуск -> Программы -> Microsoft Access. Если вы запустите его, то увидите такую картинку.

1.gif (4333 b)

Нажмите Отмена. Ну и закройте его через Файл -> Выход, ну чего такого программа, меню. Конечно. Но нельзя рассказывать о Access не создавая самой базы данных. А это в следующем шаге :-).

Что же такое База Данных (БД) вообще? Это набор таблиц связанных или нет, но набор таблиц состоящих из колонок и строк. Колонки именют строгий формат, то есть или цифры или буквы или еще чего. Это минимум для базы данных. Access - это конкретная реализация общей идеи базы данных при том персонального использования. То есть ее желательно использовать на одном компе, ну и несколько аналогов есть

FoxPro
Paradox

Если же Вы хотите сделать БД предприятия, то лучше искользовать конечно сервера баз данных, такие как

Oracle
Ms SQL Server

Но Вы можете потом на эти сервера данные перекинуть, а с помошью Access проводить проектирование или решать конкретные задачи не трубующие масштаба предприятия. Кроме того можно подойти к БД формируемой Aссеss как просто к формату хранения данных, а логику реализовывать на VB, VC и т.д.

Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 2 - Создаем пустую БД

Шаг 2 - Создаем пустую БД

Запускать Access мы научились на прошлом занятии :-). Теперь научимся создавать БД. База данных Access хранится в файле с расширением *.mdb. Для того, чтобы создать эту базу нам нужно выбрать меню Файл -> Создать базу данных. В ответ на этот решительный шаг у Вас спросят, что Вы хотите делать, то ли создавать новую и пустую, то ли на основе шаблона. Мы с Вами будем создавать новую и пустую. Посмотрите на рисунок ниже. У вас должно быть так.

2_1.gif (2185 b)

Теперь Вы можете смело жать Ok и Вам предложат выбрать место хранения файла и имя файла.

2_2.gif (3497 b)

Дайте имя test и нажмите создать, в ответ на это Access ее создаст. Будет создан файл по умолчанию в "Мои документы" размером около 60 kb. У вас появится окно с панелями и надписями типа Форма, Запрос с этим мы разберемся в следующем шаге, а пока я Вас поздравляю. Вы создали первую пустую БД :-)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 3 - Обзор инструментов

Шаг 3 - Обзор инструментов

Сам формат данных в принципе несет некоторые выгоды, но главным является инструментарий, который позволяет управлять этими данными. Посмотрите на окно пустой БД.

3.gif (3582 b)

Итак, что Вы видите на экране ? Тут есть некоторые различия несмотря на вкладки. Место хранения данных это таблицы, а вот остальное это инструменты для работы с этими таблицами и создание пользовательского интерфейса. Вообщем все эти элементы имеют некоторую структуру.

 Таблица    Таблица   Таблица <--------
    |          |         |            |
    ----------------------            |
               |                      |
               |                      |
             Запрос           <--------	Макросы Модули
               |                      |
               |                      |
    ----------------------            |
    |                    |            |
  Форма                Отчет  <--------

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

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

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

Отчеты - это средство для вывода данных на экран или печать в удобном виде, который можно тоже создавать. Строятся отчеты на основе запросов.

Макросы - это средства автоматизации, которые позволяют с помощью готовых команд создать последовательность выполнения.

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 4 - Режимы работы Access

Шаг 4 - Режимы работы Access

Есть три режима работы Access, это:

  • Начальный
  • Режим конструктора
  • Режим работы

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

4_1.gif (8641 b)

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

4_2.gif (8490 b)

Режим выполнения. Если, например, форма отредактирована, то у Вас есть возможность ее запустить, вот для этого и предназначен этот режим, можно сказать, что это режим пользователя. Очень удобно переключаться между режимами при создании и редактировании формы для просмотра результата с помощью кнопочек упомянутых на рисунке.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 5 - Создаем таблицу

Шаг 5 - Создаем таблицу

Ну вот нам и пора создать таблицу. Запускаем Access и выбирам вкладку Таблицы. На данный момент у нас есть возможность нажать только на одну кнопку Создать. Вот давайте и нажмем на нее. У вас появится окно с возможными режимами.

5_1.gif (3630 b)

Нам нужен конструктор. Он на рисунке обведен красным. Выберите его и нажмите Ok. У нас появится таблица, в которой есть колонки - Имя поля, Тип данных, Описание. Давайте создадим телефонный справочник. Вот как надо заполнить:

5_2.gif (3073 b)

В имени поля будем содержать имя, по которому будет производится связь данных внутри него с элементами на форме, и на основе которого будет формироваться запрос. Тип данных это какая информация содержится в поле то ли это текст, то ли цифры. А описание это Ваши примечания, так как все что Вы сейчас помните завтра может быть уже не так понятно. Это проверено поэтому не пренебрегайте этой возможностью. Если Вы обратите внимание, то перед ID стоит ключик. Это уникальное число, которое будет идентифицировать запись. То есть это число будет всегда уникальное, что бы Вы не делали с базой или таблицей. И по этому числу Вы всегда точно сможете определить запись. Для того, чтобы поле сделать ключевым Вам надо нажать на нем правую кнопку мыши и сказать "Ключевое поле".

5_3.gif (2827 b)

Теперь нам эту таблицу нужно сохранить. Нажмите на крестик в правом углу и у Вас спросят надо-ли ее сохранять. Конечно надо, поэтому скажите Да. Следом появится окно с просьбой о имени таблицы, поменяйте ее на телефоны и скажите OK. Вот теперь на вкладке таблицы появится Ваша таблица.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 6 - Импорт таблиц

Шаг 6 - Импорт таблиц

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

ACCESS (MDB)
     |
импорт и ссылка
     |
DBF EXCEL HTML etc...

То есть вы можете использовать ACCESS как средство создания интерфейса к старым базам данных или быстро перевести в формат ACCESS. Это очень не плохая идея обратите внимание на нее. Ну, например, с такой стороны. У вас есть готовое приложение на Fox Pro с кучей таблиц. Это приложение умеет делать много, но вот оно скомпилированно в fxp. И код исходный не доступен. А тут, скажем, бухгалтерию обязали сделать новые отчеты, ну чего будем делать то ??? Изучать Fox Pro ? Проще конвертировать таблицы или сослаться на них и пользуясь всеми преимуществами Access создать запрос и отчет. Помните об этом ходе из своего опыта говорю ! ПРИГОДИТСЯ !!!

Как же это сделать то ??? Перейдите на вкладку таблицы и нажмите правую кнопку мыши, там Вы увидите два пункта меню Связь и Импорт.

6.gif (3291 b)

Важно понимать разницу между связями и импортом. При импорте таблица помещается навсегда, то есть изменения останутся только в MDB, а вот при связи изменения будут и в исходной таблице. Вот так.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 7 - О полях в таблицах

Шаг 7 - О полях в таблицах

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

Текстовый (Значение по умолчанию). Текст или числа, не требующие проведения расчетов, например, номера телефонов. Число символов, не превышающее минимальное из двух значений: 255 или значение свойства Размер поля (FieldSize). Microsoft Access не сохраняет пустые символы в неиспользуемой части поля.

Поле МЕМО. Длинный текст или комбинация текста и чисел. До 65535 символов. (Если поле MEMO обрабатывается через объекты доступа к данным (DAO) и содержит только текст и числа, а не двоичные данные, то его размер ограничивается размером базы данных).

Числовой. Числовые данные, используемые для проведения расчетов.

Дата/время. Даты и время, относящиеся к годам с 100 по 9999, включительно. 8 байт.

Денежный. Денежные значения и числовые данные, используемые в математических расчетах, проводящихся с точностью до 15 знаков в целой и до 4 знаков в дробной части. 8 байт.

Счетчик. Уникальные последовательно возрастающие (на 1) или случайные числа, автоматически вводящиеся при добавлении каждой новой записи в таблицу. Значения полей типа счетчика обновлять нельзя. Подробнее см. в разделе справки для свойства "Новые значения" (NewValues). 4 байт (16 байт, если для свойства "Размер поля" (FieldSize) задано значение кода репликации).

Логический. Логические значения, а также поля, которые могут содержать одно из двух возможных значений (True/False, Да/Нет). 1 бит.

Поле объекта OLE. Объект (например, электронная таблица Microsoft Excel, документ Microsoft Word, рисунок, звукозапись или другие данные в двоичном формате), связанный или внедренный в таблицу Microsoft Access. До 1 Гбайт (ограничивается объемом диска).

Гиперссылка. Строка, состоящая из букв и цифр, и представляющая адрес гиперссылки. Адрес гиперссылки может состоять максимум из трех частей: текст ? текст, выводимый в поле или в элементе управления;адрес ? путь к файлу (в формате пути UNC) или странице (адрес URL).дополнительный адрес ? смещение внутри файла или страницы. Чтобы вставить адрес гиперссылки в поле или в элемент управления, выберите команду "Гиперссылка" из меню "Вставка". Для получения дополнительных сведений см. раздел "Ввод адреса гиперссылки в режиме формы и в режиме таблицы". Каждая из трех частей в типе "Гиперссылка" может содержать до 2048 символов.

Мастер подстановок. Создает поле, в котором предлагается выбор значений из списка, или из поля со списком, содержащего набор постоянных значений или значений из другой таблицы. Выбор этого параметра в списке в ячейке запускает мастера подстановок, который определяет тип поля. Тот же размер, что и у ключевого поля, используемого в подстановке (обычно 4 байт).

Обычная Ваша задача сопоставить тип поля с типом информации. Следует отметить преимущество Access для текстового поля. Очень часто СУБД хранят данные в тестовом поле даже если оно не заполнено. Ну, например, для FoxPro. Вы указываете ширину поля скажем 100 символов по самому длинному названию и у Вас есть 1000 записей. Независимо от заполнености размер файла на диске составит 1000 Х 100. Access устраняет этот недостаток и хранит только реальные данные.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 8 - Форма для ввода с волшебником

Шаг 8 - Форма для ввода с волшебником

Вот о таблицах мы получили некоторое начальное представление, пора получить представление, пора и сделать форму или нет пора, я думаю, что-то вводить. Запускайте Access и нашу созданную БД. Переходите на вкладку формы. Там у нас горит только одна кнопка "Создать", так давайте нажмем её в конце концов. У вас появится диалоговое окно с вариантами создания формы.

8_1.gif (4396 b)

Нас интересует мастер форм. Он сам умеет делать форму и настраивать все связи. Только для него нужно выбрать таблицу или запрос. Ведь запрос это тоже таблица хоть и виртуальная. Вы внизу видите поле со списком, выберите в нем нашу таблицу и нажмите OK (имя таблицы телефоны). Дальше появится диалоговое окно, в котором Вы сможете указать какие поля надо видеть на форме. Ответ, который кажется логичным, это все поля, но это не верно. Например, поле ID для пользователя не нужно, да и вообще править его не надо. Так вот стрелочкой вправо перенесите записи, которые Вы хотите видеть.

8_2.gif (5675 b)

А вот теперь давайте нажмем "Готово", чтобы не идти в дебри настроек и посмотрим, что получится. Через несколько секунд у Вас появится форма "телефоны". И ее можно заполнять.

8_3.gif (3294 b)

Можете закрыть пока ее нажав на кнопку в правом углу. Вы увидите, что на вкладке формы появится название формы. Одна будет храниться в файле базы данных. Это очень приятно, так как файл один и все в нем. Я еще помню кучу файлов типа fxp,dbf,rpt и т.д.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 9 - Делаем запрос

Шаг 9 - Делаем запрос

Для того, чтобы делать запрос надо внести данные вообще-то. Запустите форму и внесите следующие данные, можете свои если хотите :-)

Имя 		Фамилия 		Отчество 		Телефон
----------------------------------------------------------------
Артем 		Каев 		Геннадьевич	20526
Володя 		Мордамин		Шанхрозидович	20562
Екатерина 	Попова		Сергеевна		27190

Ну и хватит для начала, закройте форму. Теперь перейдите на вкладку "Таблицы" и Вы увидите, что в ней появились записи. Ну вот и славно, теперь нам на вкладку "Запрос". Теоритическая ситуация. У Вас телефон с определителем номера и Вы хотите сразу знать кто вам звонит. Вам звонят так много, что Вы не всегда можете запомнить кто. Особенно если живете в Москве :-). Так вот надо по номеру узнать кто звонит. В запросах у нас горит только одна кнопка "создать", жмите ее. Появится опять диалог с предложениями о вариантах создания.

9_1.gif (3877 b)

Нам нужен как раз конструктор. Выберите его и нажмите OK. Вам предложат выбрать таблицы, на основе которых строится запрос. Выберите "Телефоны" и закройте это окно. Теперь щелкая по полям вы можете указать какие поля выводить. А в поле с номером телефона на строке "Условие" надо поставить знак вопроса для того, чтобы Access спрашивал Вас о телефоне, по которому искать. Вот смотрите рисунок.

9_2.gif (6102 b)

Можете закрывать окно создание запроса. Теперь вас спроят о имени запроса. Пусть имя будет "По телефону". Вот оно появится на вкладке запрос. Щелните на нем дважды, введите телефон и вы увидите таблицу с данными о том кто звонит. Конечно таблица не очень красива, но с этим мы справимся. Позже. А пока наслаждайтесь и применяйте на практике.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 10 - Делаем отчет

Шаг 10 - Делаем отчет

На основе готового запроса или таблицы можно построить отчет о том как и что там у нас есть. Понятие отчета очень широко известно. Очень часто это слово приводит в паническое настроение людей многих специальностей, но что сделаешь ??? Надо его делать :-) Запускаем нашу БД и переходим на вкладку "Отчеты". У нас опять горит одна кнопка "Создать", вот ее мы и жмем. Появится диалоговое окно очень похожее на все ранее появлявшиеся в подобной ситуации.

10_1.gif (4559 b)

Вам нужно выбрать "Мастер отчетов" и выбрать по какому запросу Вы будете строить отчет. У нас он один и поэтому мы с Вами выберем "По телефону". Нажимаем OK, опять появится знакомое окно, в котором надо выбрать какие поля будут в отчете. Выберите все. Жмем "Далее", опять новое окно с выбором уровня групировки. Нам этот уровень все равно какой пока, но пригодится потом, поэтому идем далее. Следующее окно это поле, по которому сортировать. Давайте выбирем по полю "Фамилия".

10_2.gif (3538 b)

Там еще есть ряд параметров, но не в них суть, так что жмите "Готово". После этих шагов волшебник сформирует отчет и появится маленькое окно с просьбой о вводе номера телефона. Введите номер и посмотрите отчет. После чего отчет можно запускать любое количество раз вводя номер телефона. Его можно распечатать или изменить. Вообще это уже шаг вперед к созданию хорошей БД.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 11 - Пробуем макрос

Шаг 11 - Пробуем макрос

Вообще-то работа с макросами дело мало перспективное, так как Microsoft постоянно заявляет, что поддерживать больше макросы не будет и все перейдет на VBA. Но на данный момент они работают и позволяют часть задач сделать быстро. Очень быстро и просто. Давайте посмотрим.

Переходим на вкладку "Макросы". У нас опять горит единственная кнопка "Создать". По нажатию на эту кнопку у Вас появится окно макросов. Это набор строк, в которые можно вводить команды. Смотрите на рисунок.

11.gif (4722 b)

Обратите внимание на одну мелочь. Каждая команда имеет дополнительные свойства. Вот, например, переход на запись может быть в разных вариантах, в том числе и с созданием новой записи. Создайте такой же макрос, как и у меня. В нем написано открыть форму "телефоны" и перейти на запись. Закройте окно редактирования. Дайте имя. Вот теперь Вы можете его запускать из окна или привязывать к кнопкам на форме или опеределенным событиям, до всего этого мы дойдем.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 12 - Создаем модуль

Шаг 12 - Создаем модуль

Итак, пора нам создать первый модуль. Для этого мы перейдем на вкладку модуль и нажмем кноку "Создать", после ее нажатия мы попадем в редактор VBA. Здесь нам надо создать процедуру. Любая процедура начинается с SUB и заканчивается END SUB. Вот смотрите.

12_1.gif (2005 b)

Теперь модуль можно закрывать и давать имя. Когда вы это сделаете, то увидите что запустить то его нельзя. Да действительно запустить модуль можно только из другого модуля или в ответ на событие в приложении. Но проверить как он работает можно и не очень сложно. Для это выделите его и нажмите кнопку "Конструктор". После того как появится окно редактирования поставьте курсор внутрь процедуры. И нажмите на кнопку запуска. Вот она.

12_2.gif (5299 b)

После этого Ваша процедура должна выполниться и Вы увидите окно сообщения. Вот.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 13 - Ссылки как средство распределения задач

Шаг 13 - Ссылки как средство распределения задач

Конечно Access не является наиболее подходящим средством для создаиня баз данных масштаба предприятия. Но это пожалуй самое быстрое и простое средство для проектирования базы данных и запуска первой серии дял отработки решений. То есть у Вас есть шанс разрабатывая распределенную систему отработать решения и функции рабочих мест. Я, например, на данный момент это и делаю в пределах своего предприятия. Итак, давайте представим базу данных по архивным материалам компании. У вас должны быть как минимум такие рабочие места. Учтите, что рабочее место это не обязательно отдельный компьютер. Рабочее место в моем понятии это отдельный вид интерфейса.

  • Архивный работник
  • Учет выдачи и получения
  • Все работники

Плюс ко всему этому для создания БД Вам нужно использовать и другие базы данных. Например, из расчетного отдела для того, чтобы не дублировать таблицы у себя. Естественно все будет нормально при наличии на предприятии сети.

Вот главный метод решения это ссылка, которая позволяет Вам использовать таблицы из других БД. При установке ссылки она указывается таким значком.

13.gif (1304 b)

Вот решение такое. Создаем отдельную базу данных с классификаторами. Потом отдельную базу данных с записями. И отдельные БД c интерфейсами под типы задач и ссылками на таблицы. Я попробую это изобразить графически.

БД классифкаторы -                       | Интерфейс 1
................  |-  БД Информационные -| ...........
................  |-  ................. -| ...........
................ -                       | ...........

БД классификаторы могут быть созданны внутри Access или то же ссылки на другие БД. Они с использованием ссылок собираются в записи, которые потом используются как ссылки для интерфейса. При этом физическое распределение БД не имеет значение. Вот. Отработав все эти моменты можно создавать систему, например, на основе Oracle. Вообщем при такой технологии ACCESS хорош как средство быстрого проектирования распределенной среды. Вы скажете, а как же мы начнем работать, что данные потом надо будет заносить заново ???? Нет их можно будет перенести. Думаю в будущем мы коснемся этого процесса.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 14 - Разделение таблиц

Шаг 14 - Разделение таблиц

Реляционная модель баз данных подразумевает под собой понятие уровней нормальности таблиц. Есть пять уровней. С ними мы познакомимся попозже, а пока посмотрим как в таблице бороться с избыточностью. Давате к нашей базе данных "Телефоны" добавим поле должность. Дл этого выделите таблицу и нажмите кнопку "Конструктор". Внесите поле и закройте его. Также внесите вот такие данные.

14_1.gif (3903 b)

Как видите поле "Должность" имеет повторяющиеся значения. То есть количество названий специальностей ограничено и они будут повторяться. В этом нет ничего страшного, но вот такой вопрос. Что вы будете делать, если специальность программист будет переименована в программер :-) искать во всей таблице ??? А если у Вас людей работает тысячи. Кроме того под это поле нужно выделять место. Проще будет поставить код специальности и место будет меньше. Одно из главных правил "Повторяющиеся" записи должны быть преобразованы в отдельную таблицу. Можно сказать, что мы создаем классификатор. Слово классификатор больше по смыслу подходит. Итак, нам нужна таблица с наваниями специальностей. Давайте ее создадим. Вот такую.

14_2.gif (1837 b)

Занесите в нее названия специальностей. Их всего две: программист и оператор.

Вот теперь нам надо связать эти две таблицы. Откройте таблицу "телефоны" в конструкторе. Удалите поле должность. Будем создавать новое поле, но начнем сразу с выбора типа поля. Там есть пункт мастер подстановок.

14_3.gif (3014 b)

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

14_4.gif (2686 b)

Между двумя таблицами существует связь. Мы с Вами сейчас сделали довольно большой шаг вперед. Мы из большой таблицы выделили в отдельную таблицу классификатор. Это операция является основой структуризирования информации в базах данных.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 15 - Импорт таблиц из Excel

Шаг 15 - Импорт таблиц из Excel

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

Для экспорта главное - это правильно оформить таблицу. Первое в таблице должны быть только данные. Формулы не будут копироваться, а поля будут пустыми. В Excel есть возможность преобразовать формулы в числа, то есть уничтожить формулы. Вот создайте такой файл.

15_1.gif (4502 b)

В Access на вкладке "Таблицы" нажмите правую кнопку мыши и выберите импорт. Дальше в типе файлов надо выбрать Microsoft Excel. Найти наш файл и выбрать его. Вот тут все зависит от того, сколько в нашей книге листов. Каждый лист будет отдельной таблицей. Так воспринимает Access. Кстати если в таблице есть именованные диапазоны, то они тоже будут восприняты как отдельные таблицы.

15_2.gif (3391 b)

После этого необходимо указать откуда берутся имена полей. То ли они будут созданы автоматически, то ли взяты из таблицы.

15_3.gif (2449 b)

После этого можно нажать "Готово", хотя есть и еше настройки. Но это пока не важно, самое главное, что таблица импортирована.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 16 - Импорт текстовых файлов

Шаг 16 - Импорт текстовых файлов

Импорт текстовых файлов дает нам огромные возможности. Как известно импортировать данные в текстовый формат можно практически из любых программ, а это важно. Если Вы решили использовать Access, та Вас заинтересует как перенести такие данные. И когда Вы перейдете от Access скажем к MS SQL Server Вас это тоже должно заинтересовать. Все это можно сделать на основе текстовых форматов. Кроме того, многие форматы являются текстовыми. Неверите ??? Откройте файлы, например, DXF и посмотрите. Раз так, то даже если текстовый формат не совсем корректен Вы всегда сможете его подправить программно используя хоть QBasic :-))

При импорте есть несколько понятий. Первое понятие это разделитель. Разделитель это символ отделяющий одно поле от другого. Ограничитель это символ, внутри которого заключены поля. При экспорте основные два варианта это

  • Фиксированной ширины
  • С разделителями

Ну что, давайте попробуем ??? Открывайте базу и переходите на таблицы. Нажимайте правую кнопку и выбирайте "Импорт" и формат текстовых файлов, потом сам файл.

16_1.gif (3988 b)

Как видите тут же Вас спрашивают о том, как производить импорт. Давайте выберем фиксированной ширины. И нажмем кнопку "Далее".

16_2.gif (10890 b)

У Вас появится диалоговое окно, в котором вы сможете изменить ширину поля если Access ошибся. Обратите внимание на кнопку "Дополнительно", используя ее Вы сможете произвести тонкую настроку параметров. Скажем кодировку если Вы экпортируете тестовые файлы MS DOS. Дальше у Вас уточнят куда сохранять данные, может быть несколько вариантов: добавить в таблицу или создать новую базу и еще некоторые мелочи. Вы можете их не просмотривать, а в любой момент нажать "Готово" и Access сделает по умолчанию, то есть как он считает нужным.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 17 - Иерархические данные

Шаг 17 - Иерархические данные

Структуры данных являются чаше всего иерархическими. Соответственно и таблицы должны быть такими. Вот пример устройства данных финансово-экономической службы моего предприятия.

Предприятие
    Подразделение 1
        Объект работ 1
            Вид работ 1
            Вид работ 2
        Объект работ 2
        ..............
    Подразделение 2
    ...............

Предприятие делится на подразделения. У нас это называется партия. Так как геологи едут работать в поля и там ищут свои месторождения. Партий несколько. У каждой партии есть объекты работ, ну например, месторождения. Их тоже чаще всего бывает несколько. На каждом месторождении ведутся работы, при том видов работ огромное количество. Финансово-экономическая служба ведет учет по всем этим видам работ. Ее интересует сколько денег осталось по объекту или по виду работ, скажем, бурению во всей экспедиции. Мы с Вами посмотрим как создавать подобные типы данных в Access. То есть мы создадим структуру данных. Для начала нам надо создать таблицы классификаторы.

Создаем таблицу party (партия):

ID_PARTY
NAME

Создаем таблицу obj (объект):

ID_OBJ
NAME

Создаем таблицу vid (вид работ)

ID_VID
NAME

Вот теперь нам надо их связать. Сделать это можно через промежуточные таблицы. Давайте их создадим.

Создаем таблицу obj_vid

ID_OBJ_VID
ID_OBJ		- Идентифкатор объекта
ID_VID		- Идентифкатор вида

Как видите эта таблица просто связывает вид работ с объектом. Реально в Access она будет выглядеть так.

Кысылга		канавы
Кысылга		скважины
Адыча		маршруты
Адыча 		канавы

Вы скажете, что так не удобно, но не торопитесь. Убрать эти неудобства можно использованием поделенных форм. И мы это сделаем позже.

Привяжем теперь к данному виду работ партию создадим таблицу part_obj_vid:

ID_PART_OBJ_VID
ID_PART		- Идентифкатор партии
ID_OBJ_VID	- Идентьифкатор выда работ

Идея таже мы создаем промежуточную таблицу с видом работ и объектом, но привязанным к конкретной партии.

Для связи данных можно использовать серию промежуточных связующих таблиц.

Для создания объединяющих таблиц используйте мастер подстановок !!!


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 18 - Создаем форму

Шаг 18 - Создаем форму

Сейчас мы с Вами создадим формы для таблиц классификаторов. Разговаривая о классификаторах надо иметь в виду, что классифкатор может быть разного уровня. То есть в нашем примере объект это классификатор для видов работ. А партии это классфикатор для объектов. Все очень просто если вдуматься. Верхняя ступенька лестницы классифкатор для нижней.

Итак, давайте создавать форму для видов работ. Заходите в формы и выбирайте "создать". Нам нужно выбрать мастер форм и имя таблицы, на основе которой будет создаваться форма.

18_1.gif (4596 b)

Дальше надо указать какие поля отображать. Нас интересует только поле имя. При выборе типа расположения формы надо выбрать "Ленточный", для того чтобы окно появилось вот такое и можно было внизу от класисфикатора вставить список данных. Хотя для таблицы VID это не главное, так как она самый маленький объект в связях. Но давайте для всех сделаем одинаково.

18_2.gif (3378 b)

Вот результат должен быть такой.

18_3.gif (1911 b)

Такие таблицы нужно сделать для всех классифкаторов таблиц:

VID
OBJ
PARTY


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 19 - Подчиненная форма

Шаг 19 - Подчиненная форма

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

19_1.gif (3207 b)

На основе этой таблицы сформируем форму. Но на этой форме должны быть видны только имена видов работ. Имена объектов должны быть скрыты. Итак, нам нужно передвигаясь по объектам видеть список работ связанных с этим объектом. Так как таблица классификатор у нас OBJ, то на ней мы и будем добавлять подчиненую форму. Открывайте форму OBJ в констуркторе расширяйте поле вниз в выбирайте инструмент "подчиненая форма".

19_2.gif (7582 b)

После того как вы мышкой установите размер подчиненой формы у Вас Access должеен спросить как формировать подчиненную форму. Вы должны выбрать "Форма" и сформированную форму OBJ_VID с показом только видов работ. После этого нужно установить какие поля будут связаны. Как на рисунке ниже. Мы поле идентифкатор в таблице классификаторе связываем с указанием на объект в таблице связей.

19_3.gif (5821 b)

Установив связь можно наживать "Готово". Результатом будет форма, в которой передвигаясь от объекта к объекту будет видно какой вид работ связан с данным объектом.

19_4.gif (8463 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 20 - Запросы и таблицы

Шаг 20 - Запросы и таблицы

Мы с Вами разбирались как создавать сложные взаимосвязанные таблицы. В результате построения таких таблиц возникает проблема доступа к этим таблицам. Чтобы объединить много таблиц и получить доступ к этим данным Вам приходится писать SQL операторы с использованием JOIN. Длина такого оператора может быть значительна. Так что скажете Вы обращаясь к таблице из Excel или предоставляя к ним доступ из IIS писать все эти операторы ???? Конечно нет, для таких целей удобно использовать запросы. Итак, у нас есть две таблицы классификаторы и одна сводная. Давайте сделаем пример. Делаем его без всяких подстановок. У нас будет три таблицы:

  • BASE - таблица классификатор операционных систем
  • COMP - таблица классификатор компьютеров
  • ALL - сводная таблица

В таблице BASE:

ID_BASE счетчик
NAME    текст

В таблице COMP:

ID_COMP счетчик
NAME	текст

И в таблице ALL:

ID_ALL счетчик
BASE   число
COMP   число

Так вот сводную таблицу делаем без постановки. То есть ручками заполняем числа. Вот как она выглядит в режиме таблицы.

20.gif (1742 b)

Вот в таком виде она у Вас и будет при вызове базы из Excel или IIS или чего-нибудь другого. Это не совсем удобно. Для того, чтобы связать эти таблицы в тех программах, которые будут иметь доступ к таблицам, надо писать такой SQL оператор.

SELECT BASE.NAME, COMP.NAME
FROM COMP INNER
    JOIN (BASE INNER
    JOIN [ALL] ON BASE.ID_BASE = [ALL].BASE)
    ON COMP.ID_COMP = [ALL].COMP;

Очень удобно и коротко я Вам скажу :-) Выход есть в создании запросов, но в Access. Там очень удобно графически создавать сам запрос и запрос имеет очень хорошие черты.

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

Запрос вопринимается программным обеспечением как обычная таблица. То есть методы работы теже с запросом, что и таблицей. Посмотрите разделы на сервере посвященные IIS MFC, DAO Excel и Вы увидите, что методы работы с запросом не сильно отличаются от таблицы.

Давайте в следующем шаге создадим запрос на основе этих таблиц.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 21 - Создаем запрос

Шаг 21 - Создаем запрос

Итак, база для создания запроса у нас есть. Давайте перейдем на вкладку "Запрос" и нажмем "создать". Появится окно, в котором Вам нужно выбрать метод создания запроса. Давайте выберем "Конструктор" и нажмем "ок". Теперь Вам предложат выбрать таблицы для запроса в окне добавления таблицы. Выбирайте таблицу и нажимайте "добавить". Добавьте все таблицы.

21_1.gif (6143 b)

После этого можно спокойно закрыть таблицу выбрав "закрыть". Теперь нам нужно создать связи. То есть указать как нужно связывать таблицы. Это просто. Схватите мышкой поле ID_BASE из таблицы BASE и потащите его на поле BASE в таблице ALL. Результатом должна быть линия указывающая на связь. Сделайте тоже самое с Comp. Вот как это должно выглядеть:

21_2.gif (2387 b)

Все что осталось внизу это указать поля, которые будут в запросе. Для этого поле из конкретной таблицы опять можно схватить и потащить вниз на поле. Возмите NAME из таблицы BASE и бросьте его на поле внизу. Тоже самое сделайте с именем в таблице COMP. Вот так.

21_3.gif (1677 b)

Ну, что ?! Давайте запустим запрос и посмотрим, что там будет. А будет обычная таблица с двумя полями. Вот я еще раз хочу сказать, что с этим запросом можно работать как с таблицей и не писать в приложениях длинные запросы SQL, потому что это очень удобно.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 22 - Значение поля по умолчанию

Шаг 22 - Значение поля по умолчанию

Access позволяет устанавливать значение поля по умолчанию. Создавая поля в конструкторе Вы всегда имеете эту возможность.

22_1.gif (4343 b)

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

22_2.gif (2540 b)

А теперь вызовем запрос и увидим, что этих записей как небывало.

22_3.gif (2119 b)

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 23 - Репликация

Шаг 23 - Репликация

Репликация - это поддержка одинаковыми нескольких копий БД. Этот механизм позволяет обеспечивать их полное сходство. Зачем ???? Ну, во-первых для резервного копирования. Второе применение связано с тем, что базы данных на основе ACCESS не являются системами клиент - сервер и поэтому, скажем так, не очень хорошо приспособлены для групповой работы. И когда у Вас есть какая-то структура баз данных и при этом вносить изменения в нее может несколько человек, то поддержка одинаковых копий для всех может вызвать некоторые проблемы. Примерно похожий механизм имеется в "Портфель". Давайте разберем такую ситуацию. У Вас уехал начальник с базой данных. Приехал из командировки. Естественно у Вас база дополнилась. Надо ее начальнику обновить. Что будете делать ? Полностью копировать ? Можно и так, а можно с помощью реплики, что просто быстрее. А вдруг начальник тоже вносил измененния ??? Значит одно из них пропадет. Это плохо. И тут уж без репликации не обойтись.

Попробуем ??? Давайте созадим каталоги для эмуляции работы в сети такой структуры.

Test
    Repl1
    Repl2

Вот здесь мы и будет проводить всякое тестирование. В каталоге Test создадим базу данныз Test.MDB. Внутри создадим таблицу Test c двумя полями ID_NAME счетчик и ключевое имя NAME как простое текстовое поле. Занесите две любые записи. Я занес Коля и Вася.

Давайте создадим реплику. Для этого выберем меню "Сервис" - "Репликация" - "Создать Реплику".

23_1.gif (3099 b)

Первое окно потребует от Вас потвердить необходимость реплики. Скажите "Да". Дальше на предложение резервной копии согласитесь. Чем бог не шутит. Теперь Вам нужно выбрать местоположение реплики. Укажите каталог Repl1, а имя измените на Реплика Test 1. После всей этой операции будет создана реплика Test преобразованная в "Основная реплика". Потвердите это в диалоговом окне. Значек таблицы изменится. Вот как он будет выглядеть сейчас.

23_2.gif (1405 b)

Сделайте тоже самое в каталоге Repl2, только с другим именем "Реплика Test 2". Закройте базу данных и откройте снова. Теперь в главную реплику давайте занесем запись, например, "Оля". Вы тут же увидите, что счетчик выберет число произвольным образом. Закроем. Теперь откроем файл из каталога Repl1 и внесем имя "Толя". А в каталоге Repl2 "Ирина".

Откройте нашу основную реплику с именем Test и выберите пункт меню "Сервис" - "Репликация" - "Синхронизация". Появится окно, в котором надо указать с какой базой будет происходить синхронизация.

23_3.gif (5241 b)

Тоже самое надо сделать и со второй репликой. Откройте таблицу и посмотрите, что все записи есть в основной таблице. Все записи будут и во-второй реплике. Для переноса изменений в первую базу ее опять надо синхронизировать. Только тогда изменения будут во всех базах. Вообщем пройтись по кругу. Получилось ??? Вот и хорошо. Как минимум мы попробовали, что такое репликация. Кстати из этого есть и вывод дял программирования. Нельзя предпологать, что записи в счетчике всегда будут идти по порядку.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 24 - Автоматический старт формы при запуске

Шаг 24 - Автоматический старт формы при запуске

Действительно очень удобно при запуске базы данных получать форму сразу. То есть Вы открываете базу данных и автоматом открывается форма. Что для этого нужно ? Во-первых сама форма. Вы решаете какая форма будет у Вас первая. Дальше Вам нужно зайти в меню "Сервис -> Параметры запуска".

24_1.gif (6495 b)

Здесь Вам нужно выбрать какая форма у вас будет выводиться при запуске приложения.

24_2.gif (2834 b)

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 25 - Открытие формы из формы

Шаг 25 - Открытие формы из формы

Одним из приемом по оформлению пользовательского интерфейса является организация кнопочной формы. То есть формы, с которой можно вызвать другие формы. Что для этого нужно ? Отрыть исходную форму в конструкторе. На панели инструментов вызвать значок кнопка.

25_1.gif (3947 b)

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

25_2.gif (7047 b)

По нажатию но кнопку далее у нас откроется окно, в котором нужно выбрать какую форму открывать.

25_3.gif (2243 b)

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 26 - Доступ к SQL Server из Access

Шаг 26 - Доступ к SQL Server из Access

В Access можно использовать связь с таблицами или импорт для доступа к данным находящимся в SQL Server.

26_1.gif (4036 b)

Доступ будет реализовываться через ODBC. Поэтому у Вас должно быть настроено соединение ODBC. О настройке можно почитать "Шаг 4 - Настройка ODBC для SQL Server".

26_2.gif (4242 b)

Появиться выбор источников соединения. Здесь нам нужен настроенный ODBC для SQL Server.

26_3.gif (5453 b)

Дальше нам придется указать настроенное имя и пароль. Самый лучший способ этот пароль и имя создать. Если Вы сам себе и администратор и программист как создать пользователя можно прочитать в "Шаг 2 - Создание пользователя".

26_4.gif (3665 b)

Дальше нужно указать таблицу:

26_5.gif (4286 b)

Таблица станет доступной из Access:

26_6.gif (2427 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 27 - Связь один ко многим и Мастер форм

Шаг 27 - Связь один ко многим и Мастер форм

Для начала хорошо бы почитать теорию "Шаг 116 - Связи один ко многим". Создаем таблицу otdel. Эта таблица будет список отделов:

27_1.gif (2288 b)

Ну и занесем в нее немного записей.

27_2.gif (2374 b)

Создаем таблицу Piple.

27_3.gif (2528 b)

ID_OTDEL - это идентификатор отдела который был создан мастером подстановок. Читайте "Шаг 14 - Разделение таблиц". Ну и записей немного нужно внести.

27_4.gif (4771 b)

Вот теперь нам нужно посмотреть схему данных. Здесь нужно установить связь один ко многим. Эти цифры и знак множества появиться если Вы установите обеспечить целостность данных.

27_5.gif (6928 b)

Вот теперь можно запускать мастер форм. Почитайте сначала "Шаг 18 - Создаем форму". Создавать форму мы будем на основе таблицы otdel. При выборе полей нужно указать и имя отдела и имя сотрудника

27_6.gif (1803 b)

Следующим шагом Вы сможете указать вид, будет это связанная форма или отдельная:

27_7.gif (3160 b)

Нажав кнопку "готово" Вы сможете просматривать связанные данные.

27_8.gif (4429 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 28 - Обработка событий изменения данных

Шаг 28 - Обработка событий изменения данных

В Access есть хорошая возможность обрабатывать события изменения данных. Но обработка строиться на основе обработки элементов управления на форме. SQL Server допустим позволяет реагировать на изменения данных на уровне таблиц, для этого используются триггеры почитайте "Шаг 13 - Триггеры". В Access подобные возможности можно достичь обработкой событий на элементах формы. Делайте форму Otdel на основе таблицы из прошлого шага и выберите тип табличный. После того как сделает форму откройте ее в режиме конструктора. Здесь выбрав элемент управления можно установить обработку событий.

28_1.gif (3299 b)

Выбрав этот пункт меню дальше Вам придется выбрать как Вы будут обрабатывать эти события. Выберите программы. Откроется окно редактора точно такое как в VB да и суть обработки событий одинаковая.

28_2.gif (6372 b)

Ну и теперь внеся код перед сохранением данных в таблицу и перед кстати у Вас будет появляться сообщение. После изменения записи и переходе на новую например.

28_3.gif (3593 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 29 - Поле со списком на форме

Шаг 29 - Поле со списком на форме

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

29_1.gif (5495 b)

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

29_2.gif (2747 b)

Выберем его и поместим на форму. Тут же при помещении нам нужно будет указать откуда будут браться строки.

29_3.gif (4190 b)

Дальше нам нужно будет выбрать таблицу и поле, которое будет в списке, только после этого поле со списком будет на форме. Можно сохранять форму и запускать. Если Все указали удачно, то заработает.

29_4.gif (2564 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 30 - Доступ к полю со списком из VBA

Шаг 30 - Доступ к полю со списком из VBA

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

30_1.gif (2072 b)

Теперь к этой кнопке нужно привязать процедуру обработки события. Щелкаем правой кнопкой.

30_2.gif (3573 b)

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

30_3.gif (2853 b)

Ну и код пишем.

Private Sub Кнопка2_Click()
    Dim s As String
    'установить фокус
    Me.ПолеСоСписком0.SetFocus
    ' получает строку из поля со списком
    s = Me.ПолеСоСписком0.Text
    MsgBox s
End Sub

В этом коде есть некоторые тонкости, ну во-первых это Me. То есть мы ссылаемся на ту форму, где находится кнопка и чей обработчик выполняется. Во-вторых прежде чем получить текст нам придется установить фокус на элемент SetFocus, а только потом извлечь текст. А вот пример работы.

30_4.gif (4419 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 31 - Удаление и создание запросов в ходе выполнения программы

Шаг 31 - Удаление и создание запросов в ходе выполнения программы

Запросы мы с Вами рассматривали в шагах "Шаг 9 - Делаем запрос", "Шаг 20 - Запросы и таблицы", "Шаг 21 - Создаем запрос". Но у Всех этих запросов есть один недостаток, они статические. То есть один раз его создал и потом нужно менять. А как же с динамикой. Ну например есть таблицы с такой схемой.

31_1.gif (2621 b)

Здесь в таблице parther находиться список организаций. Нам нужно в ходе работы выводить запросы на основе этого организации. Ну типа того, сколько счетов от них и на какую сумму. Можно конечно заранее сделать много запросов. А что есть новая организация, пользователь ее добавит, но делать запрос. Вот от сюда и выход что запрос нужно формировать автоматически. Делаем форму на ней поле со списком на основе этой таблицы и кнопку, по которой будет строиться запрос.

31_2.gif (2826 b)

К кнопке код:

Private Sub Кнопка4_Click()

Dim dbs As Database, qdf As QueryDef, strSQL As String
    ' имя организации
Dim strOrd As String

    ' Возвращает ссылку на текущую базу данных.
    Set dbs = CurrentDb
    ' установить фокус
    Me.Организация.SetFocus
    ' получает строку из поля со списком
    strOrd = Me.Организация.Text
    strOrd = "'" + strOrd + "'"
    ' построить запрос
    strSQL = "SELECT parther.Name,chet.Nomer, chet.Data, chet.Prixod, chet.Rasxod FROM parther
    INNER JOIN chet ON parther.ID_PARTHER = chet.ID_PARTHER  WHERE parther.Name=" + strOrd
    strSQL = strSQL + " ORDER BY chet.Data; "
    ' Создает новый запрос.
    dbs.QueryDefs.Delete ("приход")
    Set qdf = dbs.CreateQueryDef("приход", strSQL)
    DoCmd.OpenReport "parther", acViewPreview
    Set dbs = Nothing
End Sub

Самое главное здесь вот что dbs.QueryDefs.Delete ("приход") удаляет старый запрос а Set qdf = dbs.CreateQueryDef("приход", strSQL) строит новый запрос на основе которого построен отчет DoCmd.OpenReport "parther", acViewPreview.

31_3.gif (3937 b)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 32 - Использование ActiveX на форме

Шаг 32 - Использование ActiveX на форме

На форму можно помещать и дополнительные элементы, любые зарегистрированные на Вашем компьютере. Для этого в панели инструментов есть кнопка дополнительные элементы.

32_1.gif (1829 b)

Нажав на эту кнопку у вас выпадет список элементов которые есть на компьютере. Давайте найдем календарь.

32_2.gif (2632 b)

После того как Вы его выберите его можно поместить на форму.

32_3.gif (6196 b)

Теперь к этому элементу можно обращаться из VBA. Вот так например. В данном примере строить запрос на основе дат установленных в календаре.

Dim date1 As String
Dim date2 As String
Dim x As Integer

date1 = Str(Me!ЭлементActiveX2.Day) + "/" + Str(ЭлементActiveX2.Month) + "/" + Str(ЭлементActiveX2.Year)
date2 = Str(Me!ЭлементActiveX3.Day) + "/" + Str(ЭлементActiveX3.Month) + "/" + Str(ЭлементActiveX3.Year)
date1 = "#" + date1 + "#"
date2 = "#" + date2 + "#"

Dim dbs As Database, qdf As QueryDef, strSQL As String
' имя организация
Dim strOrd As String

    ' Возвращает ссылку на текущую базу данных.
    Set dbs = CurrentDb
    ' установить фокус
    Me.Организация.SetFocus
    ' получает строку из поля со списком
    strOrd = Me.Организация.Text
    strOrd = "'" + strOrd + "'"
    ' построить запрос
    strSQL = "SELECT parther.Name,chet.Nomer, chet.Data, chet.Prixod,"
    strSQL = strSQL + " chet.Rasxod FROM parther INNER JOIN chet ON parther.ID_PARTHER"
    strSQL = strSQL + " = chet.ID_PARTHER  WHERE ( parther.Name=" + strOrd + ")"
    strSQL = strSQL + " AND ( chet.Data >" + date1 + ")" + " AND ( chet.Data < " + date2 + ")"
    strSQL = strSQL + " ORDER BY chet.Data; "
    ' Создает новый запрос.
    dbs.QueryDefs.Delete ("приход")
    Set qdf = dbs.CreateQueryDef("приход", strSQL)
    DoCmd.OpenReport "parther", acViewPreview
    Set dbs = Nothing
End Sub

При использовании элементов ActiveX всегда есть вариант что данного элемента нет на компьютере пользователя. Поэтому лучше при передаче базы лучше копировать элементы и производить из регистрацию. Вот пример команды для регистрации элемента управления:

Regsvr32.exe Mscal.ocx

Подробнее о элементах управления читайте "Шаг 34 - Регистрация компонент RegSrv32".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 33 - Отчеты, предварительный просмотр и элементы

Шаг 33 - Отчеты, предварительный просмотр и элементы

При создании отчета у Вас есть граница отчета которая устанавливается исходя из текущего принтера.

33_1.gif (1881 b)

От правильность установки это границы зависит правильность предварительного просмотра. Попробуйте сделать ее намного шире. При просмотре появиться вот такое предупреждение.

33_2.gif (3804 b)

И будет пустая страница в предварительном просмотре.

33_3.gif (2055 b)

Но это сообщение появится только в том случае, если у Вас нет не одного элемента на поле шире страницы. А он может быть. Вот смотрите. Здесь Вы видите элементы ?

33_4.gif (1263 b)

А теперь ?

33_5.gif (1706 b)

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

33_6.gif (1570 b)

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


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 34 - Способы соединения ACCESS с SQL Server

Шаг 34 - Способы соединения ACCESS с SQL Server

После того, как соединение в ODBC создано читайте "Шаг 3 - Настройка ODBC SQL Server 7.0", данные с сервера можно получить 2 способами для (Access2000 & 97).

Способ 1. Присоединение таблиц. Читайте "Шаг 26 - Доступ к SQL Server из Access". Этот вариант хорош, но только для малых объемов баз. Или на переходном периоде. Так если база весит метров 100 на Access, то понятно как оно работает по сети с двух машин. А если данные на SQL, а таблички присоединить, то в структуре менять ничего не надо все и так работает. НО. Все записи тачаться на сервер и на клиенте уже INNER JOIN-ы и прочие. А это никакая скорость с увеличением объема информации. Есть еще одна маленькая деталь начиная с версии ODBC более 3 присоединение таблиц запоминает имя сервера и если в ODBC соединении поменять имя сервера, то открываться таблица будет все равно с предыдущего сервера.

Способ 2. Запросы к серверу. Этого Вы не делали еще , смотрим подробнее. Создаем запрос. Пустой. Для этого выбираем создать, конструктор, потом OK никаких таблиц не добавляем. У нас откроется пустой запрос и теперь из меню мы можем выбрать запрос к серверу.

34_1.gif (5507 b)

Теперь нам нужно пойти в меню Вид и выбрать Свойства.

34_2.gif (2994 b)

Здесь мы будет настраивать подключение. Строка подключения = ODBC;DSN=имя подключения ODBC; DATABASE = имя базы на сервере; опять же для удобства лучше DSN=DATABASE;

34_3.gif (3771 b)

Таким образом, получаем, нормальный клиент сервер. В данному случае мы пишем, что будем запускать хранимую процедуру. О них читайте "Шаг 16 - Для чего созданы хранимые процедуры".

Предыдущий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 1 - Инструкции Visual Basic

Шаг 1 - Инструкции Visual Basic

Инструкция Visual Basic является полной командой. Она может содержать ключевые слова, операторы, переменные, константы и выражения. Любая инструкция относится к одной из следующих категорий:

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

Инструкции присвоения, которые присваивают значение или выражение переменной или константе.

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

Обычно инструкция располагается на одной строке, но ее можно продолжить на следующую строку с помощью символа продолжения строки. В следующем примере исполняемая инструкция MsgBox продолжается на трех строках:

Sub DemoBox()     ' Эта процедура описывает строковую переменную,
        ' присваивает ей значение Мария и выводит
        ' сцепленное сообщение.
    Dim myVar As String
    myVar = "Иван"
    MsgBox Prompt:="Привет " & myVar, _
        Title:="Приветствие", _
        Buttons:=vbExclamation
End Sub
Следующий Шаг


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 2 - Список инструкций

Шаг 2 - Список инструкций

Инструкция AppActivate
Инструкция Beep
Инструкция Call
Инструкция ChDir
Инструкция ChDrive
Инструкция Close
Инструкция Const
Инструкция Date
Инструкция Declare
Инструкции DefТип
Инструкция DeleteSetting
Инструкция Dim
Инструкция Do...Loop
Инструкция End
Инструкция Erase
Инструкция Error
Инструкция Exit
Инструкция FileCopy
Инструкция For Each...Next
Инструкция For...Next
Инструкция Function
Инструкция Get
Инструкция GoSub...Return
Инструкция GoTo
Инструкция If...Then...Else
Инструкция Input #
Инструкция Kill
Инструкция Let
Инструкция Line Input #
Инструкция Load
Инструкции Lock и Unlock
Инструкция LSet
Инструкция Mid
Инструкция MkDir
Инструкция Name
Инструкция On Error
Инструкции On...GoSub, On...GoTo
Инструкция Open
Инструкция Option Base
Инструкция Option Compare
Инструкция Option Explicit
Инструкция Option Private
Инструкция Print #
Инструкция Private
Инструкция Property Get
Инструкция Property Let
Инструкция Property Set
Инструкция Public
Инструкция Put
Инструкция Randomize
Инструкция ReDim
Инструкция Rem
Инструкция Reset
Инструкция Resume
Инструкция RmDir
Инструкция Rset
Инструкция SaveSetting
Инструкция Seek
Инструкция Select Case
Инструкция SendKeys
Инструкция Set
Инструкция SetAttr
Инструкция Static
Инструкция Stop
Инструкция Sub
Инструкция Time
Инструкция Type
Инструкция Unload
Инструкция While...Wend
Инструкция Width #
Инструкция With
Инструкция Write #


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 3 - Инструкция AppActivate

Шаг 3 - Инструкция AppActivate

Активизирует окно приложения.

AppActivate title[, wait]

Параметры
title
Обязательный. Строковое выражение, указывающее содержимое строки заголовка окна приложения, которое следует активизировать. Для активизации приложения вместо аргумента title допускается использование кода задачи, возвращаемого функцией Shell.
wait
Необязательный. Выражение типа Boolean, указывающее, должно ли вызывающее приложение иметь фокус при активизации другого приложения. Если этот аргумент имеет значение False (по умолчанию), указанное приложение активизируется немедленно, независимо от наличия фокуса у вызывающего приложения. Если этот аргумент имеет значение True, указанное приложение активизируется только после получения фокуса вызывающим приложением.

Замечания
Инструкция AppActivate передает фокус указанному приложению или окну, не изменяя его размеры. Активизированное окно приложения может потерять фокус в результате соответствующих действий пользователя или закрытия этого окна. Для запуска приложения и указания типа окна следует использовать функцию Shell.
При определении приложения, подлежащего активизации, аргумент title последовательно сравнивается со строкой заголовка каждого приложения, находящегося в памяти компьютера. При отсутствии точного совпадения активизируется приложение, строка заголовка которого начинается с указанной строки title. Если в памяти компьютера находятся несколько экземпляров приложения, строка заголовка которого совпадает с указанной строкой title, активизируется произвольно выбранный один из этих экземпляров.

Пример
В данном примере приведены различные способы активизации окна приложения с помощью инструкции AppActivate. При вызове функции Shell считается, что запускаемые приложения находятся там, где указано. На Macintosh для указания сигнатуры приложения вместо его имени используется функция MacID. Инструкцию AppActivate можно использовать с Macintosh System 7.0 или более поздней версии.

Dim MyAppID, ReturnValue
' В Microsoft Windows:
AppActivate "Microsoft Word"			' Активизирует Microsoft Word.

' Кроме того, можно использовать значение, возвращаемое функцией Shell.
MyAppID = Shell("C:\WORD\WINWORD.EXE", 1)		' Запускает Microsoft Word.
AppActivate MyAppID				' Активизирует Microsoft  Word.

ReturnValue = Shell("c:\EXCEL\EXCEL.EXE",1)		' Запускает Microsoft Excel.
AppActivate ReturnValue				' Активизирует Microsoft  Excel.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 4 - Инструкция Beep

Шаг 4 - Инструкция Beep

Подает звуковой сигнал через внутренний динамик компьютера.

Beep

Замечания
Частота и длительность звукового сигнала определяются аппаратным и программным обеспечением и различны для разных компьютеров.

Пример
В данном примере инструкция Beep используется для подачи трех звуковых сигналов через динамик компьютера.

Dim I
For I = 1 To 3	' Цикл выполняется 3 раза.
    Beep	' Подача звукового сигнала.
Next I


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 5 - Инструкция Call

Шаг 5 - Инструкция Call

Передает управление в процедуру Sub, процедуру Function или процедуру библиотеки динамической компоновки (DLL).

Call имя [списокАргументов]

Параметры
имя
Обязательный. Имя вызываемой процедуры.
списокАргументов
Необязательный. Разделяемый запятыми список переменных, массивов или выражений, передаваемых в процедуру. Компоненты спискаАргументов могут включать ключевые слова ByVal или ByRef для описания того, каким образом аргументы будут рассматриваться вызываемой процедурой. Однако ключевые слова ByVal и ByRef могут использоваться с инструкцией Call только при вызове процедуры из библиотеки динамической компоновки.

Замечания
Не обязательно применять ключевое слово Call при вызове процедуры. Однако, если ключевое слово Call используется для вызова процедуры с аргументами, списокАргументов должен быть заключен в скобки. Если ключевое слово Call не используется, необходимо также опустить скобки вокруг спискаАргументов. При использовании синтаксиса Call для вызова как внутренней, так и определяемой пользователем функции, возвращаемое функцией значение отбрасывается.
Для передачи в процедуру полного массива следует воспользоваться именем массива с пустыми скобками.

Пример
В данном примере показано, как использовать инструкцию Call для передачи управления процедуре Sub, внутренней функции, процедуре библиотеки динамической компоновки (DLL) и процедуре программного ресурса Macintosh.

' Вызов процедуры Sub.
Call PrintToDebugWindow("Всем привет")
' Предыдущая инструкция передает управление следующей процедуре Sub.
Sub PrintToDebugWindow(AnyString)
    Debug.Print AnyString		' Вывод в окно отладки.
End Sub

' Вызов внутренней функции. Значение, возвращаемое этой функцией,
' не используется.
Call Shell(AppName, 1)			' AppName содержит путь к выполняемому файлу.

' Вызов процедуры DLL Microsoft Windows.  Инструкция Declare должна
' быть личной (Private) в модуле класса, но не в стандартном модуле.
Private Declare Sub MessageBeep Lib "User" (ByVal N As Integer)

Sub CallMyDll()
    Call MessageBeep(0)		' Вызов процедуры Windows DLL.
    MessageBeep 0			' Повторный вызов без  ключевого слова Call.
End Sub

' Вызов программного ресурса Macintosh.
Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "MyAlert" (ByVal N _
As Integer)
Sub CallMyCodeResource()
    Call MessageAlert(0)		' Вызов программного ресурса Macintosh.
    MessageAlert 0			' Повторный вызов без  ключевого слова Call.
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 6 - Инструкция ChDir

Шаг 6 - Инструкция ChDir

Изменяет текущий каталог или папку.

ChDir путь

Параметры
путь
Обязательный аргумент путь является строковым выражением, определяющим какой каталог (или папка) станет стандартным. Аргумент путь может содержать имя диска. Если диск не указан, инструкция ChDir изменяет стандартный каталог или папку на текущем диске.

Замечания
Инструкция ChDir изменяет стандартный каталог, но не изменяет стандартный диск. Например, если стандартным является диск C, то после выполнения следующей инструкции стандартным каталогом станет каталог на диске D, однако стандартным диском останется диск C:.

ChDir "D:\TMP"

Пример
В данном примере инструкция ChDir используется для изменения текущего каталога или папки.

' Изменяет текущий каталог или папку на "MYDIR".
ChDir "MYDIR"

' В Microsoft Windows:
' Пусть текущим является диск "C:". Следующая инструкция изменяет
' каталог на диске "D:". "C:" остается текущим диском.
ChDir "D:\WINDOWS\SYSTEM"

' На Macintosh:
' Изменяет текущую папку и текущий диск.
ChDir "HD:MY FOLDER"


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 7 - Инструкция ChDrive

Шаг 7 - Инструкция ChDrive

Изменяет текущий диск.

ChDrive диск

Параметры
диск
Обязательный аргумент диск является строковым выражением, указывающим существующий диск. Если этот аргумент задается пустой строкой (""), текущий диск не изменится. Если диск является строкой, состоящей из нескольких символов, инструкция ChDrive использует только первый символ.

Пример
В данном примере инструкция ChDrive используется для изменения текущего диска.

' В Microsoft Windows:
ChDrive "D"		' Сделает диск "D" текущим.

' На Macintosh:
' Сделает диск "MY DRIVE" текущим.
ChDrive "MY DRIVE:"
' Сделает текущими диск "MY DRIVE" и текущую папку,
' поскольку она является корневой.
ChDrive "MY DRIVE:MY FOLDER"


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 8 - Инструкция Close

Шаг 8 - Инструкция Close

Завершает операции ввода/вывода с файлом, открытым с помощью инструкции Open.

Close [списокНомеровФайлов]

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

[[#]номерФайла] [, [#]номерФайла] . . .

Замечания
Если аргумент списокНомеровФайлов опущен, закрываются все активные файлы, открытые с помощью инструкции Open.
При закрытии файла, открытого в режиме Output или Append, в него добавляется содержимое последнего буфера вывода. Все буферы, связанные с закрытым файлом, освобождаются.
Инструкция Close разрывает связь между файлом и соответствовавшим ему номером файла.

Пример
В данном примере инструкция Close используется для закрытия трех файлов, открытых в режиме Output.

Dim I, FileName
For I = 1 To 3					' Цикл выполняется 3 раза.
    FileName = "TEST" & I			' Создает имя файла.
    Open FileName For Output As #I		' Открывает файл.
    Print #I, "Пример."			' Записывает строку в файл.
Next I
Close						' Закрывает все 3 открытых файла.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 9 - Инструкция Const

Шаг 9 - Инструкция Const

Описывает константы, используемые вместо констант в явном представлении (литералов).

[Public | Private] Const имяКонстанты [As тип] = выражение

Параметры
Public
Необязательный. Ключевое слово, используемое на уровне модуля для описания констант, доступных всем процедурам во всех модулях. Не допускается в процедурах.
Private
Необязательный. Ключевое слово, используемое на уровне модуля для описания констант, доступных только внутри модуля, в котором выполняется описание. Не допускается в процедурах.
имяКонстанты
Обязательный. Имя константы, удовлетворяющее стандартным правилам именования переменных.
тип
Необязательный. Один из поддерживаемых типов данных: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String или Variant. Для каждой описываемой константы следует использовать отдельное предложение As тип.
выражение
Обязательный. Литерал, другая константа или любое сочетание, которое включает все арифметические или логические операторы за исключением Is.

Замечания
Константы по умолчанию являются личными. Внутри процедур константы всегда являются личными; их видимость не может быть изменена. В стандартных модулях видимость, которую по умолчанию имеют константы на уровне модуля, может быть изменена с помощью ключевого слова Public. В модулях класса, однако, константы могут быть только личными, и их видимость не может быть изменена с помощью ключевого слова Public.
Имеется возможность объединять несколько описаний констант на одной строке, разделяя инструкцию присвоения каждой константы с помощью запятой. Если описания констант объединяются таким образом, используемое ключевое слово Public или Private применяется ко всем константам на строке.
Не допускается использование переменных, определяемых пользователем функций или внутренних функций языка Visual Basic (типа Chr) в выражениях, присваиваемых константам.
Константы помогают сделать программы самодокументируемыми и легко доступными для исправлений. В отличие от переменных константы не могут непредсказуемым образом изменяться при выполнении программы.
Если тип константы не задается явным образом (с помощью предложения As тип), константа приобретает тип, наиболее подходящий заданному выражению.
Константы, описанные в процедурах Sub, Function или Property являются локальными для этих процедур. Областью определения константы, описанной вне процедуры, является модуль, в котором она описана. В любом месте, в котором возможно использование выражений, допускается использование и констант.

Пример
В данном примере инструкция Const используется для описания констант, используемых вместо текстовых значений. Общие (Public) константы размещаются в общем разделе стандартного модуля, но не модуля класса. Личные (Private) константы могут быть описаны в общем разделе модуля любого типа.

' По умолчанию константы являются личными (Private).
Const MyVar = 459

' Объявляет общую (Public) константу.
Public Const MyString = "СПРАВКА"

' Объявляет личную (Private) целую (Integer) константу.
Private Const MyInt As Integer = 5

' Объявляет несколько констант в одной строке.
Const MyStr = "Привет", MyDouble As Double = 3.4567


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 10 - Инструкция Date

Шаг 10 - Инструкция Date

Устанавливает текущую системную дату:

Date = дата

Параметры
дата
Для компьютеров, работающих под управлением Microsoft Windows 95, аргумент дата должен задавать дату в интервале от 1 января 1980 года до 31 декабря 2099 года. Для компьютеров, работающих под управлением Microsoft Windows NT, дата в интервале от 1 января 1980 года до 31 декабря 2079 года.

Пример
В данном примере инструкция Date используется для установки системной даты. В среде разработчика дата изображается в кратком формате с использованием текущих национальных настроек.

Dim MyDate
MyDate = #February 12, 1985#		' Присваивает дату.
Date = MyDate				' Изменяет системную дату.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 11 - Инструкция Declare

Шаг 11 - Инструкция Declare

Применяется на уровне модуля ссылок на внешние процедуры в библиотеке динамической компоновки (DLL).

[Public | Private] Declare Sub имя Lib "имяБиблиотеки" [Alias "псевдоним"] [([списокАргументов])]
[Public | Private] Declare Function имя Lib "имяБиблиотеки" [Alias "псевдоним"] [([списокАргументов])] [As тип]

Параметры
Public
Необязательный. Используется для описания процедур, которые доступны для всех других процедур во всех модулях.
Private
Необязательный. Используется для описания процедур, которые доступны только в модуле, в котором выполняется описание.
Sub
Необязательный (должно быть указано одно из ключевых слов Sub или Function). Указывает, что процедура не возвращает значение.
Function
Необязательный (должно быть указано одно из ключевых слов Sub или Function). Указывает, что процедура возвращает значение, которое может быть использовано в выражении.
имя
Обязательный. Любое допустимое имя процедуры. Следует помнить, что вход в библиотеки динамической компоновки осуществляется с учетом регистра.
Lib
Обязательный. Указывает, что описываемая процедура содержится в библиотеке динамической компоновки или в программном ресурсе. Предложение Lib обязательно для каждого описания.
имяБиблиотеки
Обязательный. Имя библиотеки динамической компоновки или программного ресурса, которые содержат описываемую процедуру.
Alias
Необязательный. Указывает, что вызываемая процедура имеет другое имя в библиотеке динамической компоновки. Это полезно, когда имя внешней процедуры совпадает с ключевым словом. Имеет смысл использовать Alias и в том случае, когда имя процедуры библиотеки динамической компоновки совпадает с именем общей переменной, константы или любой другой процедуры в той же области определения. Alias полезен также, если некоторые символы в имени процедуры библиотеки динамической компоновки не соответствуют правилам именования для библиотек динамической компоновки.
псевдоним
Необязательный. Имя процедуры в библиотеке динамической компоновки или в программном ресурсе. Если первым символом не является символ (#), псевдоним является именем точки входа процедуры в библиотеке динамической компоновки. Если символ (#) является первым символом, все последующие символы должны указывать порядковый номер точки входа в процедуру.
списокАргументов
Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру при ее вызове. Аргумент списокАргументов имеет следующий синтаксис и элементы:

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray.
  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.
  • ByRef - Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
  • ParamArray - Необязательный. Используется только в качестве последнего элемента в списке списокАргументов для указания, что конечным аргументом является массив типа Optional элементов типа Variant. Ключевое слово ParamArray позволяет передавать произвольное число аргументов. Это ключевое слово не может использоваться со словами ByVal, ByRef или Optional.
  • имяПеременной - Обязательный. Имя переменной, представляющее передаваемый в процедуру аргумент; должно соответствовать стандартным правилам именования переменных.
  • Тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant, определяемый пользователем тип или объектный тип.
тип
Необязательный. Тип данных значения, возвращаемого процедурой Function; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Variant, определяемый пользователем тип или объектный тип.

Замечания
Для процедур Function тип данных процедуры определяет тип возвращаемых данных. Воспользуйтесь предложением As после элемента списокАргументов, чтобы определить тип данных, возвращаемых функцией. Внутри элемента списокАргументов можно использовать предложение As для задания типа данных любого из аргументов, передаваемых в процедуру. В дополнение к указанию любого стандартного типа данных, предложение As Any в аргументе списокАргументов позволяет приостановить проверку типа данных и разрешить передачу в процедуру любого типа данных.
Пустые скобки указывают, что процедура Sub или Function не имеет аргументов, и что в конструкции Visual Basic следует обеспечить отсутствие передачи аргументов. В следующем примере, процедура First не имеет аргументов. Если при вызове процедуры First будут заданы аргументы, возникнет ошибка:

Declare Sub First Lib "MyLib" ()

Если список аргументов включен в описание, то число и тип аргументов проверяются при каждом вызове процедуры. В следующем примере процедура First имеет один аргумент типа Long:

Declare Sub First Lib "MyLib" (X As Long)

Невозможно использование строк фиксированной длины в списке аргументов инструкции Declare, в процедурах допускается передача только строк переменной длины. Строки фиксированной длины могут быть аргументами процедуры, но они преобразуются перед их передачей в строки переменной длины.
В языке Visual Basic имеется константа vbNullString для использования при вызове внешних процедур, когда внешней процедуре требуется строка без значения. Это не то же самое, что пустая строка ("").

Пример
В данном примере показано, как использовать инструкцию Declare на уровне модуля в стандартном модуле для описания ссылки на внешнюю процедуру из библиотеки динамической компоновки (DLL) или на программный ресурс Macintosh. Инструкции Declare могут быть помещены в модули класса, если они являются личными (Private).

' В Microsoft Windows (16-разрядной):
Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
' Пусть SomeBeep является псевдонимом для имени процедуры.
Declare Sub MessageBeep Lib "User" Alias "SomeBeep"(ByVal N As Integer)
' Для вызова GetWinFlags в предложении Alias
' используется порядковый номер.
Declare Function GetWinFlags Lib "Kernel" Alias "#132"() As Long

' В 32-разрядной Microsoft Windows используется библиотека USER32.DLL,
' а не USER.DLL. Для написания программы, способной работать в 32- или
' 16- разрядной Microsoft Windows, используется условная компиляция.
#If Win32 Then
    Declare Sub MessageBeep Lib "User32" (ByVal N As Long)
#Else
    Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
#End If

' На Macintosh:
Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "MyAlert" (ByVal N _
As Integer)
' В предложении Alias используется ресурс программы.
Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "XTST$MyAlert" _
(ByVal N As Integer)

' Если указатель типа ресурса программы содержит только три символа,
' пробел на месте четвертого символа является обязательным.
Declare Sub MessageAlert Lib "MyHd:AnAlert" Alias "COD $AnAlert" _
(ByVal N As Integer)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 12 - Инструкции DefТип

Шаг 12 - Инструкции DefТип

Используются на уровне модуля для задания типа данных, используемого по умолчанию для переменных, аргументов, передаваемых в процедуры, и значений, возвращаемых процедурами Function и Property Get, имена которых начинаются с соответствующих символов.

DefBool диапазонБукв[, диапазонБукв] . . .
DefByte диапазонБукв[, диапазонБукв] . . .
DefInt диапазонБукв[, диапазонБукв] . . .
DefLng диапазонБукв[, диапазонБукв] . . .
DefCur диапазонБукв[, диапазонБукв] . . .
DefSng диапазонБукв[, диапазонБукв] . . .
DefDbl диапазонБукв[, диапазонБукв] . . .
DefDec диапазонБукв[, диапазонБукв] . . .
DefDate диапазонБукв[, диапазонБукв] . . .
DefStr диапазонБукв[, диапазонБукв] . . .
DefObj диапазонБукв[, диапазонБукв] . . .
DefVar диапазонБукв[, диапазонБукв] . . .

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

буква_1[-буква_2]

Аргументы буква_1 и буква_2 указывают диапазон имен, для которых задается тип данных по умолчанию. Каждый аргумент представляет первую букву имени переменной, аргумента, процедуры Function или Property Get и может быть любой буквой алфавита. Регистр символов в аргументе диапазонБукв не существенен.

Замечания
Имя инструкции определяет тип данных:

DefBool	Boolean
DefByte	Byte
DefInt	Integer
DefLng	Long
DefCur	Currency
DefSng	Single
DefDbl	Double
DefDec	Decimal (в настоящее время не поддерживается)
DefDate	Date
DefStr	String
DefObj	Object
DefVar	Variant

Например, в следующем фрагменте программы ,b>Message представляет собой строковую переменную:

DefStr A-Q
. . .
Message = "Переполнение стека."

Инструкция DefТип действует только на модуль, в котором она используется. Например, инструкция DefInt в одном модуле действует только на типы данных по умолчанию для переменных, передаваемых в процедуры аргументов, и возвращаемых типов процедур Function и Property Get, описанных в данном модуле. Типы данных по умолчанию для переменных, передаваемых в процедуры аргументов, и возвращаемых типов данных в других модулях остаются без изменений. Если тип данных не описан явно с помощью инструкции DefТип, то для всех переменных, аргументов, процедур Function и Property Get по умолчанию используется тип данных Variant.
При указании диапазона букв обычно определяется тип данных по умолчанию для переменных, которые начинаются с первых 128 символов набора. Однако при указании диапазона A – Z задается тип данных по умолчанию для всех переменных, включая те, что начинаются с международных символов из расширенной части набора (128 – 255).
После указания диапазона A – Z имеется возможность переопределять с помощью инструкций DefТип подчиненные диапазоны переменных. Если после задания диапазона включить ранее определенную букву в другую инструкцию DefТип, возникает ошибка. Однако возможно явное указание типа данных любой определенной или не определенной ранее переменной с помощью инструкции Dim с предложением As тип. Например, имеется возможность использовать следующую программу на уровне модуля для определения переменной с типом Double, хотя был задан тип данных по умолчанию Integer:

DefInt A-Z
Dim TaxRate As Double

Инструкции DefТип не действуют на элементы определяемых пользователем типов, поскольку эти элементы должны быть описаны явно.

Пример
В данном примере инструкции Defтип используются для задания по умолчанию типов данных для переменных и процедур Function, имена которых начинаются с указанных символов. Используемый по умолчанию тип данных может быть изменен только явным присвоением с использованием инструкции Dim. Инструкции Defтип можно использовать только на уровне модуля (т.е. нельзя использовать внутри процедур.

' Переменные, имена которых начинаются с букв "A" - "K",
' будут по умолчанию Integer.
DefInt A-K
' Переменные, имена которых начинаются с букв "L" - "Z",
' будут по умолчанию String.
DefStr L-Z
CalcVar = 4			' Инициализирует переменную типа Integer.
StringVar = "Всем привет"	' Инициализирует переменную типа String.
AnyVar = "Привет" 		' Будет обнаружено несовпадение типов.
Dim Calc As Double		' Явно объявлена переменная типа  Double.
Calc = 2.3455			' Присваивает значение переменной типа Double.

' Инструкции Defтип также применимы к функциям.
CalcNum = ATestFunction(4)	' Вызывает процедуру Function, определенную пользователем.
' Описание процедуры Function ATestFunction.
Function ATestFunction(INumber)
    ATestFunction = INumber * 2	' Возвращает значение типа Integer.
End Function


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 13 - Инструкция DeleteSetting

Шаг 13 - Инструкция DeleteSetting

Удаляет раздел или запись из раздела приложения в реестре Windows.

DeleteSetting appname, section[, key]

Параметры
appname
Обязательный. Строковое выражение, содержащее имя приложения или проекта, к которому относится раздел или запись.
section
Обязательный. Строковое выражение, содержащее имя раздела, в котором удаляется запись. Если определены только аргументы appname и section, указанный раздел удаляется полностью со всеми записями.
key
Необязательный. Строковое выражение, содержащее имя удаляемой записи.

Замечания
Если определены все аргументы, удаляется только указанная запись. Если указанный раздел или запись не существует, инструкция DeleteSetting не имеет последствий.

Пример
В данном примере сначала с помощью инструкции SaveSetting заполняются элементы реестра Windows (или файла .INI на 16-разрядных платформах Windows) для приложения MyApp, а затем инструкция DeleteSetting вызывается для их удаления. Поскольку аргумент key не определен, удаляется весь раздел, в том числе имя раздела и все содержащиеся в нем записи.

' Заполнение реестра.
SaveSetting appname := "MyApp", section := "Startup", _
            key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
' Удаление из реестра раздела со всем содержимым.
DeleteSetting "MyApp", "Startup"


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 14 - Инструкция Dim

Шаг 14 - Инструкция Dim

Описывает переменные и выделяет для них память.

Dim [WithEvents] имяПеременной[([индексы])] [As [New] тип] [, [WithEvents] имяПеременной[([индексы])] [As [New] тип]] . . .

Параметры
WithEvents
Необязательный. Ключевое слово, указывающее, что имяПеременной является объектной переменной, которая используется при отклике на события, генерируемые объектом ActiveX. Применяется только в модулях класса. Пользователь имеет возможность описать с помощью ключевого слова WithEvents произвольное количество отдельных переменных, однако при этом не допускается создание массивов. Не допускается также использование ключевого слова New с ключевым словом WithEvents.
имяПеременной
Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
индексы
Необязательный. Размерности переменной массива; допускается описание до 60 размерностей. Для задания аргумента индексы используется следующий синтаксис:

[нижний To] верхний [, [нижний To] верхний] . . .

Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
New
Необязательный. Ключевое слово, включающее возможность неявного создания объекта. Если указано ключевого слова New при описании объектной переменной, новый экземпляр объекта создается при первой ссылке на объект, поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set. Ключевое слово New нельзя использовать для описания переменных любых внутренних типов данных, для описания экземпляров зависимых объектов, а также вместе с ключевым словом WithEvents. тип
Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (для строк переменной длины), String* длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип.

Замечания Переменные, описанные с помощью ключевого слова Dim на уровне модуля, доступны для всех процедур в данном модуле. Переменные, описанные на уровне процедуры, доступны только в данной процедуре.
Инструкция Dim предназначена для описания типа данных переменной на уровне модуля или процедуры. Например, следующая инструкция описывает переменную с типом Integer.

Dim NumberOfEmployees As Integer

Инструкция Dim предназначена также для описания объектного типа переменных. Далее приводится описание переменной для нового образца листа электронной таблицы.

Dim X As New Worksheet

Если при описании объектной переменной не используется ключевое слово New, то для использования объекта, на который ссылается переменная, существующий объект должен быть с помощью инструкции Set присвоен переменной. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что она не содержит ссылку на какой-либо определенный экземпляр объекта.
Имеется также возможность применять инструкцию Dim с пустыми скобками для описания динамического массива. После описания динамического массива, воспользуйтесь инструкцией ReDim в процедуре для определения числа размерностей и элементов массива. При попытке переопределить размерности переменной-массива, чей размер был явно указан в инструкции Private, Public или Dim, возникает ошибка.
Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefТип, по умолчанию переменная получает тип Variant.
При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают при инициализации значение Empty. Каждый элемент переменной определяемого пользователем типа при инициализации получает значение, которые он получил бы, если бы являлся отдельной переменной.
При использовании инструкции Dim в процедуре ее обычно помещают в начало процедуры.

Пример
В данном примере инструкция Dim используется для объявления переменных и массивов. По умолчанию нижняя граница индексов массива равняется 0; для ее изменения следует использовать инструкцию Option Base на уровне модуля.

' По умолчанию AnyValue и MyValue являются переменными типа Variant
' и имеют пустые значения.
Dim AnyValue, MyValue

' Явно объявляет переменную типа Integer.
Dim Number As Integer

' Несколько объявлений на одной строке. AnotherVar является переменной
' типа Variant, поскольку ее тип опущен.
Dim AnotherVar, Choice As Boolean, BirthDate As Date

' DayArray является массивом, состоящим из 51 элемента типа Variant.
' Индексы элементов массива лежат в диапазоне от 0 до 50, если для
' текущего модуля используемая по умолчанию нижняя граница элементов
' массива (0) не изменена с помощью инструкции Option Base.
Dim DayArray(50)

' Matrix является двумерным массивом значений типа Integer.
Dim Matrix(3, 4) As Integer

' MyMatrix является трехмерным массивом значений типа Double с явно
' заданными границами индексов.
Dim MyMatrix(1 To 5,  4 To 9,  3 To 5) As Double

' BirthDay является массивом дат с индексами от 1 до 10.
Dim BirthDay(1 To 10) As Date

' MyArray является динамическим массивом значений типа Variant.
Dim MyArray()


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 15 - Инструкция Do...Loop

Шаг 15 - Инструкция Do...Loop

Повторяет выполнение набора инструкций, пока условие имеет значение True или пока оно не примет значение True.

Do [{While | Until} условие]
[инструкции]
[Exit Do]
[инструкции]
Loop

Do
[инструкции]
[Exit Do]
[инструкции]
Loop [{While | Until} условие]

Параметры
условие
Необязательный. Числовое выражение или строковое выражение, которое имеет значение True или False. Если условие имеет значение Null,то аргумент условие рассматривается как значение False. инструкции
Одна или несколько инструкций, выполнение которых повторяется, пока условие имеет значение True или пока оно не приобретет значение True.

Замечания
В любом месте управляющей структуры Do…Loop может быть размещено любое число инструкций Exit Do, обеспечивающих альтернативные возможности выхода из цикла Do…Loop. Часто используемая вместе с определением некоторого условия (например, If…Then), инструкция Exit Do передает управление инструкции, непосредственно следующей за инструкцией Loop.
Во вложенных циклах Do…Loop инструкция Exit Do передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.

Пример
В данном примере показано, как можно использовать инструкции Do...Loop. Внутренний цикл Do...Loop выполняется 10 раз, затем логической переменной присваивается значение False, после чего он преждевременно завершается с помощью инструкции Exit Do. Внешний цикл завершается немедленно после проверки значения логической переменной.

Dim Check, Counter
Check = True: Counter = 0	' Инициализирует переменные.
Do	' Внешний цикл.
    Do While Counter < 20	' Внутренний цикл.
        Counter = Counter + 1	' Увеличивает счетчик.
        If Counter = 10 Then	' Если условие истинно.
            Check = False	' Присваивает переменной
                ' значение False.
            Exit Do	' Завершает внутренний цикл.
        End If
    Loop
Loop Until Check = False	' Немедленно завершает внешний цикл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 16 - Инструкция End

Шаг 16 - Инструкция End

Завершает процедуру или блок.

  • End - Завершает выполнение. Никогда не является обязательной, но может быть помещена в любое место процедуры для закрытия файлов, открытых с помощью инструкции Open, и для очистки переменных.
  • End Function - Обязательная инструкция для завершения конструкции Function.
  • End If - Обязательная инструкция для завершения конструкции If…Then…Else.
  • End Property - Обязательная инструкция для завершения конструкций Property Let, Property Get или Property Set.
  • End Select - Обязательная инструкция для завершения конструкции Select Case.
  • End Sub - Обязательная инструкция для завершения конструкции Sub.
  • End Type - Обязательная инструкция для завершения описания определяемого пользователем типа (конструкция Type).
  • End With - Обязательная инструкция для завершения конструкции With.

Замечания
При выполнении инструкции End производится сброс всех переменных на уровне модуля и всех статических локальных переменных во всех модулях. Если требуется сохранить значения этих переменных, следует использовать инструкцию Stop. Затем можно возобновить выполнение с использованием сохраненных значений этих переменных.
Инструкция End мгновенно останавливает выполнение программы, не вызывая события Unload, QueryUnload или Terminate, а также другую программу Visual Basic. Программы, связанные с событиями Unload, QueryUnload и Terminate форм и модулей классов, не выполняются. Созданные из модулей классов объекты уничтожаются, открытые инструкцией Open файлы закрываются, а использованная программой память освобождается. Ссылки на объекты, содержащиеся в других программах, нарушаются.
Инструкция End предоставляет способ вызвать непредусмотренную остановку программы. Для нормального завершения программы Visual Basic необходимо выгрузить все формы. Программа закрывается, как только не станет других программ, содержащих ссылки на объекты, созданные из общих модулей классов, и отсутствует выполнение кода программы.

Пример
В данном примере инструкция End используется для завершения выполнения программы, если пользователь введет неправильный пароль.

Sub Form_Load
    Dim Password, Pword
    PassWord = "МОЙ_ПАРОЛЬ"
    Pword = InputBox("Введите пароль
    If Pword <> PassWord Then
        MsgBox "Неправильный пароль"
        End
    End If
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 17 - Инструкция Erase

Шаг 17 - Инструкция Erase

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

Erase списокМассивов

Параметры
списокМассивов
Обязательный аргумент списокМассивов представляет имена одной или нескольких очищаемых переменных массивов, разделенных запятой.

Замечания
Важно знать, имеет ли массив фиксированный размер (обычный массив) или является динамическим, поскольку инструкция Erase выполняется по-разному, в зависимости от типа массива. Инструкция Erase не освобождает память для массивов фиксированной длины. Инструкция Erase устанавливает элементы массивов фиксированной длины следующим образом:

  • Массив чисел - Присваивает каждому элементу значение 0.
  • Массив строк(переменной длины) - Присваивает каждому элементу значение пустой строки ("").
  • Массив строк(фиксированной длины) - Присваивает каждому элементу значение нуля.
  • Массив типа Variant - Присваивает каждому элементу значение Empty.
  • Массив определяемого пользователем типа - Присваивает каждому элементу значение, как отдельной переменной.
  • Массив объектов - Присваивает каждому элементу специальное значение Nothing.

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

Пример
В данном примере инструкция Erase используется для повторной инициализации элементов массивов фиксированной длины и освобождения памяти, отведенной для динамического массива.

' Объявляет переменные-массивы.
Dim NumArray(10) As Integer			' Массив значений типа Integer.
Dim StrVarArray(10) As String		' Массив строк переменной длины.
Dim StrFixArray(10) As String * 10		' Массив строк фиксированной длины.
Dim VarArray(10) As Variant			' Массив типа Variant.
Dim DynamicArray() As Integer		' Динамический массив.
ReDim DynamicArray(10)			' Занимает память.
Erase NumArray				' Каждый элемент становится равным 0.
Erase StrVarArray				' Каждый элемент становится пустой строкой ("").
Erase StrFixArray				' Каждый элемент становится равным 0.
Erase VarArray				' Каждый элемент становится пустым.
Erase DynamicArray				' Освобождает память, используемую массивом.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 18 - Инструкция Error

Шаг 18 - Инструкция Error

Имитирует возникновение ошибки.

Error кодОшибки

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

Замечания
Инструкция Error поддерживается для совместимости с предыдущими версиями. В новой программе, в особенности при создании объектов, следует применять для создания ошибок выполнения метод Raise объекта Err.
Если аргумент кодОшибки определен, инструкция Error заполняет свойства объекта Err значениями по умолчанию (перечисленными в следующей таблице), после чего вызывает обработчик ошибок:

  • Number - Значение, указанное в аргументе инструкции Error. Любой допустимый код ошибки.
  • Source - Имя текущего проекта Visual Basic.
  • Описание - Строковое выражение, соответствующее значению, возвращаемому функцией Error для кода ошибки, указанного в свойстве Number, если такая строка сообщения существует. Если возвращаемое сообщение не определено, значением свойства Description становится пустая строка ("").
  • HelpFile - Полное имя (включая диск им путь) соответствующего файла справочной системы Visual Basic.
  • HelpContext - Контекстный идентификатор раздела файла справочной системы Visual Basic, соответствующего ошибке с кодом Number.
  • LastDLLError - Нуль.

Если обработчик ошибок отсутствует или не активизирован, то сообщение об ошибке создается и выводится на основании значений свойств объекта Err.
Не все главные приложения Visual Basic позволяют создавать объекты. О возможности создания в приложении классов и объектов см. в документации приложения.

Пример
В данном примере инструкция Error используется для имитации ошибки с кодом 11.

On Error Resume Next	' Отложенный перехват ошибок.
Error 11			' Имитация ошибки "Деление на нуль".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 19 - Инструкция Exit

Шаг 19 - Инструкция Exit

Завершает выполнение блока программы Do…Loop, For...Next, Function, Sub или Property.

  • Exit Do - Предоставляет способ завершения цикла Do...Loop. Может использоваться только внутри конструкции Do...Loop. Exit Do передает управление инструкции, следующей за инструкцией Loop. При использовании во вложенных циклах Do...Loop, инструкция Exit Do передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.
  • Exit For - Предоставляет способ завершения цикла For. Может применяться только в цикле For...Next или For Each...Next. Exit For передает управление инструкции, следующей за инструкцией Next. При использовании во вложенных циклах For, инструкция Exit For передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.
  • Exit Function - Немедленно завершает выполнение процедуры Function, в которой появляется эта инструкция. Выполнение продолжается с инструкции, следующей за инструкцией, в которой вызывалась процедура Function.
  • Exit Property - Немедленно завершает выполнение процедуры Property, в которой появляется эта инструкция. Выполнение продолжается с инструкции, следующей за инструкцией, в которой вызывалась процедура Property.
  • Exit Sub - Немедленно завершает выполнение процедуры Sub, в которой появляется эта инструкция. Выполнение продолжается с инструкции, следующей за инструкцией, в которой вызывалась процедура Sub.

Замечания
Не следует путать инструкции Exit с инструкциями End. Инструкция Exit не определяет конец структуры.

Пример
В данном примере инструкция Exit используется для завершения цикла For...Next, цикла Do...Loop и процедуры Sub.

Sub ExitStatementDemo()
Dim I, MyNum
    Do					' Бесконечный цикл.
        For I = 1 To 1000			' Цикл выполняется 1000 раз.
            MyNum = Int(Rnd * 1000)	' Генерирует случайное число.
            Select Case MyNum		' Анализирует случайное число.
                Case 7: Exit For	' Если 7, завершает цикл For...Next.
                Case 29: Exit Do	' Если 29, завершает цикл Do...Loop.
                Case 54: Exit Sub	' Если 54, завершает процедуру Sub.
            End Select
        Next I
    Loop
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 20 - Инструкция FileCopy

Шаг 20 - Инструкция FileCopy

Копирует файл.

FileCopy source, destination

Параметры
source
Обязательный. Строковое выражение, указывающее имя файла, подлежащего копированию. Аргумент source может содержать имя каталога или папки и диска.
destination
Обязательный. Строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.

Замечания
При попытке скопировать открытый файл с помощью инструкции FileCopy возникает ошибка.

Пример
В данном примере инструкция FileCopy используется для копирования одного файла в другой. Предположим, что файл SRCFILE существует и содержит данные.

Dim SourceFile, DestinationFile
SourceFile = "SRCFILE"			' Файл-источник.
DestinationFile = "DESTFILE"		' Файл-адресат.
FileCopy SourceFile, DestinationFile		' Копирует файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 21 - Инструкция For Each...Next

Шаг 21 - Инструкция For Each...Next

Повторяет выполнение группы инструкций для каждого элемента массива или семейства.

For Each элемент In группа
[инструкции]
[Exit For]
[инструкции]
Next [элемент]

Параметры
элемент
Обязательный. Переменная, используемая для выполнения итераций по элементам семейства или массива. Для семейств элемент может быть только переменной типа Variant, универсальной объектной переменной или переменной, представляющей любой конкретный объект. Для массивов элемент может быть только переменной типа Variant.
группа
Обязательный. Имя семейства объектов или массива (за исключением массивов с определяемыми пользователем типами).
инструкции
Необязательный. Одна или несколько инструкций, которые выполняются над каждым элементом группы.

Замечания
Вход в блок For...Each выполняется только в том случае, если группа содержит хотя бы один элемент. После входа в цикл все инструкции цикла выполняются для первого элемента группы. Затем, если группа содержит другие элементы, инструкции цикла выполняются для каждого элемента. После обработки всех элементов цикл завершается, а выполнение продолжается с инструкции, следующей за инструкцией Next.
В любых местах цикла может размещаться любое число инструкций Exit For, позволяющих выйти из цикла. Инструкция Exit For часто применяется вместе с проверкой некоторого условия (например, If…Then). Она передает управление инструкции, непосредственно следующей за инструкцией Next.
Допускается организация вложенных циклов For...Each...Next (один цикл For...Each...Next располагается внутри другого). Однако каждый элемент цикла должен быть уникальным.
Если опустить элемент в инструкции Next, выполнение продолжается так же, как если бы элемент был указан. При обнаружении инструкции Next до соответствующей инструкции For возникает ошибка.
Не допускается использование инструкции For...Each...Next с массивами, определяемых пользователями типов, поскольку значение типа Variant не может содержать тип, определяемый пользователем.

Пример
В данном примере инструкция For Each...Next просматривает свойство Text каждого элемента семейства, чтобы найти строку "Привет". В данном примере MyObject - объект, который имеет свойство Text и является элементом семейства MyCollection. Оба имени используются исключительно в иллюстративных целях.

Dim Found, MyObject, MyCollection
Found = False					' Инициализирует переменную.
For Each MyObject In MyCollection			' Просматривает каждый элемент.
    If MyObject.Text = "Привет" Then		' Если Text содержит "Привет",
        Found = True			' Присваивает значение True.
        Exit For				' Завершает цикл.
    End If
Next


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 22 - Инструкция For...Next

Шаг 22 - Инструкция For...Next

Повторяет выполнение группы инструкций указанное число раз.

For счетчик = начало To конец [Step шаг]
[инструкции]
[Exit For]
[инструкции]
Next [счетчик]

Параметры
счетчик
Обязательный. Числовая переменная, используемая в качестве счетчика цикла. Эта переменная не может принадлежать к типу Boolean или быть элементом массива.
начало
Обязательный. Начальное значение переменной счетчик.
Конец
Обязательный. Конечное значение переменной счетчик.
Шаг
Необязательный. Значение, на которое изменяется счетчик при каждом выполнении тела цикла. Если это значение не задано, по умолчанию шаг равен единице.
инструкции
Необязательный. Одна или несколько инструкций между For и Next, которые выполняются указанное число раз.

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

Положительное или 0	счетчик <= конец
Отрицательное		счетчик >= конец

После выполнения всех инструкций цикла значение шаг добавляется к текущему значению переменной счетчик. После этого инструкции цикла либо выполняются еще раз (на основе того же условия, которое привело к начальному выполнению цикла), либо цикл завершается и выполнение продолжается с инструкции, следующей за инструкцией Next.
Изменение значения переменной счетчик внутри цикла усложняет чтение и отладку программы.
Альтернативный способ выхода из цикла предоставляет инструкция Exit For. В любых местах цикла может размещаться любое число таких инструкций. Инструкция Exit For часто применяется вместе с проверкой некоторого условия (например, If...Then). Эта инструкция передает управление инструкции, непосредственно следующей за инструкцией Next.
Допускается организация вложенных циклов For...Next (один цикл For...Next располагается внутри другого). Счетчик каждого цикла должен иметь уникальное имя. Допускаются следующие конструкции:

For I = 1 To 10
    For J = 1 To 10
        For K = 1 To 10
            ...
        Next K
    Next J
Next I

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

Пример
В данном примере инструкция For...Next используется для создания строки, содержащей 10 наборов по 10 цифр (от 0 до 9); каждый набор отделяется от следующего одним пробелом. Внешний цикл использует переменную-счетчик, которая уменьшается на единицу при каждом выполнении цикла.

Dim Words, Chars, MyString
For Words = 10 To 1 Step -1 			' Цикл выполняется 10 раз.
    For Chars = 0 To 9				' Цикл выполняется 10 раз.
        MyString = MyString & Chars		' Добавляет цифру в конец строки.
    Next Chars				' Увеличивает счетчик.
    MyString = MyString & " "			' Добавляет пробел.
Next Words


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 23 - Инструкция Function

Шаг 23 - Инструкция Function

Описывает имя, аргументы и текст программы, составляющий тело процедуры Function.

[Public | Private] [Static] Function имя [(списокАргументов)] [As тип]
    [инструкции]
    [имя = выражение]
    [Exit Function]
    [инструкции]
    [имя = выражение]
End Function

Параметры
Public
Необязательный. Указывает, что процедура Function доступна для всех других процедур во всех модулях. При использовании в личном модуле (содержащем инструкцию Option Private) такая процедура недоступна вне проекта.
Private
Необязательный. Указывает, что процедура Function доступна для других процедур только того модуля, в котором она описана.
Static
Необязательный. Указывает, что локальные переменные процедуры Function сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Function, даже если они используются в этой процедуре.
имя
Обязательный. Имя процедуры Function, удовлетворяющее стандартным правилам именования переменных.
списокАргументов
Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Function при ее вызове. Имена переменных разделяются запятой.

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray.
  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.
  • ByRef - Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
  • ParamArray - Необязательный. Используется только в качестве последнего элемента в списке списокАргументов для указания, что конечным аргументом является описанный как Optional массив типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional.
  • имяПеременной - Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
  • тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается) Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, допускается указание определяемого пользователем типа или объектного типа.
  • поУмолчанию - Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

тип
Необязательный. Тип данных значения, возвращаемого процедурой Function, поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (за исключением строк фиксированной длины), Object, Variant или любой определяемый пользователем тип. Невозможен возврат массивов любого типа, однако допускается возврат значения типа Variant, содержащего массив.
инструкции
Необязательный. Любая группа инструкций, выполняемых внутри процедуры Function.
выражение
Необязательный. Возвращаемое значение процедуры Function.

Замечания
Процедуры Function, не описанные явно с помощью ключевых слов Public или Private, по умолчанию являются общими. Если не используется ключевое слово Static, значения локальных переменных не сохраняются между вызовами.
Допускаются рекурсивные процедуры Function; то есть они могут вызывать сами себя для выполнения определенных задач. Однако рекурсия может приводить к переполнению стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Function.
Все выполняемые команды должны содержаться в процедурах. Не допускается определение процедуры Function внутри другой процедуры Function, Sub или Property.
Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Выполнение программы продолжается с инструкции, следующей за инструкцией, в которой была вызвана процедура Function. В любом месте процедуры Function возможно наличие любого числа инструкций Exit Function.
Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, Sqr, Cos или Chr.
Процедура Function вызывается в выражении по своему имени, за которым следует список аргументов в скобках. Для получения дополнительных сведений о вызовах процедур Function см. описание инструкции Call.
Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры. Если имени процедуры не присваивается никакого значения, процедура возвращает значение по умолчанию: числовая функция возвращает нулевое значение, строковая функция возвращает значение пустой строки (""), а функция типа Variant возвращает значение Empty. Функция, которая возвращает ссылку на объект, возвращает значение Nothing, если внутри процедуры Function никакая ссылка на объект не присваивается имени функции с помощью инструкции Set.
В следующем примере демонстрируется присвоение возвращаемого значения функции BinarySearch. В этом случае имени присваивается значение False, чтобы указать, что некоторое значение не было найдено.

Function BinarySearch(. . .) As Boolean
. . .
    ' Значение не найдено. Возвращается значение False.
    If lower > upper Then
        BinarySearch = False
        Exit Function
    End If
. . .
End Function

Переменные, используемые в процедурах Function, разбиваются на две категории: явно описанные внутри процедуры и не описанные внутри процедуры. Переменные, которые явно описаны в процедуре (с помощью ключевого слова Dim или эквивалентного ему), всегда являются локальными для этой процедуры. Переменные, которые используются, но явно не описаны в процедуре, также являются локальными, если они явно не описаны на более высоком уровне.
В процедуре допускается использование переменной, которая явно не описана в этой процедуре, но при этом может возникать конфликт имен, если на уровне модуля был определен элемент с тем же самым именем. Если в процедуре содержится ссылка на неописанную переменную, имя которой совпадает с именем другой процедуры, константы или переменной, то подразумевается, что процедура ссылается на это имя на уровне модуля. Чтобы избежать возникновения конфликтов такого рода, следует пользоваться явным описанием переменных. Для включения обязательного явного описания переменных используется инструкция Option Explicit.
В языке Visual Basic возможна реорганизация арифметических выражений для увеличения скорости их выполнения. Избегайте применения процедуры Function в арифметическом выражении, если эта процедура изменяет значения переменных, используемых в этом же выражении.

Пример
В данном примере инструкция Function используется для объявления имени, аргументов и кода, составляющих основу процедуры Function. В последнем примере используются инициализированные аргументы Optional с заданным типом.

' Следующая функция, определенная пользователем, возвращает
' квадратный корень из переданного ей аргумента.
Function CalculateSquareRoot(NumberArg As Double) As Double
    If NumberArg < 0 Then					' Анализирует аргумент.
        Exit Function					' Возврат в вызывающую
                                ' процедуру.
    Else
        CalculateSquareRoot = Sqr(NumberArg)			' Возвращает квадратный
                                ' корень.
    End If
End Function

Ключевое слово ParamArray позволяет функции принимать переменное число аргументов. В следующем описании FirstArg передается по значению.

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs())
Dim ReturnValue
' Если функция вызывается следующим образом:
ReturnValue = CalcSum(4, 3 ,2 ,1)
' Локальные переменные принимают следующие значения: FirstArg = 4,
' OtherArgs(1) = 3, OtherArgs(2) = 2 и т.п., если нижняя граница
' индексов массивов равняется 1.

Аргументы OptionalVariant.

' Если аргументы функции описаны следующим образом:
Function MyFunc(MyStr As String, Optional MyArg1 As _ Integer = 5, Optional MyArg2 = "Мария")
Dim RetVal
' Функция может быть вызвана следующим образом:
RetVal = MyFunc("Всем", 2, "Привет")			' Указаны все 3 аргумента.
RetVal = MyFunc("Тест", , 5)			' Второй аргумент опущен.
                        ' Первый и третий аргументы(именованные аргументы).
RetVal = MyFunc(MyStr:="Привет ", MyArg1:=7)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 24 - Инструкция Get

Шаг 24 - Инструкция Get

Читает данные из открытого файла на диске в переменную.

Get [#]номерФайла, [номерЗаписи], имяПеременной

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
номерЗаписи
Необязательный. Тип Variant(Long). Номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение.
имяПеременной
Обязательный. Допустимое имя переменной, в которую следует поместить считанные данные.

Замечания
Данные, считываемые с помощью инструкции Get, обычно записываются в файл с помощью инструкции Put.
Первой записи (или байту) файла соответствует номер 1, второй (или второму) 2 и т.п. Если аргумент номерЗаписи опущен, читается запись (или байт), на которую был установлен указатель после выполнения последней инструкции Get или Put (или переведен при последнем вызове функции Seek). Наличие запятых-разделителей является обязательным, например:

Get #4,,FileBuffer

Для файлов, открытых в режиме Random, применимы следующие правила:
Даже если длина данных, подлежащих чтению, меньше длины записи, указанной в предложении Len инструкции Open, инструкция Get начинает чтение каждой следующей записи с начала этой записи. Пространство между концом одной записи и началом следующей записи заполняется текущим содержимым буфера файла. Поскольку объем данных, используемых для заполнения, не может быть определен с достаточной степенью уверенности, рекомендуется, чтобы длина записи совпадала с длиной читаемых данных.
Если данные считываются в строку переменной длины, инструкция Get сначала считывает 2-байтовый дескриптор, содержащий длину строки, а затем данные, которые следует поместить в эту переменную. Таким образом, длина записи, указанная в предложении Len инструкции Open, должна быть по крайней мере на 2 байта больше, чем фактическая длина этой строки.
Если данные считываются в переменную Variant числового типа, инструкция Get сначала считывает 2 байта, указывающие подтип (VarType) этой переменной, а затем данные, которые следует поместить в эту переменную. Например, при чтении переменной Variant подтипа VarType 3 инструкция Get считывает 6 байт: 2 байта, указывающие подтип переменной Variant как VarType 3 (Long), и 4 байта, содержащие значение типа Long. Длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактический размер, необходимый для размещения этой переменной.
С помощью инструкции Get можно считать массив типа Variant с диска, однако нельзя прочитать скаляр типа Variant, содержащий массив. Кроме того, инструкцию Get нельзя использовать для чтения объектов с диска.
Если данные считываются в переменную типа Variant подтипа VarType 8 (String), инструкция Get сначала считывает 2 байта, указывающие VarType, потом 2 байта, указывающие длину строки, а затем содержимое строки. Длина записи, указанная в предложении Len инструкции Open, должна быть по крайней мере на 4 байта больше, чем фактическая длина этой строки.
Если данные считываются в динамический массив, инструкция Get сначала считывает дескриптор, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open , должна быть больше либо равна сумме всех байтов, необходимых для размещения массива данных и дескриптора массива. Например, для размещения описанного ниже массива требуется 118 байт.

Dim MyArray(1 To 5,1 To 10) As Integer

118 байт распределяются следующим образом: 18 для дескриптора (2 + 8 * 2) и 100 байт для данных (5 * 10 * 2).
Если данные считываются в массив фиксированного размера, инструкция Get считывает только данные. Дескриптор не считывается.
Если данные считываются в переменную любого другого типа (кроме строки переменной длины и переменной типа Variant), инструкция Get считывает только данные. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна длине данных, подлежащих считыванию.
Инструкция Get считывает элементы определяемых пользователем типов так, будто это отдельные переменные, за исключением того, что пространство между элементами не заполняется текущим содержимым буфера файла. На диске динамический массив типа, определенного пользователем (записанный с помощью инструкции Put) предваряется дескриптором, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения отдельных элементов, в том числе, массивов и их дескрипторов.
Для файлов, открытых в режиме Binary, применимы все перечисленные выше правила, за исключением следующих:
Предложение Len инструкции Open игнорируется. Инструкция Get считывает все переменные с диска непрерывно, т.е. без заполнения пространства между записями текущим содержимым буфера файла.
При чтении любых массивов, кроме являющихся элементами типов, определяемых пользователем, инструкция Get считывает только данные. Дескриптор не считывается.
При считывании строк переменной длины, не являющихся элементами типов, определяемых пользователем, 2-байтовый дескриптор не считывается. Число считываемых байт равняется числу символов, уже содержащихся в строке. Например, следующие инструкции считают 10 байт из файла, которому соответствует номер 1:

VarString = String(10," ")
Get #1,,VarString

Пример
В данном примере инструкция Get используется для чтения данных из файла в переменную. Предполагается, что файл TESTFILE содержит пять записей определенного пользователем типа Record.

Type Record					' Тип, определенный пользователем.
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, Position		' Объявляет переменную.
                        ' Открывает файл произвольного доступа.
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
                        ' Читает из файла с помощью инструкции Get.
Position = 3					' Определяет номер записи.
Get #1, Position, MyRecord			' Читает третью запись.
Close #1					' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 25 - Инструкция GoSub...Return

Шаг 25 - Инструкция GoSub...Return

Задает переход в подпрограмму и возвращение из нее в процедуру.

GoSub строка
...
строка
...
Return

Параметры

строка
Аргумент строка может быть любой меткой строки или номером строки.

Замечания
Допускается использование инструкций GoSub и Return в любом месте процедуры, но GoSub и соответствующая инструкция Return должны находиться в одной процедуре. Подпрограмма может содержать несколько инструкций Return. Первая обнаруженная инструкция Return приводит к передаче управления назад к инструкции, непосредственно следующей за последней выполненной инструкцией GoSub.
Невозможен вызов или завершение процедур Sub с помощью GoSub...Return.
Создание отдельных процедур для вызова из программы может обеспечить более структурированный подход, чем использование конструкций GoSub...Return.

Пример

В данном примере инструкция GoSub используется для вызова подпрограммы из процедуры Sub. Инструкция Return возвращает управление инструкции, следующей сразу после инструкции GoSub. Инструкция Exit Sub используется, чтобы управление не было случайно передано подпрограмме.

Sub GosubDemo()
Dim Num
' Запрашивает число у пользователя.
    Num = InputBox("Введите положительное четное число.")
' Вызывает подпрограмму только в том случае,
' если было введено положительное число.
    If Num > 0 Then GoSub MyRoutine
    Debug.Print Num
    Exit Sub	' Запрещает передачу управления процедуре.
MyRoutine:
    Num = Num/2	' Выполняет деление.
    Return		' Возвращает управление инструкции,
End Sub			' следующей после инструкции GoSub.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 26 - Инструкция GoTo

Шаг 26 - Инструкция GoTo

Задает безусловный переход на указанную строку внутри процедуры.

GoTo строка

Параметры
строка
Обязательный аргумент строка может быть любой меткой строки или номером строки.

Замечания
Инструкция GoTo позволяет переходить только на строки внутри той процедуры, в которой она находится.
Слишком большое число инструкций GoTo затрудняет чтение и отладку программ. По возможности следует использовать структурные управляющие инструкции (Do...Loop, For...Next, If...Then...Else, Select Case).

Пример
В данном примере инструкция GoTo используется для перехода к строкам с указанными метками внутри процедуры.

Sub GotoStatementDemo()
Dim Number, MyString
    Number = 1 	' Инициализирует переменную.
            ' Анализирует Number и переходит к соответствующей метке.
    If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:
    MyString = "Number =1"
    GoTo LastLine	' Переход к метке LastLine.
Line2:
    ' Следующая инструкция не будет выполнена никогда.
    MyString = "Number =2"
LastLine:
    Debug.Print MyString	' Выводит "Number = 1"
                ' в окно отладки.
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 27 - Инструкция If...Then...Else

Шаг 27 - Инструкция If...Then...Else

Задает выполнение определенных групп инструкций в зависимости от значения выражения.

If условие Then [инструкции] [Else инструкции_else]

If условие Then
[инструкции]
[ElseIf условие-n Then
[инструкции_elseif] ...
[Else
[инструкции_else]]
End If

Параметры
условие
Обязательный. Одно или несколько выражений одного из двух типов: Числовое выражение или строковое выражение, имеющее значение True или False. Если аргумент условие имеет значение Null, то условие рассматривается как значение False. Выражение вида TypeOf имяОбъекта Is типОбъекта. Аргумент имяОбъекта может быть любой ссылкой на объект, а типОбъекта представлять любой допустимый тип объекта. Выражение имеет значение True, если объект имяОбъекта имеет тип объекта, указанный в аргументе типОбъекта; в противном случае выражение имеет значение False.
инструкции
Необязательный в блоковый форме; обязательный в строчной форме без предложения Else. Одна или несколько инструкций, разделяемых двоеточиями; выполняются, если условие имеет значение True.
условие-n
Необязательный. Аналогичен элементу условие.
инструкции_elseif
Необязательный. Одна или несколько инструкций, которые выполняются, если соответствующее условие-n имеет значение True.
инструкции_else
Необязательный. Одна или несколько инструкций, которые выполняются, если ни одно из предыдущих выражений условие или условие-n не имеет значение True.

Замечания
Простую однострочную форму рекомендуется использовать для коротких, простых проверок. Однако блочная форма обеспечивает более структурированный подход и большую гибкость по сравнению с однострочной формой. Блочная форма обычно проще для чтения, обработки и отладки.
Однострочная форма допускает выполнение нескольких инструкций в результате проверки одного условия If...Then, но все инструкции должны находиться на одной строке и разделяться двоеточием, как в следующем примере:

If A > 10 Then A = A + 1 : B = B + A : C = C + B

В блоковой форме инструкция If должна быть первой инструкцией в строке. Компоненты Else, ElseIf и End If могут иметь перед собой только номер строки или метку строки. Блок If должен заканчиваться инструкцией End If.
Для того чтобы определить, представляет инструкция блок If или нет, проверяется элемент, следующий за ключевым словом Then. Если после Then на той же строке стоит любой элемент, не являющийся комментарием, эта инструкция рассматривается как однострочная инструкция If.
Оба предложения Else и ElseIfIf допускается любое число предложений ElseIf, но ни одно такое предложение не может появляться после предложения Else. Допускаются вложенные блоки инструкций If; то есть блоки If, содержащиеся в других блоках.
При выполнении блока If (вторая форма синтаксиса), проверяется условие. Если условие имеет значение True, выполняются инструкции, следующие за Then. Если условие имеет значение False, то по очереди оценивается каждое условие ElseIf (если такие имеются). При обнаружении условия со значением True выполняются инструкции, непосредственно следующие за соответствующим предложением Then Если ни одно из условий ElseIf не имеет значение True (или предложения ElseIf отсутствуют), выполняются инструкции, следующие за Else. После выполнения инструкций, следующих за Then или Else, выполнение продолжается с инструкции, следующей за End If.
При оценке одного выражения, которое имеет несколько возможных значений, более полезной может оказаться конструкция Select Case. Однако предложение TypeOf имяОбъекта Is типОбъекта не может использоваться с инструкцией Select Case.

Пример
В данном примере показано использование как блоковой, так и однострочной форм инструкции If...Then...Else, а также проиллюстрировано использование инструкции If TypeOf...Then...Else.

Dim Number, Digits, MyString
Number = 53			' Инициализирует переменную.
If Number < 10 Then
    Digits = 1
ElseIf Number < 100 Then
                ' Условие является истинным, поэтому выполняется следующая инструкция.
    Digits = 2
Else
    Digits = 3
End If
 Использует однострочную форму для присвоения значения.
If Digits = 1 Then MyString = "Один" Else MyString = "Больше 1"

Использует конструкцию If TypeOf для определения, является ли элемент управления, переданный процедуре текстовым полем.

Sub ControlProcessor(MyControl As Control)
    If TypeOf MyControl Is CommandButton Then
        Debug.Print "Передан " & TypeName(MyControl)
    ElseIf TypeOf MyControl Is CheckBox Then
        Debug.Print "Передан " & TypeName(MyControl)
    ElseIf TypeOf MyControl Is TextBox Then
        Debug.Print "Передан " & TypeName(MyControl)
    End If
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 28 - Инструкция Input #

Шаг 28 - Инструкция Input #

Читает данные из открытого последовательного файла и присваивает их переменным.

Input #номерФайла, списокПеременных

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
списокПеременных
Разделяемый запятыми список переменных, которым следует присвоить значения, считанные из файла. Нельзя использовать массивы или объектные переменные. Однако допускается использование переменных, описывающих элементы массива или определяемого пользователем типа.

Замечания
Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #. Эта инструкция применима только к файлам, открытым в режиме Input или Binary.
После считывания стандартные строки и числовые данные присваиваются переменным без изменения. В следующей таблице показано, как обрабатываются остальные данные:

Запятая-разделитель
или пустая строка		Empty
#NULL#	Null
#TRUE# или #FALSE#		True или False
#yyyy-mm-dd hh:mm:ss#	Дата и/или время, являющиеся результатом выражения.
#ERROR кодОшибки#		кодОшибки (переменная типа Variant, помеченная как ошибка).

Прямые кавычки (" ") внутри считываемых данных игнорируются.
Элементы данных в файле должны располагаться в том же порядке, что и переменные в спискеПеременных, и иметь соответствующие переменным типы данных. Если переменная является числовой, а элемент данных нечисловым, переменной присваивается нулевое значение.
При достижении конца файла во время считывания элемента данных ввод прекращается и возникает ошибка.
Чтобы иметь возможность корректно считывать данные из файла в переменные с помощью инструкции Input #, следует всегда использовать инструкцию Write # (а не Print #) для записи данных в файлы. Использование инструкции Write # гарантирует правильность размещения разделителей между отдельными элементами данных.

Пример
В данном примере инструкция Input # используется для чтения данных из файла в две переменные. Предположим, что текстовый файл TESTFILE существует и содержит несколько строк текста, записанных с помощью инструкции Write #, т.е. каждая строка содержит заключенную в кавычки строку и отделенное от нее запятой число, например ("Привет", 234).

Dim MyString, MyNumber
Open "TESTFILE" For Input As #1		' Открывает файл для чтения.
Do While Not EOF(1)			' Цикл до конца файла.
    Input #1, MyString, MyNumber	' Читает данные в две переменные.
    Debug.Print MyString, MyNumber	' Выводит данные в окно отладки.
Loop
Close #1	' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 29 - Инструкция Kill

Шаг 29 - Инструкция Kill

Удаляет файлы с диска.

Kill путь

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

Замечания
Инструкция Kill поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.
При попытке удалить открытый файл с помощью инструкции Kill возникает ошибка.
Для удаления каталогов следует использовать инструкцию RmDir.

Пример
В данном примере инструкция Kill используется для удаления файла с диска. Поскольку Macintosh не поддерживает подстановочные знаки, для указания типа файлов вместо их имен можно использовать функцию MacID.

' Предположим что файл TESTFILE существует и содержит данные.
Kill "TestFile"	' Удаляет файл.

' В Microsoft Windows:
' Удаляет все файлы с расширением .TXT из текущего каталога.
Kill "*.TXT"

' На Macintosh:
' Функция MacID используется для удаления всех файлов типа "PICT"
' из текущей папки.
Kill MacID("PICT")


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 30 - Инструкция Let

Шаг 30 - Инструкция Let

Присваивает значение выражения переменной или свойству.

[Let] имяПеременной = выражение

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

Замечания
Значение выражения может быть присвоено переменной или свойству, только если оно имеет совместимый с этой переменной тип данных. Невозможно присвоить строковое выражение числовой переменной или числовое выражение строковой переменной. Такая попытка приведет к ошибке во время компиляции.
Переменным типа Variant могут присваиваться как строковые, так и числовые выражения. Однако обратное не всегда верно. Любое значение типа Variant, за исключением значения Null, допускает присвоение строковой переменной, но только значение типа Variant, которое может рассматриваться как число, может быть присвоено числовой переменной. Пользуйтесь функцией IsNumeric для определения возможности преобразования значения Variant в числовое значение.
Присвоение выражения с одним из числовых типов переменной с другим числовым типом данных преобразует значение выражения в тип данных результирующей переменной.
Инструкция Let может быть использована для присвоения одной переменной-записи другой, только если обе переменные имеют одинаковый определяемый пользователем тип. Для присвоения переменных-записей различных определяемых пользователем типов используется инструкция LSet. Для присвоения переменным ссылок на объекты применяется инструкция Set.

Пример
В данном примере значения выражений присваиваются переменным с помощью явных и неявных инструкций Let.

Dim MyStr, MyInt
' Следующие присвоения используют инструкцию Let.
Let MyStr = "Привет"
Let MyInt = 5

Ниже приведены эквивалентные присвоения, не использующие инструкцию Let.

Dim MyStr, MyInt
MyStr = "Привет"
MyInt = 5


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 31 - Инструкция Line Input #

Шаг 31 - Инструкция Line Input #

Читает строку из открытого последовательного файла и присваивает ее переменной типа String.

Line Input #номерФайла, имяПеременной

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
имяПеременной
Обязательный. Допустимое имя переменной типа Variant или String.

Замечания
Данные, считываемые с помощью инструкции Line Input #, обычно записываются в файл с помощью инструкции Print #.
Инструкция Line Input # последовательно считывает из файла по одному символу до тех пор, пока не встретит символ возврата каретки (Chr(13)) или комбинацию символов возврата каретки и перевода строки (Chr(13) + Chr(10)). Когда считанная строка присваивается переменной, символы возврата каретки и конца строки отбрасываются.

Пример

В данном примере инструкция Line Input # используется для чтения строки из последовательного файла и присвоения ее переменной. Предположим, что текстовый файл TESTFILE существует и содержит несколько строк текста.

Dim TextLine
Open "TESTFILE" For Input As #1		' Открывает файл.
Do While Not EOF(1)			' Цикл до конца файла.
    Line Input #1, TextLine		' Читает строку в переменную.
    Debug.Print TextLine		' Выводит в окно "Отладка".
Loop
Close #1				' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 32 - Инструкция Load

Шаг 32 - Инструкция Load

Загружает объект, но не отображает его на экране.

Load объект

Параметры
объект
Прототип объект представляет собой объектное выражение, значением которого является один из объектов, перечисленных в списке "Применение".

Замечания
Когда объект загружается, он помещается в память, но не становится видимым. Чтобы сделать объект видимым, используется метод Show. Пока объект не станет видимым, пользователь не может взаимодействовать с ним, однако с объектом можно работать программным образом в его процедуре обработки события Initialize (Инициализация).

Пример
В данном примере в момент, когда для формы UserForm1 происходит событие "Инициализация" (Initialize), загружается форма UserForm2. При последующем выделении с помощью мыши UserForm2 открывается UserForm1.

' Процедура события "Инициализация" (Initialize)
' для формы UserForm1.
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub

' Событие "Нажатие кнопки" (Click) для формы UserForm2.
Private Sub UserForm_Click()
    UserForm2.Hide
End Sub

' Событие "Нажатие кнопки" (Click) для формы UserForm1
Private Sub UserForm_Click()
    UserForm2.Show
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 33 - Инструкции Lock и Unlock

Шаг 33 - Инструкции Lock и Unlock

Управляют доступом других процессов ко всему файлу, открытому с помощью инструкции Open, или к его части.

Lock [#]номерФайла[, диапазонЗаписей]
. . .
Unlock [#]номерФайла[, диапазонЗаписей]

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
диапазонЗаписей
Необязательный. Диапазон записей, которые следует заблокировать или разблокировать.

  • номерЗаписи - Номер записи (режим Random) или номер байта (режим Binary), с которого следует начать установку или снятие блокировки.
  • начало - Номер первой записи (или байта), которую следует заблокировать или разблокировать.
  • конец - Номер последней записи (или байта), которую следует заблокировать или разблокировать.

Замечания
Инструкции Lock и Unlock используются в средах, в которых нескольким процессам может понадобиться доступ к одному и тому же файлу.
Инструкции Lock и Unlock всегда используются парами. Аргументы инструкций Lock и Unlock, образующих пару, должны полностью совпадать.
Первой записи (или байту) файла соответствует номер 1, второй 2 и т.п. Если указана только одна запись, то блокируется или разблокируется только одна эта запись. Если диапазон записей указан, но опущен аргумент начало, блокируются или разблокируются все записи от первой записи до конца диапазона (конец). Вызов инструкции Lock без аргумента номерЗаписи блокирует весь файл. Вызов инструкции Unlock без аргумента номерЗаписи приводит к снятию блокировки со всего файла.
Если файл открыт для последовательного ввода или вывода, инструкции Lock и Unlock блокируют или разблокируют весь файл, независимо от наличия остальных аргументов.
Перед закрытием файла или завершением работы с программой не забудьте удалить все блокировки с помощью инструкции Unlock. Несоблюдение этого правила может привести к непредсказуемым последствиям.

Пример
В данном примере с помощью инструкций Lock и Unlock запрещается доступ других процессов к записи на время ее изменения. Предположим, что файл TESTFILE содержит пять записей определенного пользователем типа Record.

Type Record				' Тип, определенный пользователем.
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, RecordNumber	' Объявляет переменную.
' Открывает файл произвольного доступа.
Open "TESTFILE" For Random Shared As #1 Len = Len(MyRecord)
RecordNumber = 4				' Определяет номер записи.
Lock #1, RecordNumber			' Блокирует запись.
Get #1, RecordNumber, MyRecord		' Читает запись.
MyRecord.ID = 234				' Изменяет запись.
MyRecord.Name = "Иван Петров"
Put #1, RecordNumber, MyRecord		' Записывает измененную запись.
Unlock #1, RecordNumber			' Разблокирует текущую запись.
Close #1					' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 34 - Инструкция LSet

Шаг 34 - Инструкция LSet

Выравнивает строку по левому краю строковой переменной или копирует переменную одного определяемого пользователем тип в переменную другого типа, также определенного пользователем.

LSet переменная = строка
LSet имяПеременной1 = имяПеременной2

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

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

Пример
В данном примере инструкция LSet используется для выравнивания строки по левому краю строковой переменной. Несмотря на то, что функцию LSet также можно использовать для копирования переменной одного типа, определенного пользователем, в переменную другого (совместимого) типа, также определенного пользователем, делать это не рекомендуется, поскольку это может привести к потере переносимости на другую платформу.

Dim MyString
MyString = "0123456789"		' Инициализирует строку.
Lset MyString = "<-Left"	' MyString содержит "<-Left    ".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 35 - Инструкция Mid

Шаг 35 - Инструкция Mid

Заменяет указанное число символов в переменной типа Variant (String) символами из другой строки.

Mid(переменная, начало[, длина]) = строка

Параметры
переменная
Обязательный. Имя строковой переменной, подлежащей изменению.
начало
Обязательный. Значение типа Variant (Long). Позиция символа в переменной, с которого начинается замена.
длина
Необязательный. Значение типа Variant (Long). Число символов, подлежащих замене. Если этот аргумент опущен, используется вся строка.
строка
Обязательный. Строковое выражение, предназначенное для замены части строки переменная.

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

Пример
В данном примере инструкция Mid используется для замены указанного числа символов строковой переменной символами из другой строки.

Dim MyString
MyString = "В четверг утром"		' Инициализирует строку.
Mid(MyString, 3, 7) = "пятницу"		' MyString = "В пятницу утром".
Mid(MyString, 3) = "субботу"		' MyString = "В субботу утром".
Mid(MyString, 3) = "субботу вечером"	' MyString = "В субботу вечер".
Mid(MyString, 3, 7) = "воскресенье"	' MyString = "В воскрес вечер".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 36 - Инструкция MkDir

Шаг 36 - Инструкция MkDir

Создает новый каталог или папку.

MkDir путь

Параметры
путь
Обязательный аргумент путь является строковым выражением, определяющим создаваемый каталог или папку. Аргумент путь может содержать имя диска. Если диск не указан, инструкция MkDir создает новый каталог или папку на текущем диске.

Пример
В данном примере инструкция MkDir используется для создания каталога или папки. Если диск не указан, новый каталог (или папка) будет размещен на текущем диске.

MkDir "MYDIR"	' Создает новый каталог или папку.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 37 - Инструкция Name

Шаг 37 - Инструкция Name

Изменяет имя файла, каталога или папки.

Name староеИмя As новоеИмя

Параметры
староеИмя
Обязательный. Строковое выражение, указывающее имя и положение существующего файла; может содержать имя каталога или папки и диска.
новоеИмя
Обязательный. Строковое выражение, указывающее новое имя и положение файла; может содержать имя каталога или папки и диска. Файл с таким именем не должен существовать.

Замечания
Оба аргумента, новоеИмя и староеИмя, должны указывать на один и тот же диск. Если путь, указанный с помощью аргумента новоеИмя существует и отличен от указанного с помощью аргумента староеИмя, инструкция Name переместит файл в новый каталог или папку и переименует его (если требуется). Если пути, указанные с помощью аргументов новоеИмя и староеИмя, разные, а имена файлов совпадают, инструкция Name переместит файл в новый каталог или папку без изменения его имени. С помощью инструкции Name, можно переместить файл из одного каталога (или папки) в другой, однако нельзя переместить каталог или папку.
При попытке переименовать открытый файл с помощью инструкции Name возникает ошибка. Прежде чем приступить к изменению имени файла, необходимо его закрыть. В аргументах инструкции Name не допускается использование подстановочных знаков для нескольких символов (*) и одного символа (?).

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

Dim OldName, NewName
OldName = "OLDFILE": NewName = "NEWFILE"	' Указывает имена файлов.
Name OldName As NewName				' Переименовывает файл.

' В Microsoft Windows:
OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE"
Name OldName As NewName				' Перемещает и
                        ' переименовывает файл.

' На Macintosh:
OldName = "HD:MY FOLDER:OLDFILE": NewName = "HD:YOUR FOLDER:NEWFILE"
Name OldName As NewName				' Перемещает и
                        ' переименовывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 38 - Инструкция On Error

Шаг 38 - Инструкция On Error

Активизирует подпрограмму обработки ошибок и указывает положение подпрограммы в процедуре; используется также для отключения подпрограммы обработки ошибок.

  • On Error GoTo строка - Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть любая метка строки или номер строки. Если возвращается ошибка выполнения, управление передается на указанную строку и запускается обработчик ошибок. Аргумент строка должен определять строку в той же процедуре, в которой находится инструкция On Error; в противном случае возникает ошибка компиляции.
  • On Error Resume Next - Указывает, что возникновение ошибки выполнения приводит к передаче управления на инструкцию, непосредственно следующую за инструкцией, при выполнении которой возникла ошибка. Рекомендуется при доступе к объектам использовать эту форму инструкции, а не On Error GoTo.
  • On Error GoTo 0 - Отключает любой активизированный обработчик ошибок в текущей процедуре.

Замечания

Если не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается.

"Включенным" обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; "активным" обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.

Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.

Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err.Number содержится в свойстве Err.Description.

Конструкция On Error Resume Next задает продолжение выполнения с инструкции, непосредственно следующей за инструкцией, которая привела к ошибке выполнения, или с инструкции, непосредственно следующей за вызывающей инструкцией в процедуре, содержащей конструкцию On Error Resume Next. Это позволяет продолжить исполнение программы несмотря на ошибку выполнения. Это позволяет также встроить подпрограмму обработки ошибок в процедуру, а не передавать управление в другую часть процедуры. Конструкция On Error Resume Next становится неактивной при вызове новой процедуры, поэтому для внутренней обработки ошибок необходимо выполнять инструкцию On Error Resume Next в каждой вызываемой процедуре.

При обработке ошибок, возникающих при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next, а не конструкцию On Error GoTo. Проверка объекта Err после каждого взаимодействия с другим объектом позволяет устранить неопределенность в том, при доступе к какому объекту возникла ошибка. Это позволяет всегда точно знать, какой объект поместил значение кода ошибки в свойство Err.Number, а также в каком объекте возникла ошибка (эта информация содержится в свойстве Err.Source).

Конструкция On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.

Для того, чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
    On Error GoTo ОбработкаОшибок
    . . .
    Exit Sub
ОбработкаОшибок:
    . . .
    Resume Next
End Sub

В этом примере программа обработки ошибок помещена между инструкциями Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. Программу обработки ошибок можно разместить в любом месте процедуры.

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

Err.Number = vbObjectError + 1052

Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.

Пример

В начале этой программы инструкция On Error GoTo определяет положение подпрограммы обработки ошибок в процедуре. В данном примере попытка удалить открытый файл приводит к возникновению ошибки с кодом 55. Ошибка обрабатывается в подпрограмме, после чего управление возвращается инструкции, которая привела к возникновению ошибки. Инструкция On Error GoTo 0 отключает перехват ошибок. После этого инструкция On Error Resume Next задает отложенный перехват ошибок, что позволяет точно определить, в каком контексте возникла ошибка, генерируемая в следующей инструкции. Следует отметить, что после обработки ошибки вызывается метод Err.Clear для сброса значений свойств объекта Err.

Sub OnErrorStatementDemo()
    On Error GoTo ErrorHandler			' Включаем программу обработки
                        ' ошибок.
    Open "TESTFILE" For Output As #1		' Открываем файл.
    Kill "TESTFILE"				' Попытка удалить открытый
                        ' файл.
    On Error Goto 0				' Отключаем перехват ошибок.
    On Error Resume Next			' Откладываем перехват ошибок.
    ObjectRef = GetObject("MyWord.Basic")	' Запускаем несуществующий
                        ' объект, а затем проверяем
                        ' ошибку механизма управления
                        ' программируемыми объектами.
    If Err.Number = 440 Or Err.Number = 432 Then
    ' Выводим сообщение для пользователя и очищаем объект Err.
        Msg = "Ошибка при попытке открыть программируемый объект!"
        MsgBox Msg, , "Проверка отложенной ошибки"
        Err.Clear			' Очищаем поля объекта Err.
    End If
Exit Sub					' Выходим из процедуры, чтобы
                        ' не попасть в обработчик.
ErrorHandler:					' Обработчик ошибок.
    Select Case Err.Number			' Определяем код ошибки.

Case 55						' "Ошибка "Файл уже открыт".
            Close #1		' Закрываем открытый файл.
        Case Else
    ' Здесь размещаются инструкции для обработки других ошибок...
    End Select
    Resume					' Возобновляем выполнение
                        ' со строки, вызвавшей ошибку.
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 39 - Инструкции On...GoSub, On...GoTo

Шаг 39 - Инструкции On...GoSub, On...GoTo

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

On выражение GoSub списокНазначений
On выражение GoTo списокНазначений

Параметры
выражение
Обязательный. Любое числовое выражение, которое имеет целое значение от 0 до 255 включительно. Если выражение является нецелым числовым выражением, оно округляется до его оценки.
списокНазначений
Обязательный. Список номеров строк или меток строк, разделяемых запятыми.

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

  • Равняется 0 - Управление передается инструкции, следующей за On...GoSub или On...GoTo.
  • Превышает число элементов списка - Управление передается инструкции, следующей за On...GoSub или On...GoTo.
  • Отрицательное - Возникает ошибка. Больше 255 - Возникает ошибка.

В одном списке допускается совместное использование номеров и меток строк. Не существует практического ограничения на число меток и номеров строк, используемых с инструкциями On...GoSub... и On...GoTo. Однако при использовании большего число меток или номеров, чем может уместиться на одной строке, необходимо применять символ продолжения строки для распространения логической строки на несколько физических строк.
Инструкция Select Case обеспечивает более структурированный и гибкий способ выполнения множественных ветвлений.

Пример
В данном примере инструкции On...GoSub и On...GoTo используются для перехода к подпрограммам и строкам с указанными метками, соответственно.

Sub OnGosubGotoDemo()
Dim Number, MyString
    Number = 2			' Инициализирует переменную.
                    ' Переход к Sub2.
    On Number GoSub Sub1, Sub2		' Управление возвращается сюда после
                    ' выполнения On...GoSub.
    On Number GoTo Line1, Line2		' Переход к метке Line2.
                    ' Управление не возвращается сюда после выполнения On...GoTo.
    Exit Sub
Sub1:
    MyString = "Sub1" : Return
Sub2:
    MyString = "Sub2" : Return
Line1:
    MyString = "Метка Line1"

Line2:
    MyString = "Метка Line2"
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 40 - Инструкция Open

Шаг 40 - Инструкция Open

Разрешает выполнение с файлом операций ввода/вывода.

Open путь For режим [Access доступ] [блокировка] As [#]номерФайла [Len=длина]

Параметры
путь
Обязательный. Строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска.
режим
Обязательный. Ключевое слово, указывающее режим файла: Append, Binary, Input, Output или Random. По умолчанию, файл открывается для доступа в режиме Random.
доступ
Необязательный. Ключевое слово, указывающее операции, разрешенные с открытым файлом: Read, Write или Read Write.
блокировка
Необязательный. Ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: Shared, Lock Read, Lock Write и Lock Read Write.
номерФайла
Обязательный. Допустимый номер файла в интервале от 1 до 511 включительно. Для определения следующего свободного номера файла следует использовать функцию FreeFile.
длина
Необязательный. Число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.

Замечания
Чтобы получить возможность выполнить любую операцию ввода/вывода, файл необходимо открыть. Инструкция Open резервирует буфер ввода/вывода для файла и определяет режим использования этого буфера.
Если аргумент путь описывает несуществующий файл, такой файл будет создан при открытии в режиме Append, Binary, Output или Random.
Если файл уже открыт другим процессом и указанный режим доступа не разрешен, инструкция Open не будет выполнена и возникнет ошибка.
Если аргумент режим имеет значение Binary, предложение Len игнорируется.
В режимах Binary, Input и Random можно еще раз открыть уже открытый файл под другим номером, не закрывая его. В режиме Append и Output необходимо закрыть файл, чтобы получить возможность открыть его еще раз под другим номером.

Пример
В данном примере показаны различные способы использования инструкции Open, чтобы разрешить выполнение операций ввода/вывода с файлом.
Следующие инструкции открывают файл TESTFILE для последовательного чтения.

Open "TESTFILE" For Input As #1
' Закрывает файл перед повторным открытием в другом режиме.
Close #1

Следующие инструкции открывают файл в режиме Binary только для записи.

Open "TESTFILE" For Binary Access Write As #1
' Закрывает файл перед повторным открытием в другом режиме.
Close #1

Следующие инструкции открывают файл в режиме Random. Файл содержит записи определенного пользователем типа Record.

Type Record			' Тип, определенный пользователем.
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record		' Объявляет переменную.
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
' Закрывает файл перед повторным открытием в другом режиме.
Close #1

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

Open "TESTFILE" For Output Shared As #1
' Закрывает файл перед повторным открытием в другом режиме.
Close #1

Следующие инструкции открывают файл в режиме Binary для чтения; другие процессы не могут читать этот файл.

Open "TESTFILE" For Binary Access Read Lock Read As #1


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 41 - Инструкция Option Base

Шаг 41 - Инструкция Option Base

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

Option Base {0 | 1}

Замечания
Поскольку по умолчанию используется значение 0, инструкция Option Base никогда не является обязательной. Однако если она используется, эта инструкция должна появляться в модуле перед любой процедурой. Инструкция Option Base может задаваться в модуле только один раз и должна предшествовать описаниям массивов, включающих размерности.
Предложение To в инструкциях Dim, Private, Public, ReDim и Static предоставляет более гибкий способ управления диапазоном индексов массива. Однако если нижняя граница индексов не задается явно в предложении To, можно воспользоваться инструкцией Option Base, чтобы установить используемую по умолчанию нижнюю границу индексов, равную 1. Нижняя граница значений индексов массивов, создаваемых с помощью функции Array, всегда равняется нулю; вне зависимости от инструкции Option Base.
Инструкция Option Base действует на нижнюю границу индексов массивов только того модуля, в котором расположена сама эта инструкция.

Пример
В данном примере инструкция Option Base используется для изменения нижней границы индексов массива, по умолчанию равной 0. Функция LBound возвращает минимальный доступный индекс указанной размерности массива. Инструкция Option Base используется только на уровне модуля.

Option base 1				' Устанавливает нижнюю границу индексов массива равной 1.
Dim Lower
Dim MyArray(20), TwoDArray(3, 4)		' Объявляет переменные-массивы.
Dim ZeroArray(0 To 5)			' Явно задает границы индексов массива.
                    ' Функция LBound определяет нижние границы индексов массивов.
Lower = LBound(MyArray)			' Возвращает 1.
Lower = LBound(TwoDArray, 2)		' Возвращает 1.
Lower = LBound(ZeroArray)			' Возвращает 0.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 42 - Инструкция Option Compare

Шаг 42 - Инструкция Option Compare

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

Option Compare {Binary | Text | Database}

Замечания
Инструкция Option Compare при ее использовании должна находиться в модуле перед любой процедурой. Инструкция Option Compare указывает способ сравнения строк (Binary, Text или Database) для модуля. Если модуль не содержит инструкцию Option Compare, по умолчанию используется способ сравнения Binary.
Инструкция Option Compare Binary задает сравнение строк на основе порядка сортировки, определяемого внутренним двоичным представлением символов. В Microsoft Windows порядок сортировки определяется кодовой страницей символов. В следующем примере представлен типичный результат двоичного порядка сортировки:

A < B < E < Z < a < b < e < z < Б < Л < Ш < б < л < ш

Инструкция Option Compare Text задает сравнение строк без учета регистра символов на основе системной национальной настройки. Тем же символам, что и выше, при сортировке с инструкцией Option Compare Text соответствует следующий порядок:

(A=a) < (B=b) < (E=e) < (Z=z) < (Б=б) < (Л=л) < (Ш=ш)

Инструкция Option Compare Database может использоваться только в Microsoft Access. При этом задает сравнение строк на основе порядка сортировки, определяемого национальной настройкой базы данных, в которой производится сравнение строк.

Пример
В данном примере инструкция Option Compare используется для задания метода сравнения строковых данных, используемого по умолчанию. Инструкция Option Compare используется только на уровне модуля.

' Устанавливает метод сравнения строковых данных Binary.
Option compare Binary 	' Т.е. "AAA" < "aaa"
' Устанавливает метод сравнения строковых данных Text.
Option compare Text	' Т. е. "AAA" = "aaa".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 43 - Инструкция Option Explicit

Шаг 43 - Инструкция Option Explicit

Налагает на уровне модуля требование на явное описание всех переменных этого модуля.

Option Explicit

Замечания
Инструкция Option Explicit при ее использовании должна находиться в модуле до любой процедуры.
При использовании инструкции Option Explicit необходимо явно описать все переменные с помощью инструкций Dim, Private, Public, ReDim или Static. При попытке использовать неописанное имя переменной возникает ошибка во время компиляции.
Когда инструкция Option Explicit не используется, все неописанные переменные имеют тип Variant, если используемый по умолчанию тип данных не задается с помощью инструкции DefТип.
Пользуйтесь инструкцией Option Explicit, чтобы избежать неверного ввода имени имеющейся переменной или риска конфликтов в программе, когда область определения переменной не совсем ясна.

Пример
В данном примере инструкция Option Explicit заставляет разработчика явно объявлять все переменные. При попытке использования неописанного имени переменной возникает ошибка во время компиляции. Инструкция Option Explicit используется только на уровне модуля.

Option explicit	' Заставляет явно объявлять все переменные.
Dim MyVar		' Объявляет переменную.
MyInt = 10	' Необъявленная переменная - причина ошибки.
MyVar = 10	' Использование объявленной переменной
        ' не приводит к ошибке.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 44 - Инструкция Option Private

Шаг 44 - Инструкция Option Private

При использовании в главном приложении, допускающем взаимные ссылки из разных проектов, инструкция Option Private Module позволяет запретить ссылки на содержимое модуля извне проекта. В главных приложениях, не допускающих такие ссылки, например в автономной версии Visual Basic, инструкция Option Private не имеет последствий.

Option Private Module

Инструкция Option Private при ее использовании должна находиться на уровне модуля перед любой процедурой.
Когда модуль содержит инструкцию Option Private Module, общие элементы, например, переменные, объекты и определяемые пользователем типы, описанные на уровне модуля, остаются доступными внутри проекта, содержащего этот модуль, но недоступными для других приложений или проектов.
Инструкция Option Private полезна только для главных приложений, которые поддерживают одновременную загрузку нескольких проектов и позволяют ссылки между загруженными проектами. Например, Microsoft Excel поддерживает загрузку нескольких проектов. В этом случае инструкция Option Private Module позволяет ограничить взаимную видимость проектов. Хотя Visual Basic допускает загрузку нескольких проектов, взаимные ссылки между проектами Visual Basic не разрешены.

Пример
В данном примере инструкция Option Private используется на уровне модуля, чтобы указать, что весь модуль является личным. После применения инструкции Option Private Module символы, определенные на уровне модуля и не объявленные личными (Private), будут доступны другим модулям в том же проекте, однако будут недоступны другим проектам и приложениям.

Option private Module	' Объявляет модуль личным.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 45 - Инструкция Print #

Шаг 45 - Инструкция Print #

Записывает отформатированные данные в файл с последовательным доступом.

Print #номерФайла, [списокВывода]

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
списокВывода
Необязательный. Выражение или список выражений, которые следует напечатать.
Ниже приведены допустимые значения аргумента списокВывода:

  • Spc(n) - Используется для вставки пробелов в файл; здесь n число пробелов, которые следует вставить.
  • Tab(n) - Устанавливает курсор в столбец с указанным номером; здесь n номер столбца. Tab без аргумента устанавливает курсор в начало следующей зоны печати.
  • выражение - Числовые выражения или строковые выражения, которые следует напечатать.
  • позиция - Указывает позицию, в которой следует печатать следующий символ. Для установки курсора сразу после последнего напечатанного символа используйте точку с запятой. Для установки курсора в столбец с указанным номером используйте Tab(n). Для установки курсора в начало следующей зоны печати используйте Tab без аргумента. Если аргумент позиция опущен, следующий символ печатается на следующей строке.

Замечания
Данные, записанные с помощью инструкции Print #, обычно считываются из файла с помощью инструкций Line Input # или Input.
Если аргумент списокВывода опущен, после аргумента номерФайла идет только разделитель списка, в файл печатается пустая строка. Для разделения выражений можно использовать пробелы или точки с запятой, которые в данной ситуации полностью эквивалентны.
При выводе логических данных (тип Boolean) в файл записываются слова True или False. Ключевые слова True и False не переводятся, вне зависимости от национальной настройки.
При выводе данных типа Date используется текущий краткий системный формат даты. Если компонент, описывающий дату или время, отсутствует или равен нулю, в файл записывается только имеющийся в наличии компонент.
Если списокВывода имеет значение Empty, в файл ничего не записывается. Однако если списокВывода имеет значение Null, в файл записывается ключевое слово Null.
Данные типа Error записываются в файл как Error кодОшибки. Ключевое слово Error не переводятся, вне зависимости от национальной настройки.
Инструкция Print # записывает в файл данные, отформатированные с учетом национальной настройки. Это означает, в частности, что используется соответствующий разделитель целой и дробной части числа.
Поскольку инструкция Print # записывает в файл отформатированные данные, необходимо использовать разделители данных, обеспечивающие правильную печать. Если Tab без аргумента используется для перемещения позиции вывода в начало следующей зоны печати, Print # также записывает пробелы между полями печати в файле.
Для записи в файл данных, который в будущем планируется читать с помощью инструкции Input #, следует вместо инструкции Print # использовать инструкцию Write #. Использование инструкции Write # гарантирует, что записанные данные будут корректно разделены, что позволит прочитать их с помощью инструкции Input #. Кроме того, файлы, записанные с помощью инструкции Write #, могут быть корректно прочитаны при наличии любых национальных настроек.

Пример
В данном примере инструкция Print # используется для записи данных в файл.

Open "TESTFILE" For Output As #1	' Открывает файл для записи.
Print #1, "Пример"			' Печатает текст в файл.
Print #1,				' Печатает пустую строку в файл.
Print #1, "Зона 1"; Tab ; "Зона 2"	' Печатает в двух зонах печати.
Print #1, "Пример" ; " " ; "всем"	' Строки разделяются пробелом.
Print #1, Spc(5) ; "5 пробелов"		' Печатает пять пробелов.
Print #1, Tab(10) ; "Привет"		' Печатает слово в столбце 10.

                    ' Присваивает значения типа Boolean, Date, Null и Error.
Dim MyBool, MyDate, MyNull, MyError
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' Вместо слов True, False, Null и Error записываются слова,
' соответствующие им в текущем языке. Текстовые константы даты
' записываются в кратком системном формате даты.
Print #1, MyBool ; " - логическое значение"
Print #1, MyDate ; " - дата"

Print #1, MyNull ; " - значение Null"
Print #1, MyError ; " - значение типа Error"
Close #1				' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 46 - Инструкция Private

Шаг 46 - Инструкция Private

Применяется на уровне модуля для описания личных переменных и выделения памяти.

Private [WithEvents] имяПеременной[([индексы])] [As [New] тип] [,[WithEvents] имяПеременной[([индексы])] [As [New] тип]] . . .

Параметры
WithEvents
Необязательный. Ключевое слово, указывающее, что имяПеременной является объектной переменной, которая используется при отклике на события, генерируемые объектом ActiveX. Применяется только в модулях класса. Пользователь имеет возможность описать с помощью ключевого слова WithEvents произвольное количество отдельных переменных, однако при этом не допускается создание массивов. Не допускается также использование ключевого слова New с ключевым словом WithEvents.
имяПеременной
Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
индексы
Необязательный. Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис:

[нижний To] верхний [,[нижний To] верхний] . . .
Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
New
Необязательный. Ключевое слово, включающее возможность неявного создания объекта. Если указано ключевого слова New при описании объектной переменной, новый экземпляр объекта создается при первой ссылке на объект, поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set. Ключевое слово New нельзя использовать для описания переменных любых внутренних типов данных, для описания экземпляров зависимых объектов, а также вместе с ключевым словом WithEvents.
тип
Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal(в настоящее время не поддерживается), Date, String (для строк переменной длины), String * длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип.

Замечания
Переменные типа Private доступны только в модуле, в котором они описаны.
Инструкция Private используется для описания типа данных переменной. Например, следующая инструкция описывает переменную типа Integer:

Private NumberOfEmployees As Integer

Инструкция Private применяется также для описания объектного типа переменной. Ниже описывается переменная для нового экземпляра листа электронной таблицы.

Private X As New Worksheet

Если ключевое слово New не используется при описании объектной переменной, то перед использованием объекта необходимо присвоить имеющийся объект с помощью инструкции Set переменной, ссылающейся на этот объект. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что переменная не содержит ссылку на какой-либо определенный экземпляр объекта.
Если для переменной не задан тип данных или тип объекта, и в модуле отсутствует инструкция DefТип, переменная по умолчанию получает тип Variant.
Допускается также использование инструкции Private с пустыми скобками для описания динамического массива. После описания динамического массива пользуйтесь в процедуре инструкцией ReDim для определения числа размерностей и элементов этого массива. При попытке переопределить размерность для переменной массива, размеры которого были явным образом заданы в инструкции Private, Public, или Dim, возникает ошибка.
При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают значение Empty. Каждый элемент переменной определяемого пользователем типа получает значение как самостоятельная переменная.
При использовании инструкции Private в процедуре она обычно помещается в начало процедуры.

Пример
В данном примере инструкция Private используется на уровне модуля для объявления переменных личными. Личные переменные доступны только модулю, в котором они объявлены.

Private Number As Integer			' Личная переменная типа Integer.
Private NameArray(1 To 5) As String		' Личная переменная-массив.
                    ' Несколько объявлений (Variant, Variant и Integer), все личные.
Private MyVar, YourVar, ThisVar As Integer


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 47 - Инструкция Property Get

Шаг 47 - Инструкция Property Get

Описывает имя, аргументы и текст программы, составляющий тело процедуры Property, которая принимает значение свойства.

[Public | Private] [Static] Property Get имя [(списокАргументов)] [As тип]
    [инструкции]
    [имя = выражение]
    [Exit Property]
    [инструкции]
    [имя = выражение]
End Property

Параметры
Public
Необязательный. Указывает, что процедура Property Get доступна для всех других процедур во всех модулях. При использовании в личном модуле (модуле, который содержит инструкцию Option Private) такая процедура является недоступной вне проекта.
Private
Необязательный. Указывает, что процедура Property Get доступна для других процедур только того модуля, в котором она описана.
Static
Необязательный. Указывает, что локальные переменные процедуры Property Get сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Property Get, даже если они используются в этой процедуре.
имя
Обязательный. Имя процедуры Property Get, удовлетворяющее стандартным правилам именования переменных, за исключением того, что это имя может совпадать с именем процедуры Property Let или Property Set из этого же модуля.
списокАргументов
Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Property Get при ее вызове. Имена нескольких переменных разделяются запятыми. Имя и тип данных каждого аргумента процедуры Property Get должны совпадать с соответствующими аргументами процедуры Property Let (если она имеется).

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional.
  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.
  • ByRef - Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
  • имяПеременной - Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
  • тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип.
  • поУмолчанию - Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

Замечания
Процедуры Property, тип которых не указан явно с помощью слов Public или Private, являются общими по умолчанию. Если не используется слово Static, значения локальных переменных не сохраняются между вызовами процедур.
Все выполняемые команды должны находиться в процедурах. Не допускается определение процедуры Property Get внутри другой процедуры Property, Sub или Function.
Инструкция Exit Property вызывает немедленный выход из процедуры Property Get. Выполнение программы продолжается с инструкции, следующей за инструкцией вызова процедуры Property Get. В любом месте процедуры Property Get допускается любое число инструкций Exit Property.
Подобно процедурам Sub и Property Let, процедура Property Get является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub или Property Let, возможно использование процедуры Property Get в правой части выражения, аналогично использованию ключевого слова Function или имени свойства, когда требуется возвращение значения свойства.

Пример
В данном примере инструкция Property Get используется для описания процедуры, предназначенной для определения значения свойства. Эта процедура возвращает текущий цвет пера как строку.

Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3

' Возвращает текущий цвет пера как строку.
Property Get PenColor() As String
    Select Case CurrentColor
        Case RED
            PenColor = "Red"
        Case GREEN
            PenColor = "Green"
        Case BLUE
            PenColor = "Blue"
    End Select
End Property

' Следующий код определяет цвет пера с помощью процедуры Property Get.
ColorName = PenColor


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 48 - Инструкция Property Let

Шаг 48 - Инструкция Property Let

Описывает имя, аргументы и текст программы, составляющий тело Property Let procedure, которая присваивает значение свойству.

[Public | Private] [Static] Property Let имя [(списокАргументов)]
    [инструкции]
    [Exit Property]
    [инструкции]
End Property

Параметры
Public
Необязательный. Указывает, что процедура Property Let доступна для всех других процедур во всех модулях. При использовании в личном модуле (модуле, который содержит инструкцию Option Private) такая процедура является недоступной вне проекта.
Private
Необязательный. Указывает, что процедура Property Let доступна для других процедур только того модуля, в котором она описана.
Static
Необязательный. Указывает, что локальные переменные процедуры Property Let сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Property Let, даже если они используются в этой процедуре.
имя
Oбязательный. Имя процедуры Property Let, удовлетворяющее стандартным правилам именования переменных, за исключением того, что это имя может совпадать с именем процедуры Property Get или Property Set из этого же модуля.
списокАргументов
Обязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Property Let при ее вызове. Имена нескольких переменных разделяются запятыми. Имя и тип данных каждого аргумента процедуры Property Let (за исключением последнего) должен совпадать с соответствующими аргументами процедуры Property Get. Последний аргумент представляет значение, присваиваемое свойству с правой стороны выражения. Тип данных последнего (или иногда единственного) аргумента должен соответствовать типу, возвращаемому соответствующей процедурой Property Get.

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Отметим, что правая часть выражения Property Let не может иметь тип Optional.
  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.
  • ByRef - Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
  • имяПеременной - Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
  • тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип.
  • поУмолчанию - Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

инструкции
Необязательный. Любая группа инструкций, выполняемых в теле процедуры Property Let.

Каждая инструкция Property Let должна определять по крайней мере один аргумент определяемой процедуры. Этот аргумент (или последний аргумент, если имеется более одного аргумента) содержит реальное значение, которое будет присвоено свойству при вызове процедуры, определенной с помощью инструкции Property Let.

Замечания
Процедуры Property, тип которых не указан явно с помощью слов Public или Private, являются общими по умолчанию. Если не используется слово Static, значения локальных переменных не сохраняются между вызовами процедур.
Все выполняемые команды должны находиться в процедурах. Не допускается определение процедуры Property Let внутри другой процедуры Property, Sub или Function.
Инструкция Exit Property вызывает немедленный выход из процедуры Property Let. Выполнение программы продолжается с инструкции, следующей за инструкцией вызова процедуры Property Let. В любом месте процедуры Property Let допускается любое число инструкций Exit Property.
Подобно процедурам Function и Property Get, процедура Property Let является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедур Function и Property Get, которые возвращают значения, процедуру Property Let можно использовать только в левой части выражения для присвоения свойства или в инструкции Let.

Пример

В данном примере инструкция Property Let используется для описания процедуры, предназначенной для изменения значения свойства. Это свойство задает цвет пера.

Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3

' Эта процедура задает цвет пера.
' Переменная CurrentColor, определенная на уровне модуля,
' содержит числовое значение, указывающее нужный цвет.
Property Let PenColor(ColorName As String)
    Select Case ColorName			' Анализирует строку ColorName.
        Case "Red"
            CurrentColor = RED	' Красный цвет.
        Case "Green"
            CurrentColor = GREEN	' Зеленый цвет.
        Case "Blue"

CurrentColor = BLUE				' Синий цвет.
        Case Else
            CurrentColor = BLACK	' Значение по умолчанию.
    End Select
End Property
' Следующий код задает цвет пера с помощью процедуры Property Let.
PenColor = "Red"


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 49 - Инструкция Property Set

Шаг 49 - Инструкция Property Set

Описывает имя, аргументы и текст программы, составляющий тело процедуры Property, которая задает ссылку на объект.

[Public | Private] [Static] Property Set имя [(списокАргументов)]
    [инструкции]
    [Exit Property]
    [инструкции]
End Property

Параметры
Optional
Необязательный. Указывает, что при вызове процедуры аргумент может задаваться или не задаваться.
Public
Необязательный. Указывает, что процедура Property Set доступна для всех других процедур во всех модулях. При использовании в личном модуле (модуле, который содержит инструкцию Option Private) такая процедура является недоступной вне проекта.
Private
Необязательный. Указывает, что процедура Property Set доступна для других процедур только того модуля, в котором она описана.
Static
Необязательный. Указывает, что локальные переменные процедуры Property Set сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Property Set, даже если они используются в этой процедуре.
имя
Обязательный. Имя процедуры Property Set, удовлетворяющее стандартным правилам именования переменных, за исключением того, что это имя может совпадать с именем процедуры Property Get или Property Let из этого же модуля.
списокАргументов
Обязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Property Set при ее вызове. Несколько имен переменных разделяются запятыми. Последний аргумент представляет собой ссылку на объект, используемую с правой стороны присвоения.

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Отметим, что правая часть выражения Property Set не может иметь тип Optional.
  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.
  • ByRef - Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
  • имяПеременной - Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
  • тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип.
  • поУмолчанию - Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

инструкции
Необязательный. Любая группа инструкций, выполняемых внутри тела процедуры Property.

Каждая инструкция Property Set должна определять по крайней мере один аргумент определяемой процедуры. Этот аргумент (или последний аргумент, если имеется более одного аргумента) содержит реальную ссылку на объект, которая будет присвоена свойству при вызове процедуры, определенной с помощью инструкции Property Set. Не допускается описание этого аргумента с типом Optional.

Замечания
Процедуры Property, тип которых не указан явно с помощью слов Public или Private, являются общими по умолчанию. Если не используется слово Static, значения локальных переменных не сохраняются между вызовами процедур.
Все выполняемые команды должны находиться в процедурах. Не допускается определение процедуры Property Set внутри другой процедуры Property, Sub или Function.
Инструкция Exit Property вызывает немедленный выход из процедуры Property Set. Выполнение программы продолжается с инструкции, следующей за инструкцией вызова процедуры Property Set. В любом месте процедуры Property Set допускается любое число инструкций Exit Property.
Подобно процедурам Function и Property Get, процедура Property Set является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедур Function и Property Get, которые возвращают значения, процедуру Property Set можно использовать только в левой части присвоения ссылки на объект (в инструкции Set).

Пример
В данном примере инструкция Property Set используется для описания процедуры, которая задает ссылку на объект.

' Свойству Pen могут быть присвоены значения свойства Pen разных объектов.
Property Set Pen(P As Object)
    Set CurrentPen = P	' Присваивает свойство Pen объекту.
End Property


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 50 - Инструкция Public

Шаг 50 - Инструкция Public

Применяется на уровне модуля для описания общих переменных и выделения памяти.

Public [WithEvents] имяПеременной[([индексы])] [As [New] тип] [,[WithEvents] имяПеременной[([индексы])] [As [New] тип]] . . .

Параметры
WithEvents
Необязательный. Ключевое слово, указывающее, что имяПеременной является объектной переменной, которая используется при отклике на события, генерируемые объектом ActiveX. Применяется только в модулях класса. Пользователь имеет возможность описать с помощью ключевого слова WithEvents произвольное количество отдельных переменных, однако при этом не допускается создание массивов. Не допускается также использование ключевого слова New с ключевым словом WithEvents.
имяПеременной
Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
индексы
Необязательный. Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис:

[нижний To] верхний [,[нижний To] верхний] . . .

Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
New
Необязательный. Ключевое слово, включающее возможность неявного создания объекта. Если указано ключевого слова New при описании объектной переменной, новый экземпляр объекта создается при первой ссылке на объект, поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set. Ключевое слово New нельзя использовать для описания переменных любых внутренних типов данных, для описания экземпляров зависимых объектов, а также вместе с ключевым словом WithEvents.
тип
Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String, (для строк переменной длины), String * длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип.

Замечания
Переменные, описанные с помощью инструкции Public, доступны для всех процедур во всех модулях всех приложений, если только не действует инструкция Option Private Module. В последнем случае переменные являются общими только внутри проекта, в котором они содержатся.
Не допускается использование инструкции Public в модуле класса для описания строковых переменных фиксированной длины.
Инструкция Public предназначена для описания типа данных переменной. Например, следующая инструкция описывает переменную с типом Integer:

Public NumberOfEmployees As Integer

Инструкция Public предназначена также для описания объектных переменных. Далее приводится описание переменной для нового экземпляра листа электронной таблицы.

Public X As New Worksheet

Если при описании объектной переменной не используется ключевое слово New, то для использования объекта, на который ссылается переменная, существующий объект должен быть с помощью инструкции Set присвоен переменной. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что она не содержит ссылку на какой-либо определенный экземпляр объекта.
Имеется также возможность применять инструкцию Public с пустыми скобками для описания динамического массива. После описания динамического массива, пользуйтесь инструкцией ReDim в процедуре для определения числа размерностей и элементов массива. При попытке переопределить размерности переменной-массива, чей размер был явно указан в инструкции Private, Public или Dim, возникает ошибка.
Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefТип, по умолчанию переменная получает тип Variant.
При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают при инициализации значение Empty. Каждый элемент переменной типа, определяемого пользователем, при инициализации получает значение, которые он получил бы, если бы являлся отдельной переменной.

Пример
В данном примере инструкция Public используется на уровне модуля в общем разделе стандартного модуля для явного объявления переменных общими. Общие переменные доступны всем процедурам во всех модулях во всех приложениях (если инструкция Option Private Module отключена).

Public Number As Integer		' Общая переменная типа Integer.
Public NameArray(1 To 5) As String	' Общая переменная-массив.
' Несколько объявлений (Variant, Variant и Integer), все общие.
Public MyVar, YourVar, ThisVar As Integer


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 51 - Инструкция Put

Шаг 51 - Инструкция Put

Записывает содержимое переменной в файл на диске.

Put [#]номерФайла, [номерЗаписи], имяПеременной

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
номерЗаписи
Необязательный. Номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись.
имяПеременной
Обязательный. Имя переменной, содержащей данные, которые следует записать в файл.

Замечания
Данные, записанные с помощью инструкции Put, обычно считываются из файла с помощью инструкции Get.
Первой записи (или байту) файла соответствует номер 1, второй 2 и т.п. Если аргумент номерЗаписи опущен, записывается запись (или байт), на которую указатель был установлен после выполнения последней инструкции Get или Put переведен с помощью функции Seek. Наличие запятых-разделителей является обязательным, например:

Put #4,,FileBuffer

Для файлов, открытых в режиме Random, применимы следующие правила:
Даже если длина данных, подлежащих записи, меньше длины записи, указанной в предложении Len инструкции Open, инструкция Put начинает запись каждой следующей записи с начала этой записи. Пространство между концом одной записи и началом следующей записи заполняется текущим содержимым буфера файла. Поскольку объем данных, используемых для заполнения, не может быть определен с достаточной степенью уверенности, рекомендуется, чтобы длина записи совпадала с длиной читаемых данных. Если длина данных, подлежащих записи, больше длины записи, указанной в предложении Len инструкции Open, возникает ошибка.
При записи строки переменной длины инструкция Put сначала записывает 2-байтовый дескриптор, содержащий длину строки, а затем содержимое этой переменной. Таким образом, длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактическую длину этой строки.
При записи переменной Variant числового типа инструкция Put сначала записывает 2 байта, указывающие подтип (VarType) типа Variant, а затем содержимое этой переменной. Например, при чтении переменной Variant подтипа VarType 3, инструкция Put записывает 6 байт: 2 байта, указывающие тип переменной Variant как VarType 3 (Long), и 4 байта, содержащие значение типа Long. Длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактическое число байт, необходимое для размещения этой переменной.
С помощью инструкции Put можно записать массив типа Variant на диск, однако, нельзя записать скаляр типа Variant, содержащий массив. Кроме того, инструкцию Put нельзя использовать для записи объектов на диск.
При записи переменной Variant подтипа VarType 8 (String) инструкция Put сначала записывает 2 байта, указывающие VarType, потом 2 байта, указывающие длину строки, а затем содержимое строки. Длина записи, указанная в предложении Len инструкции Open, должна крайней мере на 4 байта превышать фактическую длину этой строки.
При записи динамического массива инструкция Put сначала записывает дескриптор, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения массива данных и дескриптора массива. Например, для размещения описанного ниже массива требуется 118 байт:

Dim MyArray(1 To 5,1 To 10) As Integer

118 байт распределяются следующим образом: 18 байт для дескриптора (2 + 8 * 2), и 100 байт для данных (5 * 10 * 2).
При записи массива фиксированной длины инструкция Put записывает только данные. Дескриптор не записывается.
При записи переменной любого другого типа (кроме строки переменной длины и переменной типа Variant), инструкция Put записывает только данные. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна длине записываемых данных.
Инструкция Put записывает элементы определяемых пользователем типов так, будто это отдельные переменные, за исключением того, что пространство между элементами не заполняется текущим содержимым буфера файла. На диске динамический массив типа, определенного пользователем (записанный с помощью инструкции Put) предваряется дескриптором, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения отдельных элементов, в том числе, массивов и их дескрипторов.
Для файлов, открытых в режиме Binary, применимы все перечисленные выше правила, за исключением следующих:
Предложение Len инструкции Open игнорируется. Инструкция Put записывает все переменные на диск непрерывно, т.е. без заполнения пространства между записями текущим содержимым буфера файла.
При записи любых массивов, кроме являющихся элементами типов, определяемых пользователем, инструкция Put записывает только данные. Дескриптор не записывается.
При записи строк переменной длины, не являющихся элементами типов, определяемых пользователем, 2-байтовый дескриптор не записывается. Число записываемых байт равняется числу символов, содержащихся в строке. Например, следующие инструкции запишут 10 байт в файл, которому соответствует номер 1:

VarString$ = String$(10," ")
Put #1,,VarString$

Пример
В данном примере инструкция PutRecord

Type Record				' Тип, определенный пользователем.
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, RecordNumber	' Объявляет переменную.
' Открывает файл произвольного доступа.
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
For RecordNumber = 1 To 5		' Выполняет цикл 5 раз.
    MyRecord.ID = RecordNumber	' Определяет номер.
    MyRecord.Name = "My Name" & RecordNumber	' Создает строку.
    Put #1, RecordNumber, MyRecord	' Записывает запись в файл.
Next RecordNumber
Close #1				' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 52 - Инструкция Randomize

Шаг 52 - Инструкция Randomize

Инициализирует датчик случайных чисел.

Randomize [число]

Параметры
число
Необязательный аргумент число представляет значение типа Variant или любое допустимое числовое выражение.

Замечания
Инструкция Randomize использует аргумент число для инициализации датчика случайных чисел функции Rnd, передавая ему новое опорное число. Если аргумент число опущен, в качестве нового опорного числа используется значение, возвращаемое системным таймером.
Если инструкция Randomize не используется, функция Rnd (без аргументов) использует в качестве опорного числа случайное число, возвращенное при предыдущем вызове.
Для повторения последовательности случайных чисел следует вызвать функцию Rnd с отрицательным аргументом сразу после использования инструкции Randomize с числовым аргументом. Повторное использование инструкции Randomize с тем же числовым аргументом не приведет к повторению предыдущей последовательности случайных чисел.

Пример
В данном примере инструкция Randomize используется для инициализации генератора случайных чисел. Поскольку числовой аргумент инструкции Randomize опущен, в качестве нового опорного числа используется значение, возвращаемое функцией Timer.

Dim MyValue
Randomize				' Инициализирует генератор случайных чисел.
MyValue = Int((6 * Rnd) + 1)	' Возвращает случайное число от 1 до 6.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 53 - Инструкция ReDim

Шаг 53 - Инструкция ReDim

Применяется на уровне процедуры для перераспределения памяти для переменных динамического массива.

ReDim [Preserve] имяПеременной(индексы) [As тип] [, имяПеременной(индексы) [As тип]] . . .

Параметры
Preserve
Необязательный. Ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности.
имяПеременной
Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
индексы
Обязательный. Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис:

[нижний To] верхний [,[нижний To] верхний] . . .
Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
тип
Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (для строк переменной длины), String * длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип. Для значения типа Variant, содержащего массив, тип описывает тип данных каждого элемента массива, но не заменяет тип Variant на какой-либо другой тип.

Замечания
Инструкция ReDim используется для задания или изменения размера динамического массива, который уже был формально описан с помощью инструкции Private, Public или Dim с пустыми скобками (без индексов размерностей).
Имеется возможность повторно использовать инструкцию ReDim для изменения числа элементов и размерностей массива. Однако не допускается описание массива с одним типом данных и использование инструкции ReDim для последующего изменения типа данных этого массива, если массив не содержится в переменной типа Variant. Тип элементов массива, содержащегося в переменной типа Variant, может быть изменен с помощью предложения As тип, если ранее не было использовано ключевое слово Preserve, запрещающее изменение типа данных.
При использовании ключевого слова Preserve имеется возможность изменить значение только последней размерности массива и не допускается изменение числа размерностей. Например, если массив имеет только одну размерность, имеется возможность изменить эту размерность, так как она является последней и единственной размерностью. Однако, если массив имеет две или более размерности, возможно изменение значения только последней размерности, сохраняя при этом содержимое массива. В следующем примере показывается, как можно увеличить значение последней размерности динамического массива без уничтожения данных, содержащихся в этом массиве.

ReDim X(10, 10, 10)
. . .
ReDim Preserve X(10, 10, 15)

Кроме того, при использовании ключевого слова Preserve допускается изменение размера массива только за счет изменения верхней границы индекс; попытка изменить нижнюю границу приведет к ошибке.
Если уменьшить размер массива, данные из удаленных элементов будут потеряны. При передаче массива в процедуру по ссылке нельзя изменять размеры массива в процедуре.
При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают при инициализации значение Empty. Каждый элемент переменной типа, определяемого пользователем, при инициализации получает значение, которые он получил бы, если бы являлся одиночной переменной. Переменной со ссылкой на объект перед ее использованием необходимо присвоить существующий объект с помощью инструкции Set. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что она не содержит ссылку на какой-либо определенный экземпляр объекта.
Инструкция ReDim действует как инструкция описания, даже если описываемая в ней переменная не существует на уровне модуля или на уровне процедуры. При создании в дальнейшем переменной с тем же именем, возможно, в более широкой области определения, инструкция ReDim будет ссылаться на эту последнюю переменную и не обязательно вызовет ошибку компиляции, даже при действующей инструкции Option Explicit. Во избежание подобных конфликтов не следует использовать инструкцию ReDim как инструкцию описания. Пользуйтесь ей только для изменения размеров массивов.
Для изменения размера массива, содержащегося в переменной типа Variant, нужно явно описать переменную типа Variant перед попыткой изменения размера.

Пример
В данном примере инструкция ReDim используется для выделения и повторного выделения памяти для динамических массивов. Предполагается, что Option Base равняется 1.

Dim MyArray() As Integer		' Объявляет динамический массив.
Redim MyArray(5)			' Размещает 5 элементов.
For I = 1 To 5			' Выполняет цикл 5 раз.
    MyArray(I) = I		' Инициализирует массив.
Next I
Следующая инструкция изменяет размер массива и обнуляет его элементы.
Redim MyArray(10)		' Увеличивает размер массива до 10 элементов.
For I = 1 To 10		' Выполняет цикл 10 раз.
    MyArray(I) = I	' Инициализирует массив.
Next I
Следующая инструкция изменяет размер массива, но сохраняет существующие элементы.
Redim Preserve MyArray(15)	' Увеличивает размер массива до 15 элементов.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 54 - Инструкция Rem

Шаг 54 - Инструкция Rem

Используется для добавления в программу дополнительных пояснений.

Rem примечание

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

Замечания
При использовании номеров строк или меток строк имеется возможность выполнить с помощью инструкции GoTo или GoSub переход на строку, содержащую инструкцию Rem. Выполнение программы продолжится с первой выполняемой инструкции, следующей за инструкцией Rem. Если за ключевым словом Rem на строке имеются другие инструкции, инструкции должны разделяться двоеточием (:).
Как показано в примере синтаксиса, вместо ключевого слова Rem возможно использование апострофа ('). При использовании апострофа двоеточие не требуется.

Пример
В данном примере приведены различные формы инструкции Rem, предназначенной для добавления в программу дополнительных пояснений.

Rem Это первая форма синтаксиса.

Ниже показана вторая форма синтаксиса.

Dim MyStr1, MyStr2
MyStr1 = "Привет": Rem Пояснение отделяется двоеточием.
MyStr2 = "До свидания" 	' Можно и без двоеточия.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 55 - Инструкция Reset

Шаг 55 - Инструкция Reset

Закрывает все файлы, открытые с помощью инструкции Open.

Reset

Замечания
Инструкция Reset закрывает все активные файлы, открытые с помощью инструкции Open, и записывает содержимое всех буферов файлов на диск.

Пример
В данном примере инструкция Reset используется для закрытия всех открытых файлов и записи содержимого всех буферов файлов на диск. Обратите внимание, что переменная FileNumber типа Variant используется одновременно как строка и число.

Dim FileNumber
For FileNumber = 1 To 5		' Выполняет цикл 5 раз.
                ' Открывает файл для записи. FileNumber включается в имя файла как
                ' строка и одновременно является числовым счетчиком цикла.
    Open "TEST" & FileNumber For Output As #FileNumber
    Write #FileNumber, "Всем Привет"	' Записывает данные в файл.
Next FileNumber
Reset				' Закрывает файлы и записывает содержимое
                ' буферов на диск.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 56 - Инструкция Resume

Шаг 56 - Инструкция Resume

Продолжает выполнение программы после завершения подпрограммы обработки ошибок.

  • Resume - Если ошибка возникла в процедуре, в которой находится обработчик ошибок, то выполнение программы продолжается с инструкции, следующей за той, которая привела к ошибке. Если ошибка возникла в вызванной процедуре, выполнение продолжается с инструкции в процедуре, содержащей обработчик ошибок, из которой был сделан последний вызов.
  • Resume Next - Если ошибка возникла в процедуре, в которой находится обработчик ошибок, то выполнение программы продолжается с инструкции, следующей за той, которая привела к ошибке. Если ошибка возникла в вызванной процедуре, выполнение продолжается с инструкции, непосредственно следующей за той инструкцией в процедуре, содержащей обработчик ошибок (или инструкцию On Error Resume Next), из которой был сделан последний вызов.
  • Resume строка - Выполнение программы продолжается со строки, указанной в обязательном аргументе строка. Аргумент строка должен определять метку строки или номер строки внутри процедуры, содержащей данный обработчик ошибок.

Замечания
Если инструкция Resume используется в любой другой программе, помимо обработчика ошибок, то возникает ошибка.

Пример
В данном примере инструкция Resume используется для прекращения обработки ошибок в процедуре и возобновлению выполнения инструкции, которая привела к ошибке. Для иллюстрации создается ошибка с кодом 55.

Sub ResumeStatementDemo()
    On Error GoTo ErrorHandler		' Включаем обработчик ошибок.
    Open "TESTFILE" For Output As #1	' Открываем файл.
    Kill "TESTFILE"				' Попытка удалить открытый файл.
    Exit Sub				' Выходим из процедуры, чтобы
                        ' не попасть в обработчик.
ErrorHandler:					' Подпрограмма обработки ошибок.
    Select Case Err.Number			' Определяем код ошибки.
        Case 55	' "Ошибка "Файл уже открыт".
            Close #1		' Закрываем открытый файл.
        Case Else

' Здесь размещаются инструкции для обработки других ошибок...
    End Select
    Resume					' Возобновляем выполнение процедуры
                        ' со строки, вызвавшей ошибку.
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 57 - Инструкция RmDir

Шаг 57 - Инструкция RmDir

Удаляет существующий каталог или папку.

RmDir путь

Параметры
путь
Обязательный аргумент путь является строковым выражением, определяющим каталог или папку, которую следует удалить. Аргумент путь может содержать имя диска. Если диск не указан, инструкция RmDir удаляет каталог или папку с текущего диска.

Замечания
При попытке удалить с помощью инструкции RmDir каталог (или папку), который содержит файлы, возникает ошибка. Для предварительного удаления всех файлов из каталога или папки следует использовать инструкцию Kill.

Пример
В данном примере инструкция RmDir используется для удаления существующего каталога или папки.

' Предположим, что MYDIR - пустой каталог или папка.
RmDir "MYDIR"	' Удаляет MYDIR.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 58 - Инструкция RSet

Шаг 58 - Инструкция RSet

Выравнивает строку по правому краю строковой переменной.

RSet переменная = строка

Параметры
переменная
Обязательный. Имя строковой переменной.
строка
Обязательный. Строковое выражение, которое следует выровнять по правому краю строки переменная.

Замечания
Если длина строки переменная больше, чем строка, инструкция RSet заменяет все оставшиеся символы вплоть до начала строки переменная пробелами.
Не допускается применение инструкции RSet к определяемым пользователем типам.

Пример
В данном примере инструкция RSet используется для выравнивания строки по правому краю строковой переменной.

Dim MyString
MyString = "0123456789"		' Инициализирует строку.
Rset MyString = "Right->"		' MyString содержит "   Right->".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 59 - Инструкция SaveSetting

Шаг 59 - Инструкция SaveSetting

Сохраняет или создает раздел или запись в разделе приложения в реестре Windows.

SaveSetting appname, section, key, setting

Параметры
appname
Обязательный. Строковое выражение, содержащее имя приложения или проекта, которому соответствует раздел.
section
Обязательный. Строковое выражение, содержащее имя раздела, в котором сохраняется значение.
key
Обязательный. Строковое выражение, содержащее имя сохраняемой записи.
setting
Обязательный. Выражение, содержащее значение записи, указанной в аргументе key.

Замечания
Если значение по какой-либо причине сохранить не удается, возвращается ошибка.

Пример
В данном примере сначала с помощью инструкции SaveSetting заполняются элементы реестра Windows (или файла .INI на 16-разрядных платформах Windows) для приложения MyApp, а затем инструкция DeleteSetting вызывается для их удаления.

' Заполнение реестра.
SaveSetting appname := "MyApp", section := "Startup", _
            key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
' Удаляем из реестра раздел приложения со всем содержимым.
DeleteSetting "MyApp", "Startup"


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 60 - Инструкция Seek

Шаг 60 - Инструкция Seek

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

Seek [#]номерФайла, позиция

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
позиция
Обязательный. Число в диапазоне 1 – 2,147,483,647 указывающее позицию, начиная с которой будет выполнена следующая операция чтения или записи.

Замечания
При выполнении инструкций Get и Put, содержащих конкретные номера записей, позиция указателя, установленная с помощью инструкции Seek, игнорируется.
Выполнение операции записи в файл после установки указателя с помощью инструкции Seek за конец файла приводит к увеличению размера файла. Установка указателя с помощью инструкции Seek в отрицательное или нулевое положение приведет к возникновению ошибки.

Пример
В данном примере инструкция Seek используется для изменения положения указателя внутри файла для следующей операции ввода/вывода. Предположим, что файл TESTFILE содержит несколько записей определенного пользователем типа Record.

Type Record		' Тип, определенный пользователем.
    ID As Integer
    Name As String * 20
End Type
Для файлов, открытых в режиме Random, Seek указывает следующую запись.
Dim MyRecord As Record, MaxSize, RecordNumber	' Объявляет переменные.
' Открывает файл произвольного доступа.
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
MaxSize = LOF(1) \ Len(MyRecord)	' Определяет число записей в файле.
' Последовательно читает все записи, начиная с последней.
For RecordNumber = MaxSize To 1 Step - 1
    Seek #1, RecordNumber	' Указывает номер записи.
    Get #1, , MyRecord	' Читает запись.
Next RecordNumber
Close #1	' Закрывает файл.
Для файлов, открытых в других режимах, Seek указывает номер байта, с которого будет начато выполнение следующей операции. Предположим, что файл TESTFILE содержит несколько строк текста.
Dim MaxSize, NextChar, MyChar
Open "TESTFILE" For Input As #1	' Открывает файл для чтения.
MaxSize = LOF(1)	' Определяет размер файла в байтах.
' Последовательно читает все записи, начиная с последней.
For NextChar = MaxSize To 1 Step -1
    Seek #1, NextChar	' Указывает номер байта.
    MyChar = Input(1, #1)	' Читает символ.
Next NextChar
Close #1	' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 61 - Инструкция Select Case

Шаг 61 - Инструкция Select Case

Выполняет одну из нескольких групп инструкций в зависимости от значения выражения.

Select Case выражение
[Case списокВыражений-n
    [инструкции-n]] ...
[Case Else
    [инструкции_else]]
End Select

Параметры
выражение
Обязательный. Любое числовое выражение или строковое выражение.
списокВыражений-n
Обязательный при наличии предложения Case. Список с разделителями, состоящий из одной или нескольких форм следующего вида: выражение, выражение To выражение, Is операторСравнения выражение. Ключевое слово To задает диапазон значений. При использовании ключевого слова To перед ним должно находиться меньшее значение. Ключевое слово Is с операторами сравнения (кроме Is и Like) задает диапазон значений. Если ключевое слово Is не указано, оно вставляется по умолчанию.
инструкции-n
Необязательный. Одна или несколько инструкций, выполняемых в том случае, если выражение совпадает с любым компонентом списка списокВыражений-n.
инструкции_else
Необязательный. Одна или несколько инструкций, выполняемых в том случае, если выражение не совпадает не совпадает ни с одним из предложений Case.

Замечания
Если выражение совпадает с любым выражением из спискаВыражений в предложении Case, выполняются все инструкции, следующие за данным предложением Case до следующего предложения Case, или, для последнего предложения, до инструкции End Select. Затем управление передается инструкции, следующей за End Select. Если выражение совпадает с выражениями из списка в нескольких предложениях Case, выполняется только первый подходящий набор инструкций.
Предложение Case Else задает список инструкции_else, которые будут выполнены, если не обнаружено ни одно совпадение выражения и компонента списокВыражений ни в одном из остальных предложений Case. Хотя данное предложение не является обязательным, рекомендуется помещать предложение Case Else в блок Select Case, чтобы предусмотреть неожиданные значения выражения. Если ни в одном предложении Case списокВыражений не содержит компонента, отвечающего аргументу выражение, и отсутствует инструкция Case Else, выполнение продолжается с инструкции, следующей за инструкцией End Select.
В каждом предложении Case допускается использование нескольких выражений или диапазонов. Например допустима следующая строка:

Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber
Следует отличать оператор сравнения Is от ключевого слова Is, используемого в инструкции Select Case.
Имеется также возможность задать диапазоны или несколько выражений для строковых значений. В следующем примере предложение Case выполняется для строк, которые точно совпадают со строкой "все", для строк, лежащих в алфавитном порядке между "орехи" и "яблоки", и для строк со значением, равных текущему значению переменной TestItem:
Case "все", "орехи" To "яблоки", TestItem
Допускаются вложенные инструкции Select Case. Каждой вложенной инструкции Select Case должна соответствовать инструкция End Select.

Пример
В данном примере инструкция Select Case используется для анализа значения переменной. Второе предложение Case содержит значение анализируемой переменной и следовательно выполняется только инструкция, связанная с этим предложением.

Dim Number
Number = 8		' Инициализирует переменную.
Select Case Number		' Анализирует число.
Case 1 To 5		' Число между 1 и 5.
    Debug.Print "Между 1 и 5"
' Это предложение Case является единственным истинным.
Case 6, 7, 8		' Число между 6 и 8.
    Debug.Print "Между 6 и 8"
Case Is > 8 And Number < 11	' 9 или 10.
Debug.Print "Больше 8"
Case Else		' Другие значения.
    Debug.Print "Вне интервала 1 -- 10"
End Select


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 62 - Инструкция SendKeys

Шаг 62 - Инструкция SendKeys

Передает активному окну одно или несколько нажатий клавиш, как если бы они были нажаты на клавиатуре.

SendKeys string[, wait]

Параметры
string
Обязательный. Строковое выражение, указывающее набор нажатий клавиш, который следует передать.
wait
Необязательный. Значение типа Boolean, указывающее режим ожидания. Если этот аргумент имеет значение False (значение по умолчанию), управление возвращается вызывающей процедуре сразу после завершения передачи нажатий клавиш. Если этот аргумент имеет значение True, управление возвращается вызывающей процедуре только после завершения обработки переданных нажатий клавиш.

Замечания
Для описания нажатий клавиш используются коды, состоящие из одного или нескольких символов. В качестве кода клавиши, соответствующей печатному символу, используется сам символ. Например, нажатию клавиши string "A". Для описания нескольких нажатий клавиш следует последовательно включить в string коды каждой клавиши. Например, последовательности клавиш A, B и C соответствует "ABC".
Символы плюс (+), "крышка" (^), знак процентов (%), тильда (~) и круглые скобки ( ) имеют специальное значение для инструкции SendKeys. Чтобы указать передачу одного из этих символов, следует заключить его в фигурные скобки ({}). Например, знаку плюс соответствует код {+}. Квадратные скобки ([ ]) не имеют специального значения для инструкции SendKeys, однако, их также необходимо заключать в фигурные скобки, поскольку они могут иметь специальное значение для других приложений, например, при динамическом обмене данными (DDE). Фигурным скобкам соответствуют коды {{} и {}}.
Для описания нажатий клавиш, которые не отображаются на экране (например, ENTER или TAB) или вызывают выполнение определенных действий, следует использовать перечисленные ниже коды:

BACKSPACE	{BACKSPACE}, {BS} или {BKSP}
BREAK	{BREAK}
CAPS LOCK	{CAPSLOCK}
DEL или DELETE	{DELETE} или {DEL}
СТРЕЛКА ВНИЗ	{DOWN}
END	{END}
ENTER	{ENTER}или ~
ESC	{ESC}
HELP	{HELP}
HOME	{HOME}
INS или INSERT	{INSERT} или {INS}
СТРЕЛКА ВЛЕВО	{LEFT}
NUM LOCK	{NUMLOCK}
PAGE DOWN	{PGDN}
PAGE UP	{PGUP}
PRINT SCREEN	{PRTSC}
СТРЕЛКА ВПРАВО	{RIGHT}
SCROLL LOCK	{SCROLLLOCK}
TAB	{TAB}
СТРЕЛКА ВВЕРХ	{UP}
F1	{F1}
F2	{F2}
F3	{F3}
F4	{F4}
F5	{F5}
F6	{F6}
F7	{F7}
F8	{F8}
F9	{F9}
F10	{F10}
F11	{F11}
F12	{F12}
F13	{F13}
F14	{F14}
F15	{F15}
F16	{F16}

Для описания сочетания клавиши с клавишами SHIFT, CTRL или ALT следует указать один из перечисленных ниже кодов перед кодом обычной клавиши:

SHIFT	+
CTRL 	^
ALT	%

Для описания сочетаний нескольких клавиш с клавишами SHIFT, CTRL или ALT следует заключить коды этих клавиш в круглые скобки, а перед ними указать код, соответствующий клавише SHIFT, CTRL или ALT. Например, нажатию клавиш E и C при нажатой и удерживаемой клавише SHIFT соответствует "+(EC)". Для указания нажатия клавиши E при нажатой клавише SHIFT, за которым следует нажатие клавиши C без удерживания клавиши SHIFT, следует использовать код "+EC".
Для описания нескольких последовательных нажатий одной клавиши следует использовать синтаксис {клавиша число}. Пробел между элементами клавиша и число является обязательным. Например, {LEFT 42} означает "нажмите клавишу СТРЕЛКА ВЛЕВО 42 раза; {h 10} означает "нажмите клавишу H 10 раз".
Инструкция SendKeys предназначена для передачи нажатий клавиш только приложениям, разработанным для работы в среде Microsoft Windows. Кроме того, эта инструкция не позволяет передать нажатие клавиши PRINT SCREEN {PRTSC} ни в одно приложение.

Пример
В данном примере используется функция Shell для запуска приложения "Калькулятор", имеющийся в Microsoft Windows. Затем с помощью инструкции SendKeys имитируется нажатие клавиш для введения чисел и последующего выхода из калькулятора. Инструкция SendKeys не используется на Macintosh. (Для проработки примера вставьте его в процедуру с помощью буфера, а затем выполните эту процедуру. Поскольку инструкция AppActivate передает фокус приложению "Калькулятор", этот пример нельзя выполнить в пошаговом отладочном режиме.)

Dim ReturnValue, I
ReturnValue = Shell("CALC.EXE", 1)		' Запускает калькулятор.
AppActivate ReturnValue 			' Активизирует калькулятор.
For I = 1 To 100				' Организует цикл.
    SendKeys I & "{+}", True		' Передает данные калькулятору
Next I					' для вычисления суммы.
SendKeys "=", True				' Окончательный результат.
SendKeys "%{F4}", True			' ALT+F4 закрывает калькулятор.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 63 - Инструкция Set

Шаг 63 - Инструкция Set

Присваивает ссылку на объект переменной или свойству.

Set объектнаяПеременная = {[New] объектноеВыражение | Nothing}

Параметры
объектнаяПеременная
Обязательный. Имя переменной или свойства, удовлетворяющее стандартным правилам именования переменных.
New
Необязательный. Ключевое слово New обычно используется при описании, чтобы включить возможность неявного создания нового экземпляра объекта. Ключевое слово New в инструкции Set задает создание нового экземпляра класса. Если объектнаяПеременная содержит ссылку на объект, эта ссылка освобождается при новом присвоении. Не допускается использование ключевого слова New для создания новых экземпляров любого внутреннего типа данных и для создания зависимых объектов.
объектноеВыражение
Обязательный. Выражение, состоящее из имени объекта, другой описанной переменной того же объектного типа или функции или метода, которые возвращают объект того же объектного типа.
Nothing
Необязательный. Разрывает связь объектнойПеременной с каким-либо определенным объектом. При этом объектнаяПеременная получает значение Nothing, освобождающее все системные ресурсы и ресурсы памяти, выделенные для объекта, на который имелась ссылка, если никакие другие переменные также не содержат на него ссылок.

Замечания
ОбъектнаяПеременная должна иметь объектный тип, соответствующий объекту, который будет ей присвоен.
Инструкции Dim, Private, Public, ReDim и Static описывают только переменную, которая ссылается на объект. Ссылка на реальный объект не возникает до присвоения определенного объекта в инструкции Set.
В следующем примере показано, как инструкция Dim используется для описания массива с типом Form1. Реально не существует ни одного экземпляра объекта Form1. Затем с помощью инструкции Set ссылка на новый экземпляр объекта Form1 присваивается переменной myChildForms. Такая программа позволяет создать дочерние формы в многооконном приложении (MDI).

Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1

Обычно при использовании инструкции Set для присвоения переменной ссылки на объект, не создается копия объекта для этой переменной. Вместо этого создается ссылка на объект. Несколько объектных переменных могут ссылаться на один и тот же объект. Поскольку эти переменные являются ссылками (а не его копиями) на объект, любые изменения этого объекта отражаются на всех переменных, которые ссылаются на него. Однако если в инструкции Set используется ключевое слово New, то в самом деле создается новый экземпляр этого объекта.

Пример
В данном примере инструкция Set используется для присвоения переменным ссылок на объект. Предполагается, что YourObject является допустимым объектом, обладающим свойством Text.

Dim YourObject, MyObject, MyStr
Set MyObject = YourObject		' Присваивает ссылку на объект.
' MyObject и YourObject ссылаются на один и тот же объект.
YourObject.Text = "Всем привет"		' Инициализирует свойство.
MyStr = MyObject.Text			' Возвращает "Всем привет".

' Разрыв связи: MyObject больше не ссылается на YourObject.
Set MyObject = Nothing			' Освобождает объект.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 64 - Инструкция SetAttr

Шаг 64 - Инструкция SetAttr

Задает атрибуты файла.

SetAttr pathname, attributes

Параметры
pathname
Обязательный. Строковое выражение, указывающее имя файла; может содержать имя каталога или папки и диска.
attributes
Обязательный. Константа или числовое выражение, задающее атрибуты файла.

vbNormal		0	Обычный (по умолчанию).
vbReadOnly	1	Только чтение.
vbHidden		2	Скрытый.
VbSystem		4	Системный.
vbArchive		32	Файл был изменен после последнего резервирования.

Замечания
При попытке изменения атрибутов открытого файла возникает ошибка выполнения.

Пример
В данном примере инструкция SetAttr используется для установки атрибутов файла.

SetAttr "TESTFILE", vbHidden			' Устанавливает атрибут "скрытый".
SetAttr "TESTFILE", vbHidden + vbReadOnly		' Устанавливает атрибуты "скрытый" и "только для чтения".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 65 - Инструкция Static

Шаг 65 - Инструкция Static

Применяется на уровне процедуры для описания переменных и выделения памяти. Переменные, описанные с помощью инструкции Static, сохраняют свои значения, пока выполняется программы..

Static имяПеременной[([индексы])] [As [New] тип] [, имяПеременной[([индексы])]
[As [New] тип]] . . .

Параметры
имяПеременной
Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
индексы
Необязательный. Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис:

[нижний To] верхний [,[нижний To] верхний] . . .
Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
New
Необязательный. Ключевое слово обеспечивает возможность неявного создания нового экземпляра объекта. При использовании ключевого слова New при описании объектной переменной задается создание нового экземпляра объекта при ссылке на него. Поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set. Ключевое слово New нельзя использовать для описания переменных любых внутренних типов данных, а также для описания экземпляров зависимых объектов.
тип
Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String, (для строк переменной длины), String * длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип.

Замечания
После запуска программы в модуле переменные, описанные с помощью инструкции Static, сохраняют свои значения до сброса или перезапуска модуля. Инструкция Static применяется в нестатических процедурахs для явного описания переменных, видимых только в этих процедурах, но имеющих время жизни, равное времени жизни модуля, в котором эти процедуры описаны.
Инструкция Static в процедуре предназначена для описания типа данных переменной, которая сохраняет свое значение в промежутках между вызовами процедуры. Например, в следующей инструкции описывается массив целых чисел фиксированного размера:

Static EmployeeNumber(200) As Integer
Ниже приводится описание переменной для нового экземпляра листа электронной таблицы:
Static X As New Worksheet

Если ключевое слово New не используется при описании объектной переменной, то перед использованием объекта необходимо присвоить имеющийся объект с помощью инструкции Set переменной, ссылающейся на этот объект. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что переменная не содержит ссылку на какой-либо определенный экземпляр объекта. При включении ключевого слова New в описание новый экземпляр объекта создается при первой ссылке на объект.
Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefТип, по умолчанию переменная получает тип Variant.
Инструкция Static и ключевое слово Static похожи, но используются для получения разных результатов. При описании процедуры с ключевым словом Static (например, Static Sub CountSales ()), память для всех локальных переменных процедуры выделяется один раз, и значения этих переменных сохраняются на все время выполнения программы. Для нестатических процедур память для переменных выделяется при каждом вызове процедуры и освобождается при завершении процедуры. Инструкция Static применяется для описания переменных в нестатических процедурах, чтобы сохранить их значения на время выполнения программы.
При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают при инициализации значение Empty. Каждый элемент переменной с типом, определяемым пользователем, при инициализации получает значение, которые он получил бы, если бы являлся одиночной переменной.
При использовании инструкции Static ее обычно помещают в начало процедуры вместе с другими инструкциями описания, такими как Dim.

Пример
В данном примере инструкция Static используется для сохранения значения переменной на все время выполнения модуля.

' Описание функции.
Function KeepTotal(Number)
    ' Только переменная Accumulate сохраняет свое значение
    ' от вызова к вызову.
    Static Accumulate
    Accumulate = Accumulate + Number
    KeepTotal = Accumulate
End Function

' Описание функции Static.
Static Function MyFunction(Arg1, Arg2, Arg3)
    ' Все локальные переменные сохраняют свои значения
    ' между вызовами функции.
    Accumulate = Arg1 + Arg2 + Arg3
    Half = Accumulate / 2
    MyFunction = Half
End Function


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 66 - Инструкция Stop

Шаг 66 - Инструкция Stop

Приостанавливает выполнение.

Stop

Замечания
Инструкция Stop может помещаться в любом месте процедуры для приостановки выполнения. Использование инструкции Stop аналогично установке в программе точки останова.
Инструкция Stop приостанавливает выполнение программы, но, в отличие от инструкции End, она не закрывает все файлы и не очищает все переменные, если только не находится в откомпилированном выполняемом файле (.exe).

Пример
В данном примере инструкция Stop используется для организации паузы на каждой итерации цикла For...Next.

Dim I
For I = 1 To 10		' Начинает цикл For...Next.
    Debug.Print I	' Выводит I в окно отладки.
    Stop		' Пауза в конце каждой итерации.
Next I


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 67 - Инструкция Sub

Шаг 67 - Инструкция Sub

Приостанавливает выполнение.

[Private | Public] [Static] Sub имя [(списокАргументов)]
    [инструкции]
    [Exit Sub]
    [инструкции]
End Sub

Параметры
Public
Необязательный. Указывает, что процедура Sub доступна для всех других процедур во всех модулях. При использовании в личном модуле (модуле, который содержит инструкцию Option Private) такая процедура является недоступной вне проекта.
Private
Необязательный. Указывает, что процедура Sub доступна для других процедур только того модуля, в котором она описана.
Static
Необязательный. Указывает, что локальные переменные процедуры Sub сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Sub, даже если они используются в процедуре.
имя
Обязательный. Имя процедуры Sub, удовлетворяющее стандартным правилам именования переменных.
списокАргументов
Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой.

  • Optional - Необязательный. Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Все аргументы, описанные как Optional, должны иметь тип Variant. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray.
  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.
  • ByRef - Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
  • ParamArray - Необязательный. Используется только в качестве последнего элемента в списке списокАргументов для указания, что конечным аргументом является описанный как Optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional.
  • имяПеременной 0 Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
  • тип - Необязательный. Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип.
  • поУмолчанию - Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

инструкции
Необязательный. Любая группа инструкций, выполняемых в процедуре Sub.

Замечания
Процедуры Sub, тип которых не указан явно с помощью слов Public или Private, являются общими по умолчанию. Если не используется слово Static, значения локальных переменных не сохраняются между вызовами процедур.
Допускаются рекурсивные процедуры Sub; т.е. они могут вызывать сами себя для выполнения определенных задач. Однако рекурсия может приводить к переполнению стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Sub.
Все выполняемые команды должны содержаться в процедурах. Не допускается определение процедуры Sub внутри другой процедуры Sub, Function или Property.
Инструкция Exit Sub приводит к немедленному выходу из процедуры Sub. Выполнение программы продолжается с инструкции, следующей за инструкцией, содержащей вызов процедуры Sub. В любом месте процедуры Sub допускается наличие любого числа инструкций Exit Sub.
Подобно процедурам Function, процедура Sub является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Function, которая возвращает значение, процедура Sub не может применяться в выражении.
Процедура Sub вызывается в выражении по своему имени, за которым следует список аргументов в скобках. Для получения дополнительных сведений о вызовах процедур Sub см. описание инструкции Call.
Переменные, используемые в процедурах Sub, разбиваются на две категории: явно описанные внутри процедуры и не описанные внутри процедуры. Переменные, которые явно описаны в процедуре (с помощью ключевого слова Dim или эквивалентного ему), всегда являются локальными для этой процедуры. Переменные, которые используются, но явно не описаны в процедуре, также являются локальными, если они явно не описаны на более высоком уровне.
В процедуре допускается использование переменной, которая явно не описана в этой процедуре, но при этом может возникать конфликт имен, если на уровне модуля был определен элемент с тем же самым именем. Если в процедуре содержится ссылка на неописанную переменную, имя которой совпадает с именем другой процедуры, константы или переменной, то подразумевается, что процедура ссылается на это имя на уровне модуля. Чтобы избежать возникновения конфликтов такого рода, следует пользоваться явным описанием переменных. Для включения обязательного явного описания переменных используется инструкция Option Explicit
Для входа или выхода из процедуры Sub нельзя использовать инструкции GoSub, GoTo или Return.

Пример
В данном примере инструкция Sub используется для описания имени, аргументов и кода, составляющих основу процедуры Sub.

' Описание процедуры Sub.
' Процедура Sub с двумя аргументами.
Sub SubComputeArea(Length, TheWidth)
    Dim Area As Double			' Объявляет локальную переменную.
    If Length = 0 Or TheWidth = 0 Then
    ' Если хотя бы один из аргументов равен 0.
        Exit Sub			' Немедленно завершает процедуру Sub.
    End If
    Area = Length * TheWidth		' Вычисляет площадь прямоугольника.
    Debug.Print Area			' Выводит полученное значение в окно отладки.
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 68 - Инструкция Time

Шаг 68 - Инструкция Time

Устанавливает системное время.

Time = время

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

Замечания
Если аргумент время является строкой, инструкция Time пытается преобразовать ее в значение времени, используя разделители компонентов времени, определенные в текущей системе. Если указанную строку не удастся преобразовать в допустимое время, возникает ошибка.

Пример
В данном примере инструкция Time используется для изменения системного времени.

Dim MyTime
MyTime = #4:35:17 PM#		' Присваивает время.
Time = MyTime			' Изменяет системное время.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 69 - Инструкция Type

Шаг 69 - Инструкция Type

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

[Private | Public] Type имяПеременной
     имяЭлемента [([индексы])] As тип
    [имяЭлемента [([индексы])] As тип]
    . . .
End Type

Параметры
Public
Необязательный. Используется для описания определяемых пользователем типов, которые доступны для всех процедур во всех модулях всех проектов.
Private
Необязательный. Используется для описания определяемых пользователем типов, которые доступны только в модуле, в котором выполняется описание.
имяПеременной
Обязательный. Имя типа, определяемого пользователем, удовлетворяющее правилам именования переменных.
имяЭлемента
Обязательный. Имя элемента определяемого пользователем типа. Имена элементов также должны соответствовать правилам именования переменных, за исключением того, что для их задания разрешается использовать ключевые слова.
индексы Необязательный. Размерности элемента, являющегося массивом. Для задания массива, размеры которого могут изменяться, указываются только скобки. Аргумент индексы использует следующий синтаксис:

[нижний To] верхний [,[нижний To] верхний] . . .

Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
тип
Обязательный. Тип данных элемента; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String(для строк переменной длины), String * длина (для строк фиксированной длины), Object, Variant, другой определяемый пользователем тип или объектный тип.

Замечания
Инструкция Type допускает использование только на уровне модуля. После определения типа данных с помощью инструкции Type имеется возможность в любом месте описать переменную этого типа в заданной области определения. Для описания переменной определяемого пользователем типа используются инструкции Dim, Private, Public, ReDim или Static.
В стандартных модулях типы данных, определяемые пользователем, по умолчанию являются общими. Видимость этих типов данных может быть изменена с помощью ключевого слова Private. В модулях класса, однако, типы данных, определяемые пользователем, могут быть только личными, и их видимость не может быть изменена с помощью ключевого слова Public.
Не допускается появление номеров строк и меток строк в блоках Type...End Type.
Типы данных, определяемые пользователями, могут использоваться с записями данных, которые часто состоят из набора связанных элементов различного типа.
В следующем примере демонстрируется использование массивов фиксированного размера в типах данных, определяемых пользователем:

Type StateData
    CityCode (1 To 100) As Integer	' Описывает статический массив.
    County As String * 30
End Type

Dim Washington(1 To 100) As StateData

В предыдущем примере StateData включает статический массив CityCode, а запись Washington имеет одинаковую со StateData структуру.
При описании массива фиксированного размера с типом, определяемым пользователем, его размерности должны описываться с помощью числовых литералов или констант, а не с помощью переменных.
Значение, задаваемое в инструкции Option Base, определяет нижнюю границу индексов для массивов, содержащихся в типах данных, определяемых пользователем.

Пример
В данном примере инструкция Type используется для определения типа данных. Инструкция Type используется только на уровне модуля. При появлении в модуле класса инструкции Type должно предшествовать ключевое слово Private.

Type EmployeeRecord	' Тип, определенный пользователем.
    ID As Integer	' Элементы типа данных.
    Name As String * 20
    Address As String * 30
    Phone As Long
    HireDate As Date
End Type
Sub CreateRecord()
    Dim MyRecord As EmployeeRecord	' Объявляет переменную.

' Присвоение значений элементам переменной EmployeeRecord
' должно выполняться в процедуре.
    MyRecord.ID = 12003	' Присваивает значение элементу.
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 70 - Инструкция Unload

Шаг 70 - Инструкция Unload

Удаляет объект из памяти.

Unload объект

Параметры
объект
Обязательный прототип объект представляет собой объектное выражение, значением которого является один из объектов, перечисленных в списке "Применение".

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

Пример
В следующем примере предполагается, что в программе определены пользователем две формы UserForms. Если произошло событие "Инициализация" (Initialize) для формы UserForm1, форма UserForm2 загружается и выводится на экран. Когда пользователь выбирает при помощи мыши UserForm2, она выгружается, и появляется форма UserForm1. Если же выбирается UserForm1, то она, в свою очередь, выгружается.

' Процедура события "Инициализация" (Initialize)
' для формы UserForm1.
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub

' Событие "Нажатие кнопки" (Click) для формы UserForm2
Private Sub UserForm_Click()
    Unload UserForm2
End Sub

' Событие "Нажатие кнопки" (Click) для формы UserForm1
Private Sub UserForm_Click()
    Unload UserForm1
End Sub


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 71 - Инструкция While...Wend

Шаг 71 - Инструкция While...Wend

Выполняет последовательность инструкций, пока заданное условие имеет значение True.

While условие
[инструкции]
Wend

Параметры
условие
Обязательный. Числовое выражение или строковое выражение, которое имеет значение True или False. Если условие имеет значение Null, условие рассматривается как имеющее значение False.
инструкции
Необязательный. Одна или несколько инструкций, выполняемых, пока условие имеет значение True.

Замечания
Если условие имеет значение True, выполняются все инструкции до инструкции Wend. Затем управление возвращается инструкции While и вновь проверяется условие. Если условие по-прежнему имеет значение True, процесс повторяется. Если оно не имеет значение True, выполнение возобновляется с инструкции, следующей за инструкцией Wend.
Циклы While...Wend могут иметь любую глубину вложенности. Каждая инструкция Wend соответствует предшествующей инструкции While.
нструкция Do...Loop обеспечивает более структурированный и гибкий способ организации циклов.

Пример
В данном примере инструкция While...Wend используется для увеличения переменной-счетчика. Инструкции в цикле выполняются до тех пор, пока указанное условие не True.

Dim Counter
Counter = 0			' Инициализирует переменную.
While Counter < 20			' Анализирует значение счетчика.
    Counter = Counter + 1	' Увеличивает счетчик.
Wend				' Завершает цикл While,
                ' если Counter > 19.
Debug.Print Counter		' Выводит 20 в окно отладки.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 72 - Инструкция Width #

Шаг 72 - Инструкция Width #

Задает ширину строки для файла, открытого с помощью инструкции Open.

Width #номерФайла, ширина

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
ширина
Обязательный. Числовое выражение в интервале от 0–255 включительно, которое указывает, сколько символов следует поместить на одной строке прежде, чем перейти к следующей строке. Если ширина равняется 0 (это значение используется по умолчанию), ширина строки не ограничивается. Аргумента ширина по умолчанию имеет значение 0.

Пример

Dim I
Open "TESTFILE" For Output As #1		' Открывает файл для записи.
Width #1, 5					' Устанавливает ширину равной 5.
For I = 0 To 9					' Цикл выполняется 10 раз.
    Print #1, Chr(48 + I);			' Печатает по 5 символов в строке.
Next I
Close #1					' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 73 - Инструкция With

Шаг 73 - Инструкция With

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

With объект
[инструкции]
End With

Параметры
объект
Обязательный. Имя объекта или определяемого пользователем типа.
инструкции
Необязательный. Одна или несколько инструкций, выполняемых над объектом.

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

With MyLabel
    .Height = 2000
    .Width = 2000
    .Caption = "Объект MyLabel"
End With

После входа в блок With значение аргумента объект изменить невозможно. В результате, невозможно использование одной инструкции With для воздействия на различные объекты.
Допускается создание вложенных конструкций With внутри другого. Однако, поскольку ссылки на объекты внешних блоков With перекрываются во внутренних блоках, необходимо во внутренних блоках With задавать полные ссылки на любой компонент объекта из внешнего блока With.
Нельзя выполнять переходы внутрь или из блоков With. Если не выполнены инструкции With или End With, возможно возникновение ошибок или непредсказуемое поведение объектов.

Пример
В данном примере инструкция With используется для выполнения набора инструкций над одним объектом. Объект MyObject и его свойства используются исключительно в иллюстративных целях.

With MyObject
    .Height = 100			' Эквивалентно MyObject.Height = 100.
    .Caption = "Привет"		' Эквивалентно MyObject.Caption = "Привет".
    With .Font
        .Color = Red		' Эквивалентно MyObject.Font.Color = Red.
        .Bold = True		' Эквивалентно MyObject.Font.Bold = True.
    End With
End With


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 74 - Инструкция Write #

Шаг 74 - Инструкция Write #

Записывает неформатированные данные в файл с последовательным доступом.

Write #номерФайла, [списокВывода]

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
списокВывода
Необязательный. Одно или несколько разделяемых запятыми числовых выражений или строковых выражений, которые следует записать в файл.

Замечания
Данные, записанные с помощью инструкции Write #, обычно считываются из файла с помощью инструкции Input #.
Если аргумент списокВывода опущен, а после аргумента номерФайла идет только разделитель списка, в файл будет напечатана пустая строка. Для разделения выражений можно использовать пробелы, точки с запятой или запятые, которые в данной ситуации полностью эквивалентны.
Ниже приведены правила, которые используются при записи данных в файл с помощью инструкции Write #. Записанные данные могут быть корректно прочитаны с помощью инструкции Input # при наличии любой национальной настройки:
В качестве десятичного разделителя при записи числовых данных всегда используется точка.
При выводе логических данных (тип Boolean) в файл записываются ключевые слова #TRUE# или #FALSE#. Ключевые слова True и False не переводятся.
При выводе в файл данных типа Date используется универсальный формат даты. Если компонент, соответствующий дате или времени, отсутствует или равен нулю, в файл записывается только имеющийся в наличии компонент.
Если аргумент списокВывода имеет значение Empty, в файл ничего не записывается.
Если списокВывода имеет значение Null, в файл записывается #NULL#.
Данные типа Error записываются в файл как #ERROR кодОшибки#. Ключевое слово Error не переводится.
В отличие от инструкции Print #, инструкция Write # вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Разработчику не требуется включать разделители в список явным образом. Write # вставляет символ новой строки, т.е. комбинацию символов возврата каретки и перевода строки (Chr(13) + Chr(10)), после записи в файл последнего символа, включенного в списокВывода.

Пример
В данном примере инструкция Write # используется для записи неформатированных данных в последовательный файл.

Open "TESTFILE" For Output As #1	' Открывает файл для записи.
Write #1, "Всем привет", 234		' Записывает данные, разделенные запятой.
Write #1,				' Записывает пустую строку.

Dim MyBool, MyDate, MyNull, MyError
' Присваивает значения типа Boolean, Date, Null и Error.
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' Логические данные записываются как #TRUE# или #FALSE#. При выводе дат
' используется универсальный формат даты, например, #1994-07-13#
' соответствует 13 июля 1994 года. Значения Null записываются как
' #NULL#. Данные типа Error записываются как #ERROR код_ошибки#.
Write #1, MyBool ; " - логическое значение"
Write #1, MyDate ; " - дата"
Write #1, MyNull ; " - значение Null"
Write #1, MyError ; " - значение типа Error"
Close #1	' Закрывает файл.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 75 - Список операторов

Шаг 75 - Список операторов

Оператор &
Оператор *
Оператор +
Оператор -
Оператор /
Оператор \
Оператор ^
Оператор And
Операторы сравнения
Оператор Eqv
Оператор Imp
Оператор Is
Оператор Like
Оператор Mod
Оператор Not
Оператор Or
Оператор Xor


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 76 - Старшинство операторов

Шаг 76 - Старшинство операторов

Если выражение содержит несколько операторов, то значения компонентов выражения рассчитываются в определенном порядке. Такой порядок называют порядком старшинства или приоритетом операторов.

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

Арифметические			Сравнения			Логические
Возведение в степень (^)		Равняется (=)		Not
Изменение знака (–)		Не равняется (<>)		And
Умножение и деление (*, /)		Меньше (<)		Or
Целое деление (\)			Больше (>)		Xor
Деление по модулю (Mod)		Меньше или равняется (<=)	Eqv
Сложение и вычитание (+, –)		Больше или равняется (>=)	Imp
Слияние строк (&)			Like
                Is

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

Оператор конкатенации (слияния строк) (&) не является арифметическим оператором, однако, по порядку старшинства он следует сразу за арифметическими операторами и перед операторами сравнения.

Оператор Like, равный по старшинству остальным операторам сравнения, выделяется в самостоятельный тип оператора сравнения с образцом.

Оператор Is является оператором сравнения ссылок на объект. Этот оператор не выполняет сравнение объектов или их значений; он проверяет только, указывают ли две разные ссылки на один объект.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 77 - Оператор &

Шаг 77 - Оператор &

Используется для слияния двух строковых выражений.

результат = выражение1 & выражение2

Параметры
результат
Обязательный; любая переменная типа String или Variant.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.

Замечания
Если выражение не содержит строковое значение, то оно преобразуется к подтипу String типа Variant. Если оба операнда являются строковыми выражениями, то результат имеет тип данных String; в противном случае результат принадлежит к подтипу String типа Variant. Если оба операнда является выражением со значением Null, результат имеет значение Null. Однако если значение Null имеет только одно выражение, то при слиянии с другим операндом этот операнд рассматривается как пустая строка (""). Любой операнд со значением Empty также рассматривается как пустая строка.

Пример
В данном примере демонстрируется использование оператора & для слияния строк.

Dim MyStr
MyStr = "Всем" & " привет"		' Возвращает "Всем привет".
MyStr = "Check " & 123 & " Check"	' Возвращает "Check 123 Check".


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 78 - Оператор *

Шаг 78 - Оператор *

Возвращает произведение двух чисел.

результат = число1*число2

Параметры
результат
Обязательный; любая числовая переменная.
Число1
Обязательный; любое числовое выражение.
число2
Обязательный; любое числовое выражение.

Замечания
результат обычно имеет тип данных выражения с максимальной точностью. В порядке возрастания точности следуют типы Byte, Integer , Long, Single, Currency, Double и Decimal. Из этого правила имеются такие исключения:

Операция						результат
Умножение чисел типа Single и Long,			Double.
результат должен получить значение подтипа
Long, Single или Date типа Variant, выходящее
за рамки допустимых для этих типов
диапазонов значений.				Преобразуется к подтипу Double типа Variant.
результат должен получить значение подтипа
Byte типа Variant, выходящее за рамки
допустимых для этого типа диапазона значений.		Преобразуется к подтипу Integer.
результат должен получить значение подтипа
Integer типа Variant, выходящее за рамки
допустимых для этого типа диапазона значений.		Преобразуется к подтипу Long.

Если один или оба операнда является выражением со значением Null, то результат имеет значение Null. Выражение, имеющее значение Empty, рассматривается как имеющее значение 0.
Точность результатов операции умножения может отличаться от точности результатов операций сложения и вычитания.

Пример
В данном примере демонстрируется использование оператора * для расчета произведения двух чисел.

Dim MyValue
MyValue = 2 * 2			' Возвращает 4.
MyValue = 459.35 * 334.90 		' Возвращает 153836.315.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 79 - Оператор +

Шаг 79 - Оператор +

Возвращает сумму двух чисел.

результат = выражение1+выражение2

Параметры
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое expression.
выражение2
Обязательный; любое выражение.

Замечания
Несмотря на то, что допускается использование оператора + для слияния строковых значений, рекомендуется во избежание возможной путаницы и необходимости дополнительных описаний в программе использовать для слияния строк оператор конкатенации &.
Если по крайней мере один из операндов не принадлежит к типу Variant, действуют следующие правила:

Операнды								Операция
Оба выражения имеют числовые типы данных (Byte, Boolean,
Integer, Long, Single, Double, Date, Currency или Decimal)		Сложение.
Оба выражения имеют тип String					Слияние строк.
Одно выражение имеет числовой тип данных, а другое тип
Variant (за исключением значения Null).				Сложение.
Одно выражение имеет тип String , а другое тип Variant
(за исключением значения Null).					Слияние строк.
Одно выражение имеет тип Variant и содержит значение Empty.		результат получает значение второго операнда.
Одно выражение имеет числовой тип данных, а другое
тип String.							Возникает ошибка несогласования типов.
Оба выражения имеют значения Null					результат имеет значение Null.

Если оба операнда являются выражениями типа Variant, действуют следующие правила:

Операнды										Операция
Оба выражения типа Variant являются числовыми.					Сложение.
Оба выражения типа Variant являются строковыми.					Слияние строк.
Одно из выражений типа Variant является числовым, а другое строковым.			Сложение.

В простых операциях сложения с участием только операндов с числовыми типами результат обычно имеет тип данных слагаемого с максимальной точностью. В порядке возрастания точности следуют типы Byte, Integer, Long, Single, Double, Currency и Decimal. Из этого правила существуют такие исключения:

Операция									результат
Сложение чисел типа Single и Long.						Double.
результат должен получить значение подтипа Long, Single
или Date типа Variant, выходящее за рамки допустимых для
этих типов диапазонов значений.						Преобразуется к подтипу Double.
результат должен получить значение подтипа Byte типа
Variant, выходящее за рамки допустимых для этого типа
диапазона значений.							Преобразуется к подтипу Integer.
результат должен получить значение подтипа Integer типа
Variant, выходящее за рамки допустимых для этого типа
диапазона значений.							Преобразуется к подтипу Long.
Значение типа Date складывается со значением любого типа.			Date

Если один или оба операнда является выражением со значением Null, то результат имеет значение Null. Если оба операнда имеют значение Empty, результат имеет тип Integer. Если значение Empty имеет только один из операндов, результат получает значение второго операнда.

Точность результатов операций сложения и вычитания может отличаться от точности результатов операции умножения.

Пример
В данном примере демонстрируется использование оператора + для суммирования чисел. Оператор + позволяет также выполнять слияние строковых значений, однако, во избежание неопределенности рекомендуется выполнять эту операцию только с помощью оператора &. Если один из операндов содержит числовое значение, а второй строковое, то оператор + выполняет операцию сложения. Если оба операнда содержат строковые значения, выполняется слияние строк (конкатенация).

Dim MyNumber, Var1, Var2
MyNumber = 2 + 2		' Возвращает 4.
MyNumber = 4257.04 + 98112	' Возвращает 102369.04.

Var1 = "34": Var2 = 6		' Инициализирует переменные разных типов.
MyNumber = Var1 + Var2		' Возвращает 40.

Var1 = "34": Var2 = "6"		' Инициализирует строковые переменные.
MyNumber = Var1 + Var2		' Возвращает "346" (слияние строк)


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 80 - Оператор –

Шаг 80 - Оператор –

Возвращает разность двух чисел или изменяет знак числового выражения.

результат = число1–число2
–число

Параметры
результат
Обязательный; любая числовая переменная.
число
Обязательный; любое числовое выражение.
число1
Обязательный; любое числовое выражение.
число2
Обязательный; любое числовое выражение.

Замечания
В первом варианте синтаксиса оператор – является арифметическим оператором вычитания, возвращающим разность двух чисел. Во втором варианте синтаксиса оператор – используется как унарный оператор, изменяющий знак выражения.
результат обычно имеет тип данных выражения с максимальной точностью. В порядке возрастания точности следуют типы Byte, Integer, Long, Single, Double, Currency и Decimal. Из этого правила имеются такие исключения:

Операция							результат
Вычитание значений Single и Long.				Преобразуется к типу Double.
результат должен получить значение подтипа Long,
Single или Date типа Variant, выходящее за рамки
допустимых для этих типов диапазонов значений.		Преобразуется к подтипу Variant, содержащему значение типа Double.
результат должен получить значение подтипа Byte
типа Variant, выходящее за рамки допустимых для
этого типа диапазона значений.				Преобразуется к подтипу Integer.
результат должен получить значение подтипа Integer
типа Variant, выходящее за рамки допустимых для
этого типа диапазона значений.				Преобразуется к подтипу Long.
Значение типа Date участвует в операции вычитания
со значением любого типа.					Date.
Два значения типа Date участвуют в операции вычитания.		Double.

Если один или оба операнда является выражением со значением Null, то результат имеет значение Null. Выражение со значением Empty рассматривается как имеющее значение 0.

Точность результатов операций сложения и вычитания может отличаться от точности результатов операции умножения.

Пример
В данном примере демонстрируется использование оператора - для вычисления разности двух чисел.

Dim MyResult
MyResult = 4 - 2		' Возвращает 2.
MyResult = 459.35 - 334.90	' Возвращает 124.45.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 81 - Оператор /

Шаг 81 - Оператор /

Возвращает результат деления двух чисел.

результат = число1/число2

Параметры
результат
Обязательный; любая числовая переменная.
число1
Обязательный; любое числовое выражение.
число2
Обязательный; любое числовое выражение.

Замечания
результат обычно имеет тип данных Double или подтип Double типа Variant. Из этого правила имеются такие исключения:

Операция							результат
Оба выражения имеют тип Byte, Integer или Single.		Тип Single, если при этом результат не выходит за рамки
                            допустимого для этого типа диапазона значений; в последнем
                            случае возникает ошибка.
Оба выражения принадлежат к подтипу Byte,
Integer или Single типа Variant.				результат имеет подтип Single типа Variant, если при этом
                            он не выходит за рамки допустимого диапазона значений; в
                            последнем случае результат получает значение подтипа Double.
В делении участвует значение типа
Decimal и значение любого другого типа.			Decimal.

Если один или оба операнда является выражением со значением Null, то результат имеет значение Null. Выражение, имеющее значение Empty, рассматривается как имеющее значение 0.

Пример
В данном примере демонстрируется использование оператора / для деления двух чисел.

Dim MyValue
MyValue = 10 / 4	' Возвращает 2.5.
MyValue = 10 / 3	' Возвращает 3.333333.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 82 - Оператор \

Шаг 82 - Оператор \

Возвращает результат целого деления двух чисел.

результат = число1\число2

Параметры
результат
Обязательный; любая числовая переменная.
число1
Обязательный; любое числовое выражение.
число2
Обязательный; любое числовое выражение.

Замечания
Перед выполнением деления значения операндов округляются до целых значений типа Byte, Integer или Long.
Обычно, результат имеет тип данных Byte, подтип Byte типа Variant, тип Integer, подтип Integer типа Variant, тип Long или подтип Long типа Variant, вне зависимости от того, является ли результат целым числом. Любая дробная часть отбрасывается. Если один или оба операнда является выражением со значением Null, результат имеет значение Null. Выражение, имеющее значение Empty, рассматривается как имеющее значение 0.

Пример
В данном примере демонстрируется использование оператора \ для целого деления двух чисел.

Dim MyValue
MyValue = 11 \ 4		' Возвращает 2.
MyValue = 9 \ 3		' Возвращает 3.
MyValue = 100 \ 3		' Возвращает 33.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 83 - Оператор ^

Шаг 83 - Оператор ^

Возводит число в степень.

результат = число^показатель

Параметры
результат
Обязательный; любая числовая переменная.
число
Обязательный; любое числовое выражение.
показатель
Обязательный; любое числовое выражение.

Замечания
Отрицательные значения операнда число допускаются только для целых значений операнда показатель. Стоящие рядом в выражении несколько операторов возведения в степень ^ выполняются слева направо.
Обычно, результат имеет тип данных Double или Variant, содержащий значение типа Double. Если любой из операндов число или показатель представлен выражением, имеющим значение Null, то результат также имеет значение Null.

Пример
В данном примере демонстрируется использование оператора ^ для возведения числа в степень.

Dim MyValue
MyValue = 2 ^ 2		' Возвращает 4.
MyValue = 3 ^ 3 ^ 3	' Возвращает 19683.
MyValue = (-5) ^ 3		' Возвращает -125.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 84 - Оператор And

Шаг 84 - Оператор And

Возвращает результат конъюнкции (логического И) для двух выражений.

результат = выражение1 And выражение2

Параметры
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.

Замечания
Если оба выражения имеют значение True, результат имеет значение True. Если хотя бы одно из выражений имеет значение False, результат имеет значение False. Возвращаемые оператором значения представлены в следующей таблице:

выражение1	выражение2	результат
True		True		True
True		False		False
True		Null		Null
False		True		False
False		False		False
False		Null		False
Null		True		Null
Null		False		False
Null		Null		Null

Оператор And выполняет также поразрядное сравнение двух числовых выражений и присваивает соответствующему разряду в переменной результат следующее значение:

Разряд в выражение1	Разряд в выражение2	результат
0			0			0
0			1			0
1			0			0
1			1			1

Пример
В данном примере демонстрируется использование оператора And для выполнения операции конъюнкции (логического умножения) двух выражений.

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null		' Инициализирует переменные.
MyCheck = A > B And B > C		' Возвращает True.
MyCheck = B > A And B > C		' Возвращает False.
MyCheck = A > B And B > D		' Возвращает Null.
MyCheck = A And B			' Возвращает 8 (поразрядное сравнение).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 85 - Операторы сравнения

Шаг 85 - Операторы сравнения

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

результат = выражение1 операторСравнения выражение2
результат = объект1 Is объект2
результат = строка Like образец

Параметры
результат
Обязательный; любая числовая переменная.
выражение
Обязательный; любое выражение.
операторСравнения
Обязательный; любой оператор сравнения.
объект
Обязательный; любое имя объекта.
строка
Обязательный; любое строковое выражение.
образец
Обязательный; любое строковое выражение или диапазон символов.

Замечания
Ниже приведен список операторов сравнения и условия, при которых результат имеет значение True, False или Null:

Оператор			True					False				Null
< (Меньше)		выражение1 < выражение2		выражение1 <= выражение2	выражение1 или выражение2 = Null
<= (Меньше или равняется)	выражение1 <= выражение2		выражение1 < выражение2	выражение1 или выражение2 = Null
> (Больше)		выражение1 > выражение2		выражение1 >= выражение2	выражение1 или выражение2 = Null
>= (Больше или равняется)	выражение1 >= выражение2		выражение1 > выражение2	выражение1 или выражение2 = Null
= (Равняется)		выражение1 = выражение2		выражение1 <> выражение2	выражение1 или выражение2 = Null
<> (Не равняется)		выражение1 <> выражение2		выражение1 = выражение2	выражение1 или выражение2 = Null

Операторы Is и Like функционально отличаются от операторов сравнения, перечисленных в таблице.
При сравнении двух выражений иногда затруднительно определить, будут ли сравниваться выражения как числовые или как строковые. В следующей таблице показано, как сравниваются выражения, если хотя бы одно из них не принадлежит к типу Variant:

Операнды								Операция
Оба выражения имеют числовые типы данных (Byte, Boolean, Integer,
Long, Single, Double, Date, Currency или Decimal).			Сравнение чисел.
Оба выражения имеют тип String.					Сравнение строк.
Одно выражение имеет числовой тип, а другое тип Variant,
содержащий число или допускающий преобразование к числовому типу.	Сравнение чисел.
Одно выражение имеет числовой тип, а другое тип Variant,
содержащий строку, не допускающую преобразование к числовому типу.	Ошибка несогласования типов.
Одно выражение имеет тип String, а другое тип Variant (не Null).	Сравнение строк.
Одно выражение имеет значение Empty, а другое числовой тип данных.	Сравнение чисел, где значение Empty рассматривается как 0.
Одно выражение имеет значение Empty, а другое тип String.		Сравнение строк, где значение Empty рассматривается как пустая строка ("").

Если оба операнда, выражение1 и выражение2, принадлежат к типу Variant, то способ сравнения определяется подтипами, к которым они принадлежат. В следующей таблице показано, как осуществляется сравнение в зависимости от подтипов типа Variant:

Операнды						Операция
Оба выражения типа Variant имеют числовые значения.	Сравнение чисел.
Оба выражения типа Variant имеют строковые значения.	Сравнение строк.
Одно из выражений типа Variant является числовым,
а другое строковым.				Числовое выражение считается меньшим, чем строковое.
Одно из выражений типа Variant имеет значение Empty,
а другое числовое значение.				Сравнение чисел, где значение Empty рассматривается как 0.
Одно из выражений типа Variant имеет значение Empty,
а другое строковое значение.			Сравнение строк, где значение Empty рассматривается как пустая строка ("").
Оба выражения типа Variant имеют значение Empty.	Выражения считаются равными.

При сравнении значения типа Single со значением типа Double, значение типа Double округляется до точности типа Single.
Если значение типа Currency сравнивается со значением типа Single или Double, то значение типа Single или Double преобразуется к типу Currency. Аналогично, при сравнении значения типа Decimal со значением типа Single или Double, значение типа Single или Double преобразуется к типу Decimal. Для типа Currency любая дробная часть со значением, меньшим 0,0001 может оказаться потерянной. Для типа Decimal могут быть потеряны дробные части, меньшие 1E-28, или возникнуть ошибка переполнения. Потеря дробных частей может привести к тому, что числа, не являющиеся целыми, будут сравниваться как целые.

Пример
В данном примере демонстрируется использование операторов сравнения для сравнения выражений.

Dim MyResult, Var1, Var2
MyResult = (45 < 35)		' Возвращает False.
MyResult = (45 = 45)		' Возвращает True.
MyResult = (4 <> 3)		' Возвращает True.
MyResult = ("5" > "4")		' Возвращает True.

Var1 = "5": Var2 = 4		' Инициализирует переменные.
MyResult = (Var1 > Var2)		' Возвращает True.

Var1 = 5: Var2 = Empty
MyResult = (Var1 > Var2)		' Возвращает True.

Var1 = 0: Var2 = Empty
MyResult = (Var1 = Var2)		' Возвращает True.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 86 - Оператор Eqv

Шаг 86 - Оператор Eqv

Используется для проверки логической эквивалентности двух выражений.

результат = выражение1 Eqv выражение2

Параметры
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.

Замечания
Если хотя бы одно из выражений имеет значение Null,то результат также имеет значение Null. Если ни одно из выражений не имеет значение Null, результат определяется следующим образом:

выражение1	выражение2	результат
True		True		True
True		False		False
False		True		False
False		False		True

Оператор Eqv выполняет также поразрядное сравнение двух числовых выражений и присваивает соответствующему разряду в переменной результат следующее значение:

Разряд в выражение1	Разряд в выражение2	результат
0				0			1
0				1			0
1				0			0
1				1			1

Пример

В данном примере демонстрируется использование оператора Eqv для выполнения операции логической эквивалентности двух выражений.

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null	' Инициализирует переменные.
MyCheck = A > B Eqv B > C		' Возвращает True.
MyCheck = B > A Eqv B > C		' Возвращает False.
MyCheck = A > B Eqv B > D		' Возвращает Null.
MyCheck = A Eqv B			' Возвращает -3 (поразрядное сравнение).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 87 - Оператор Imp

Шаг 87 - Оператор Imp

Выполняет операцию логической импликации для двух выражений.

результат = выражение1 Imp выражение2

Параметры
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.

Замечания
Возвращаемые оператором значения представлены в следующей таблице:

выражение1	выражение2	результат
True		True		True
True		False		False
True		Null		Null
False		True		True
False		False		True
False		Null		True
Null		True		True
Null		False		Null
Null		Null		Null

Оператор Imp выполняет также поразрядное сравнение двух числовых выражений и присваивает соответствующему разряду в переменной результат следующее значение:

Разряд в выражение1	Разряд в выражение2	результат
0			0			1
0			1			1
1			0			0
1			1			1

Пример
В данном примере демонстрируется использование оператора Imp для выполнения операции логической импликации двух выражений.

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null	' Инициализирует переменные
MyCheck = A > B Imp B > C		' Возвращает True.
MyCheck = A > B Imp C > B		' Возвращает False.
MyCheck = B > A Imp C > B		' Возвращает True.
MyCheck = B > A Imp C > D		' Возвращает True.
MyCheck = C > D Imp B > A		' Возвращает Null.
MyCheck = B Imp A			' Возвращает -1 (поразрядное сравнение).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 88 - Оператор Is

Шаг 88 - Оператор Is

Используется для сравнения двух переменных, содержащих ссылки на объекты.

результат = объект1 Is объект2

Параметры
результат
Обязательный; любая числовая переменная.
объект1
Обязательный; любое имя объекта.
объект2
Обязательный; любое имя объекта.

Замечания
Если переменные объект1 и объект2 содержат ссылки на один объект, результат имеет значение True; в противном случае результат имеет значение False. Ссылки на один объект в двух переменных задаются различными способами.
В следующей инструкции в переменной A задается ссылка на тот же объект, что и в переменной B:

Set A = B

Следующая инструкция задает в переменных A и B ссылку на тот же объект, что и в переменной C:

Set A = C
Set B = C

Пример
В данном примере демонстрируется использование оператора Is для сравнения ссылок на объекты. Имена объектных переменных являются произвольными и используются только для демонстрации.

Dim MyObject, YourObject, ThisObject, OtherObject, ThatObject, MyCheck
Set YourObject = MyObject		' Определяет ссылки на объекты.
Set ThisObject = MyObject
Set ThatObject = OtherObject
MyCheck = YourObject Is ThisObject	' Возвращает True.
MyCheck = ThatObject Is ThisObject	' Возвращает False.
                ' Пусть MyObject <> OtherObject
MyCheck = MyObject Is ThatObject	' Возвращает False.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 89 - Оператор Like

Шаг 89 - Оператор Like

Используется для сравнения двух строковых выражений.

результат = строка Like образец

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

Замечания
Если значение переменной строка соответствует значению переменной образец, результат имеет значение True; при их несоответствии результат имеет значение False. Если любой из операндов, строка или образец, имеет значение Null, результат также имеет значение Null.
Характеристики оператора Like определяются настройкой, задаваемой в инструкции Option Compare. Если не указано другое, то стандартный способ сравнения строк в каждом модуле задается инструкцией Option Compare Binary.
Инструкция Option Compare Binary указывает способ сравнения строковых значений, основанный на порядке сортировки, который определяется внутренним двоичным представлением символов. В Microsoft Windows порядок сортировки определяется кодовой страницей. Ниже демонстрируется типичный пример упорядочивания символов:

A < B < E < Z < a < b < e < z < А < К < Ш < а < к < ш

Инструкция Option Compare Text указывает способ сравнения строковых значений, основанный на порядке сортировки по алфавиту без учета регистра, который определяется национальной настройкой системы. Приведенная выше последовательность символов при сортировке с настройкой Option Compare Text будет упорядочиваться следующим образом:

(A=a) < (B=b) < (E=e) < (Z=z) < (А=а) < (К=к) < (Ш=ш)

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

Специальные символы	Совпадающие символы
?			Любой одиночный символ.
*			Любое количество символов или отсутствие символа.
#			Любая одиночная цифра (0–9).
[список]			Любой одиночный символ, входящий в список.
[!список]			Любой одиночный символ, не входящий в список.

Любой одиночный символ в переменной строка может быть сравнен с группой из одного или нескольких символов (список), заключенных в квадратные скобки ([ ]). Такая группа может содержать символы практически с любыми кодами, включая цифры.
Специальные символы левая квадратная скобка ([), вопросительный знак (?), символ (#) и звездочка (*) сравниваются как обычные символы, только если они заключены в квадратные скобки. Правая квадратная скобка (]) в группе всегда рассматривается как специальный символ, но может сравниваться как обычный символ вне группы.
В дополнение к простому списку символов в квадратных скобках, допускается указание в образце диапазона символов с помощью дефиса (–), отделяющего нижнюю и верхнюю границы диапазона. Например, [A-Z] указывает, что совпадающими будут считаться все символы верхнего регистра латинского алфавита, находящиеся в нужной позиции в переменной строка. Допускается указание внутри прямых скобок нескольких диапазонов без символов разделителей.
Конкретный вид указанного диапазона определяется действующим во время выполнения способом упорядочивания символов (который задается инструкцией Option Compare и национальной настройкой системы). Если использовать приведенный выше пример в режиме Option Compare Binary, то диапазону [A–E] соответствуют символы A, B и E. В режиме Option Compare Text, образцу [A–E] соответствуют символы A, a, А, а, B, b, E, e. Отметим, что в это диапазон не попадают символы К или к, поскольку все символы русского алфавита размещаются в порядке сортировки после стандартных символов латинского алфавита.
Существуют также следующие правила, действующие при сравнении с образцом:
Восклицательный знак (!) в начале перечня список указывает, что совпадающим с образцом считается любой символ в соответствующей позиции в операнде строка, за исключением входящих в список. Вне квадратных скобок восклицательный знак рассматривается как обычный символ.
Дефис (–) в начале списка или сразу после восклицательного знака, а также в конце списка рассматривается как обычный символ. В любой другой позиции внутри квадратных скобок он рассматривается как определение диапазона.
Определять диапазон необходимо в порядке возрастания. [A-Z] является допустимым определением диапазона, а [Z-A] недопустимым.
Пустая пара квадратных скобок [] игнорируется; она рассматривается как пустая строка ("").
В некоторых языках имеются специальные символы алфавита, представляющие пару букв. Например, символ "ж" представляет стоящие рядом буквы "a" и "e". Оператор Like распознает такой символ и соответствующую пару букв как эквивалентные.
Если в системных национальной настройке указан язык, в котором используются специальные символы, то включение такого символа и в переменную образец, и в переменную строка приводит к тому, что эквивалентная пара в букв в другом операнде рассматривается как совпадающая с этим символом. Аналогично, при включении специального символа в образец внутри квадратных скобок (одного символа или как часть определения списка или диапазона) он представляет эквивалентную пару букв в операнде строка.

Пример
В данном примере демонстрируется использование оператора Like для сравнения строкового значения с образцом.

Dim MyCheck
MyCheck = "aBBBa" Like "a*a"		' Возвращает True.
MyCheck = "F" Like "[A-Z]"			' Возвращает True.
MyCheck = "F" Like "[!A-Z]"			' Возвращает False.
MyCheck = "a2a" Like "a#a"			' Возвращает True.
MyCheck = "aM5b" Like "a[L-P]#[!c-e]"	' Возвращает True.
MyCheck = "BAT123khg" Like "B?T*"		' Возвращает True.
MyCheck = "CAT123khg" Like "B?T*"		' Возвращает False.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 90 - Оператор Mod

Шаг 90 - Оператор Mod

Возвращает остаток при целом делении двух чисел (значение по модулю).

результат = число1 Mod число2

Параметры
результат
Обязательный; любая числовая переменная.
число1
Обязательный; любое числовое выражение.
число2
Обязательный; любое числовое выражение.

Замечания
Выполняется деление по модулю (нахождение остатка) число1 на число2 (с округлением действительных чисел до целых). результат получает значение остатка. Например, в следующем выражении A (результат) равняется 5.

A = 19 Mod 6.7

Обычно, результат имеет тип данных Byte, подтип Byte типа Variant, тип Integer, подтип Integer типа Variant, тип Long или подтип Long типа Variant, вне зависимости от того, является ли результат целым числом. Любая дробная часть отбрасывается. Если один или оба операнда является выражением со значением Null, результат имеет значение Null. Выражение, имеющее значение Empty, рассматривается как имеющее значение 0.

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

Dim MyResult
MyResult = 10 Mod 5	' Возвращает 0.
MyResult = 10 Mod 3	' Возвращает 1.
MyResult = 12 Mod 4.3	' Возвращает 0.
MyResult = 12.6 Mod 5	' Возвращает 3.


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 91 - Оператор Not

Шаг 91 - Оператор Not

Выполняет над выражением операцию логического отрицания.

результат = Not выражение

Параметры
результат
Обязательный; любая числовая переменная.
выражение
Обязательный; любое выражение.

Замечания
Возвращаемые оператором значения представлены в следующей таблице:

выражение		результат
True		False
False		True
Null		Null

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

Разряд в выражение		результат
0			1
1			0

Пример
В данном примере демонстрируется использование оператора Not для выполнения операции логического отрицания для одного выражения.

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null		' Инициализирует переменные.
MyCheck = Not(A > B)			' Возвращает False.
MyCheck = Not(B > A)			' Возвращает True.
MyCheck = Not(C > D)			' Возвращает Null.
MyCheck = Not A				' Возвращает -11 (поразрядное сравнение).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 92 - Оператор Or

Шаг 92 - Оператор Or

Выполняет операцию логического ИЛИ (сложения) для двух выражений.

результат = выражение1 Or выражение2

Параметры
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.

Замечания
Если одно или оба выражения истинны (имеют значение True), результат также имеет значение True. Возвращаемые оператором значения представлены в следующей таблице:

выражение1	выражение2	результат
True		True		True
True		False		True
True		Null		True
False		True		True
False		False		False
False		Null		Null
Null		True		True
Null		False		Null
Null		Null		Null

Оператор Or выполняет также поразрядное сравнение двух числовых выражений и присваивает соответствующему разряду в переменной результат следующее значение:

Разряд в выражение1	Разряд в выражение2	результат
0			0			0
0			1			1
1			0			1
1			1			1

Пример
В данном примере демонстрируется использование оператора Or для выполнения операции дизъюнкции (логического сложения) двух выражений.

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null	' Инициализирует переменные.
MyCheck = A > B Or B > C		' Возвращает True.
MyCheck = B > A Or B > C		' Возвращает True.
MyCheck = A > B Or B > D		' Возвращает True.
MyCheck = B > D Or B > A		' Возвращает Null.
MyCheck = A Or B			' Возвращает 10 (поразрядное сравнение).


www.ПЕРВЫЕ ШАГИ.ru :: Шаг 93 - Оператор Xor

Шаг 93 - Оператор Xor

Выполняет операцию исключающего ИЛИ для двух выражений.

[результат =] выражение1 Xor выражение2

Параметры
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.

Замечания
Если одно и только одно из выражений истинно (имеет значение True), результат имеет значение True. Если хотя бы одно из выражений имеет значение Null, результат также имеет значение Null, Если ни одно из выражений не имеет значение Null, результат определяется следующим образом:

выражение1	выражение2	результат
True		True		False
True		False		True
False		True		True
False		False		False

Оператор Xor выполняет также поразрядное сравнение двух выражений и присваивает соответствующему разряду в переменной результат следующее значение:

Разряд в выражение1	Разряд в выражение2	результат
0			0			0
0			1			1
1			0			1
1			1			0

Пример
В данном примере демонстрируется использование оператора Xor для выполнения операции исключающего ИЛИ для двух выражений.

Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null	' Инициализирует переменные.
MyCheck = A > B Xor B > C		' Возвращает False.
MyCheck = B > A Xor B > C		' Возвращает True.
MyCheck = B > A Xor C > B		' Возвращает False.
MyCheck = B > D Xor A > B		' Возвращает Null.
MyCheck = A Xor B			' Возвращает 2 (поразрядное сравнение).
Предыдущий Шаг