Access vba открыть форму
Access vba открыть форму
Есть процедурка, она открывает (docmd.openform) формочку на которой пользователь может нажать одну из трёх кнопочек, допустим: «да», «нет», «отмена».
Нажатие на одну из кнопочек приводит к закрытию формы (docmd.close)
Как же узнать какую кнопочку нажал пользователь и использовать эту информацию в открывшей форму процедуре?
Как передать из закрывающейся формы эти данные?
Не засовывать же какое-нибудь значение соответствующее конкретной кнопке в таблицу из которой потом и брать его для процедуры. Как-то это не то.
Да и процедура, вызвавшая форму, не будет ждать закрытия формы, дабы получить от неё результат, а побежит себе далее прямо к end sub.
П.С. Форма создана штатными средствами акцесса, т.к. не умею сделать её программно. Точнее не могу сообразить как мне вновь созданную форму на экран-то вывести? Ни метода activate, ни show ничего у неё нет.
Вызвавшую процедуру можно «завесить», например так:
————————————————
Sub DelayForm(FNam As String)
‘ Процедура приостанавливает выполнение модуля формы
‘ на время работы другой формы
Dim F As Form
Dim L As Long
Dim B As Boolean
Do
‘ Пауза в 1 сек для работы другой формы
L = Timer
Do While Timer код: Теперь пусть есть форма, откуда надо открыть первую форму, передать в неё параметр(-ы), получить обратно. На форме есть надпись Label0 и кнопка Command1. Модуль формы: код:
selfexile
передать массив — не желает кушать массив, только строки, говорит, люблю. А вот это плохо!
массив строк?
по идее должен «кушать»
Lucy
А вдруг мне 2 биллиона символов не хватит?
На счёт «кушать», в справке указано, что только строку и можно передать в openargs. Или я чего со своим недоанглийским плохо понимаю? А то мне несколько строк (массив) нужно передать в форму, так, что я их через за. через таблицу передаю пока что. А это как-то некрасиво выходит. Функция получает массив, запихивает его в таблицу sql-запросом, запускает форму, та работает с полями этой таблицы, затем форма закрывается и функция, продолжая работу, запихивает данные из таблицы обратно в массив (переданный в эту функцию byref) при помощи ado.recordset. Качмар!
Бенедикт
Примем к сведению. Распечатаем и попробуем вникнуть/разобраться.
————————————-
У меня вот теперь какая-то ерунда с формой появилась. Открывается она с where condition nomer=1, а ей по барабану! Она УПОРНО создаёт мне новую запись в таблице к которой привязана, чтоб её разворотило, а мне нужно редактировать ЕДИНСТВЕННУЮ запись в таблице и чтобы никаких новых записей не появлялось ни в коем случае. Эта единственная запись и имеет поле nomer = 1. Ничего не пойму!
Добавление от 25.11.2008 07:39:
Сделал для этой формы набор записей «статический»
Фильтр сработал. Открылась нужная запись, а не новая. Только теперь поля для ввода не дают изменять данные — булькают, типа поле недоступно для редактирования.
Добавление от 25.11.2008 08:13:
Тьфу! Тьфу! Тьфу! Тьфу! Тьфу!
Пардон, я сейчас вытру страничку.
В свойствах формы было указано «ввод данных — да», оказывается это означает, что форма будет открываться ИМЕННО для новой записи. А я думал, что это означает разрешение на ввод данных вообще в поля формы.
П.С. Ненавижу изучать языки-среды разработки! Люблю пользоваться уже имеющимися данными. Сколько времени уходит на какую-нибудь ерундень вроде этой.
Даёшь загрузку знаний прямо в мозг!
selfexile
в справке указано, что только строку и можно передать в openargs
читаем справку (http://www.datawright.com.au/access_resources/access_docmd.openform_arguments.htm) :
«OpenArgs — type Variant.
A string expression. This expression is used to set the form’s OpenArgs property. This setting can then be used by code in a form module , such as the Open event procedure . «
с другой стороны, тип Variant — структура, которая может содержать различные типы данных, в том числе и массив:
Value Variant type
0 Empty (unitialized)
1 Null (no valid data)
2 Integer
3 Long Integer
4 Single
5 Double
6 Currency
7 Date
8 String
9 Object
10 Error value
11 Boolean
12 Variant (only used with arrays of variants)
13 Data access object
14 Decimal value
17 Byte
36 User Defined Type
8192 Array
код: VarType(arr) должна возвратить 8192.
поэтому, что-то вроде
код: может работать
Lucy
А зачем мне проверять массив ли получила форма через openargs?
Я, находясь в трезвом уме и твёрдой памяти, ответственно заявляю, что МОЯ форма посредством openargs НИКОГДА ничего кроме массива определённой мною размерности и типа НЕ получит.
А массив я пытался передать. Не получается. По-моему на несоответствие типов и ругается, не помню сейчас.
selfexile
Я, находясь в трезвом уме и твёрдой памяти, ответственно заявляю, что
пройдет время, кто-то захочет что-то поменять, что у Вас было/есть в памяти ему будет неинтересно. etc.
12.5 Работа с формами Access из VBA (объект Form )
Объект Access.Form, работа с формами Access средствами VBA, открытие формы Access, работа с элементами управления на форме Access
Один из важнейших элементов Access, который широко используется в приложениях — это формы. Формы Access предназначены для того же, для чего и обычные формы VBA — это прежде всего контейнеры для графических элементов управления. Но устройство форм Access, их функциональные возможности, приемы работы с ними и даже наборы элементов управления, которые на них можно размещать, сильно отличаются от привычных нам форм VBA, которые можно использовать в Word и Excel.
Формы Access используются:
- Для редактирования записей в таблицах базы данных Access и внешних источников данных. Для того, чтобы создать такие формы, вообще не нужно никакого программирования — достаточно создать форму в режиме конструктора или воспользоваться мастером создания форм. Подключиться к внешнему источнику данных (например, базе данных SQL Server или Oracle) можно, воспользовавшись в Access меню Файл ->Внешние данные ->Связь с таблицами.
- Как панели управления вашего приложения. Очень часто в приложении на основе Access создается начальная форма, которая открывается при запуске этого приложения. На этой формы предусмотрены кнопки и другие элементы управления для вызова других форм, отчетов, макросов, выхода из приложения и выполнения прочих операций. После закрытия других форм управления опять передается начальной форме.
- Просто для предоставления пользователю возможности выполнения любых действий. Например, форму можно использовать для выбора пользователем параметров отчета, выгрузки данных во внешнее приложение (например, Excel) и т.п.
Как работать с формами Access из VBA?
Первое, что необходимо сказать — для работы с формами во многих ситуациях нам придется использовать общий объект AccessObject, который представляет в Access не только формы, но и таблицы, макросы, модули, отчеты и множество других элементов. Поскольку этот объект — универсальный, то, конечно, большой помощи от Intellisense — подсказки в редакторе VBA у нас не будет. Обратиться к объекту формы можно через коллекцию AllForms, которая доступна через объекты CodeProject и CurrentProject. Например, получить информацию о всех формах в базе данных Access можно так:
Dim oA As AccessObject
For Each oA In CurrentProject.AllForms
Если вы будете обращаться к формам в коллекции AllForms по индексу, обратите внимание, что нумерация форм в этой коллекции начинается с 0. Обращаться к элементам в этой коллекции можно и по имени:
Специальное свойство IsLoaded определяет, открыта ли эта форма (то есть загружена ли она в оперативную память).
Программным образом формы можно найти и другим способом. Все открытые формы Access автоматически помещаются в коллекцию Application.Forms и представляются в виде объекта Form. Это — уже нормальный объект, свойства которого соответствуют свойствам формы, доступным через графический интерфейс. Например, если форма Форма1 открыта, получить информацию о ее ширине можно так:
Debug.Print Application.Forms(«Форма 1»).Width
Это свойство можно использовать и для изменения ширины формы, но для этой цели рекомендуется использовать метод DoCmd.MoveSize(), который изменяет размеры активного объекта (например, нашей формы, если она активна):
DoCmd.MoveSize Width :=10000
Еще одна возможность: если вы работаете с кодом самой формы или ее элементов управления (например, события Click кнопки, которая расположена на форме), то обратиться к объекту самой этой формы можно совсем просто. Для этого используется ключевое слово Form.
Как можно открыть форму?
Первое, что нужно сказать — если в Word или Excel нам обязательно потребуется открыть форму программным способом, то в Access это совсем необязательно. Можно открыть форму и вручную из окна базы данных (см. рис. 12.1). Из этого же окна обычно производится создание новых форм или изменение существующих.
Рис. 12.1 Окно для работы с формами в Access
Еще один часто используемый способ — просто запускать форму при открытии базы данных Access. Для этого в меню Сервис нужно выбрать Параметры запуска и выбрать нужную форму в списке Вывод формы/страницы. Если при этом вы уберете все остальные флажки, то приложение при открытии приложение может выглядеть так, как показано на рис. 12.2:
Рис. 12.2 Все лишние возможности Access спрятаны от пользователя
Окно базы данных будет скрыто от пользователя, а это значит, что пользователь не сможет получить информацию ни о таблицах нашей базы данных, ни о других формах, ни о модулях — все служебные элементы базы данных будут от него спрятаны. В принципе, пользователь может обойти такую защиту, держа нажатой при запуске Access кнопку , но программным способом можно закрыть и такую возможность.
Если все-таки нужно открыть форму программным способом (например, из другой формы), то для этой цели можно использовать метод DoCmd.OpenForm(). В самом простом варианте этот метод просто принимает параметр с именем формы:
Если же форма уже открыта, то этот метод, конечно, не открывает форму заново, а просто активизирует ее. Метод DoCmd.OpenForm() принимает также несколько необязательных параметров, при помощи которых вы можете настроить фильтр на отображение записей в форме, режим открытия формы (например, модальность) и т.п. Закрытие формы производится при помощи метода DoCmd.Close(). Если же вам нужно просто спрятать форму, чтобы сохранить введенные на ней пользователем значения и отобразить их при следующем показе, можно просто сделать форму невидимой, назначив ее свойству Visible значение False.
Форма нам обычно нужна не сама по себе, а как контейнер для расположенных на ней элементов управления. Обычно элементы управления программным способом создавать не требуется — намного проще и удобнее поместить их на форму в режиме конструктора для формы. В наборе элементов управления для формы предусмотрены как знакомые нам элементы управления — текстовые поля, надписи, кнопки, флажки и переключатели, так и новые элементы — свободная и присоединенная рамки объектов, разрывы страниц, подчиненные формы/отчеты и т.п. В верхнем правом углу Toolbox в конструкторе формы Microsoft Access находится специальная кнопка Мастера. Если она нажата, то добавление на форму привычных элементов управления (например, кнопки) приведет к появлению окна мастера, который попытается помочь вам автоматически сгенерировать нужный код VBA для этого элемента управления (см. рис. 12.3)
Рис. 12.3 Мастер создания кнопок
Можно использовать генерируемый мастером код как заменитель макрорекордера (которого в Access нет), чтобы понять, как можно выполнить те или иные действия.
Для чего используются нестандартные (по отношению к обычным формам VBA) элементы управления:
- Свободная рамка объекта — возможность разместить на форме OLE-объект (например, документ Word, лист Excel, презентация PowerPoint, рисунок, звукозапись или видеоклип), который может быть встроен в базу данных Access (но не помещен в таблицу!) или находиться во внешнем по отношению к базе данных Access файлу.
- Присоединенная рамка объекта — то же самое, за исключением того, что он применяется для работы с объектами OLE, которые хранятся в таблицах внутри баз данных Access или внешнего источника данных. Это — самый удобный способ генерации отчетов в Word.
Например, предположим, что в нашей базе данных Access находится таблица с тремя столбцами, как показано на рис. 12.4.
Рис. 12.4 Таблица для хранения шаблонов Word
В столбце File у нас хранятся шаблоны Word, которые используются для генерации отчетов. Мы помещаем на форму элемент управления Присоединенная рамка объекта с именем WordTemplate. После этого все, что нужно для создания файла Word на основе шаблона из базы данных, у нас уже есть. Для кнопки, по нажатию на которой будет формироваться отчет, можно использовать следующий код:
‘Получаем ссылку oFrame на объект присоединенной рамки на форме
Dim oFrame As BoundObjectFrame
Set oFrame = oForm.Controls(«WordTemplate»)
‘При помощи метода DLookup () скачиваем в него значение столбца File из таблицы
‘Templates, где номер строки (значение столбца Num ) равно 1
oFrame = Application.DLookup(«[File]», «Templates», «[Num] = 1»)
‘Открываем объект в отдельном окне приложения — то есть создаем
‘документ Word на основе шаблон, загруженного в рамку объекта на форме
‘Активизируем объект приложения
‘Получаем ссылку на Word в переменную oWord
Dim oWord As Word.Application
Set oWord = GetObject(, «Word.Application»)
‘Получаем ссылку на созданный нами документ
Dim oDoc As Word.Document
Set oDoc = oWord.ActiveDocument
‘Дальше работаем средствами Word, например, вставляем нужный текст
‘в места, отмеченные закладками
Конечно же, правильнее будет при этом сделать эту присоединенную рамку объекта на форме изначально невидимой — чтобы пользователь не мог этот объект активизировать по собственной инициативе.
- Элемент управления Разрыв страницы — определяет начало нового экрана формы.
- Подчиненная форма/отчет — используется для размещения на форме подчиненных форм, таблиц или отчетов.
Как уже говорилось, программным способом элементы управления в форме Access приходится создавать редко. Если на форме вам нужен переменный набор элементов управления, то правильнее будет с самого начала создать все нужные элементы управления и по необходимости делать их то видимыми, то невидимыми. Тем не менее создать программным способом элементы управления на форме тоже можно. Эта операция выполняется при помощи метода Application.CreateControl(), который принимает множество параметров — имя формы, на которой создается элемент управления, тип элемента управления, его месторасположение на форме и т.п.
Обращение к значениям элементов управления на форме производится через коллекцию Controls, которая умеет работать с именами элементов управления:
Макрокоманда «ОткрытьФорму»
Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).
Вы можете использовать макрокоманду » ОткрытьФорму » в Access для открытия форма в представление формы, Конструктор, режиме предварительного просмотра или Режим таблицы. Вы можете выбрать режим ввода данных и режимы окон для формы и ограничить записи, отображаемые формой.
Примечание: Макрокоманда «ОткрытьФорму» недоступна в веб-приложениях Access.
Настройка
Аргументы макрокоманды ОткрытьФорму описаны ниже.
Имя формы, которую нужно открыть. В раскрывающемся списке Имя формы указаны все формы текущей базы данных. Это обязательный аргумент.
При выполнении в база данных библиотеки макроса, содержащего макрокоманду ОткрытьФорму, Access ищет форму с этим именем сначала в базе данных библиотеки, а затем в текущей базе данных.
Представление, в котором будет открываться форма. Выберите в поле Режим значение Форма, Конструктор, Предварительный просмотр, Таблица, Сводная таблица или Сводная диаграмма. По умолчанию используется Форма.
Примечание: Представления сводной таблицы и сводной диаграммы были удалены из Access, начиная с Access 2013.
Примечание: Значение аргумента Режим переопределяет параметры свойств формы DefaultView и ViewsAllowed. Например, даже если свойству формы ViewsAllowed присвоено значение Таблица, можно использовать макрокоманду ОткрытьФорму для открытия формы в представлении формы.
фильтр, который ограничивает или сортирует записи формы. Вы можете ввести имя либо существующий запрос, либо фильтр, сохраненный в виде запроса. Тем не менее, запрос должен содержать все поля в форме, которые вы открываете, или свойство » вывод «, для которого задано значение «Да».
Допустимое предложение WHERE SQL (без слова WHERE) или выражение, которое Access использует для выбора записей из базовой таблицы или запроса формы. Если выбрать фильтр с аргументом Имя фильтра, Access применит это предложение WHERE к результатам фильтрации.
Для открытия формы и ограничения записей в ней на основе значения элемента управления, находящегося в другой форме, используйте следующее выражение:
[ имя_поля ] = Forms![ имя_формы ]![ имя_элемента_управления _в_другой_форме ]
Замените имя_поля именем поля базовой таблицы или запроса формы, которую вы хотите открыть. Замените имя_формы и имя_элемента_управления_в_другой_форме именем другой формы и именем элемента управления, содержащего значение, которому должны соответствовать записи в первой форме.
Примечание: Максимальная длина аргумента Условие отбора равна 255 символам. Если необходимо ввести более сложное и длинное предложение WHERE, вместо этого используйте метод ОткрытьФорму объекта DoCmd в модуле Visual Basic для приложений (VBA). VBA позволяет вводить предложения WHERE SQL длиной до 32 768 символов.
Режим ввода данных для формы. Применим только для форм, открытых в режиме формы или таблицы. Возможные варианты значений: Добавление (пользователь может добавлять новые записи, но не может редактировать существующие), Изменение (пользователь может редактировать существующие записи и добавлять новые) или Только чтение (пользователь может только просматривать записи).
Значение аргумента Режим данных переопределяет значение свойств формы AllowEdits, AllowDeletions, AllowAdditions и DataEntry. Например, даже если свойство формы AllowEdits имеет значение Нет, можно открыть форму в режиме редактирования с помощью макрокоманды ОткрытьФорму.
Если этот аргумент оставить пустым, то Access откроет форму в режиме ввода данных, определяемом свойствами AllowEdits, AllowDeletions, AllowAdditions и DataEntry.
Режим окна, в котором открывается форма. Возможные значения: Обычное (форма открывается в режиме, определяемом ее свойствами), Скрытое (форма скрыта), Значок (форма свертывается и отображается в виде небольшого заголовка окна в нижней части экрана) или Диалоговое окно (для свойств Modal и PopUp формы задается значение Да). По умолчанию используется значение Обычное.
Примечание: Некоторые значения аргумента Режим окна неприменимы, если используются документы со вкладками. Чтобы переключиться в режим перекрывания окон:
Откройте вкладку Файл и выберите пункт Параметры.
В диалоговом окне Параметры Access щелкните элемент Текущая база данных.
В разделе Параметры приложений в группе Параметры окна документа выберите параметр Перекрывание окон.
Нажмите кнопку ОК, а затем закройте и снова откройте базу данных.
Замечания
Эта макрокоманда аналогична двойному щелчку формы в области навигации или ее щелчку правой кнопкой мыши в области навигации и выбору представления.
Форма может быть модальный (ее необходимо закрыть или скрыть, прежде чем пользователь сможет выполнять какие-либо другие действия) или немодальные (пользователь может перемещаться в другие окна, пока открыта форма). Это также может быть всплывающая форма (форма, используемая для сбора и отображения данных, которые остаются в верхней части других окон Access). Свойства модальных и всплывающих окон задаются при разработке формы. Если для аргумента » режим окна » используется значение » обычный «, форма открывается в режиме, указанном в параметрах этого свойства. Если вы используете диалоговОе окно для аргумента режим окна , для этих свойств задано значение «Да». Форма, открытая как скрытая или в виде значка, возвращается к режиму, заданному параметрами ее свойств при ее отображении или восстановлении.
При открытии формы с аргументом Режим окна, имеющим значение Диалоговое окно, Access приостанавливает работу макроса, пока форма не будет закрыта или скрыта. Форму можно скрыть, установив с помощью макрокоманды ЗадатьЗначение значение Нет для ее свойства Visible.
Применяемые фильтр и условие WHERE становятся значением свойства Filter формы.
Совет: Вы можете выбрать форму в области навигации и перетащить ее в окно макроса. При этом автоматически создается макрокоманда «ОткрытьФорму», открывающая ее в представлении формы.
Пример
Задание значения элемента управления в форме с помощью макроса
Следующий макрос открывает форму «Товары» с помощью кнопки в форме «Поставщики». Он демонстрирует применение макрокоманд ВыводНаЭкран, ОткрытьФорму, ЗадатьЗначение и КЭлементуУправления. Макрокоманда ЗадатьЗначение задает в качестве значения элемента управления «Код поставщика» в форме «Товары» текущего поставщика в форме «Поставщики». После этого макрокоманда КЭлементуУправления перемещает фокус на поле «Код категории», с которого начинается ввод данных для нового товара. Этот макрос должен быть привязан к кнопке «Добавить товары» в форме «Поставщики».
Archie Goodwin
Авторизация
Рубрики блога
- Public / Общие темы
- Новость + Мнение
- Размышления
- Уроки или советы
- Это интересно
- Юмор
- Креатив
- Рецензия
- Личность
- Притчи, истории
- Новости сайта
- Special / СпецРубрики
- Записки вебмастера
- Вопрос дизайна
- Мой ПК
- MS Office и VBA
- Прочие офисные программы
- Diary / Личный дневник
- Дневник
Рекомендуем
Последние комментарии
Облако тегов
Устами великих
Реклама
Форма входа (MS Access)
Суть в том, что бы создать форму выскакивающую при входе, в которой бы были поле выпадающего списка для выбора сотрудника, поле для ввода пароля и соответственно кнопка «ОК». Но это не просто форма для безопасности. Еще должна быть привязка к должности пользователя. Так, после подтверждения правильности ввода данных, должна открываться форма со множеством подчиненных форм и кнопок на отчеты и запросы, при чем эта форма должна быть разной для каждой должности. Таким образом, получается что будет создан пользовательский интерфейс при этом не закрывая, так сказать, исходный код, но по большому счету, любому пользователю будет незачем просматривать все отчеты, фомы и запросы базы в поисках непонятно чего, так как у него все будет нужно у него перед глазами.
Самое первое что нужно, так это таблица с сотрудниками (или пользователями) со столбцами где указаны их имя, должность и пароль.
Потом создаем новую форму с помощью конструктора. Внешне можно настраивать как угодно, но обязательно должно быть поле с выпадающим списком, текстовое поле для ввода пароля и кнопка подтверждения. Вот что получилось у меня
Чтобы форма открывалась сразу же при запуске базы данных, необходимо
Соответственно для поля выпадающего списка нужно сделать привязку «источника строк» к полям таблицы «Персонал» (ну или пользователи) и выбрать такие поля как ID (уникальный номер для каждого сотрудника), Имя (в нашем случае поле называется ФИО) и Должность
При желании можно также выставить сортировку по интересующему полю, либо по ID, тогда пользователи будут отображаться по мере поступления на работу, можно по Имени, а можно сделать сортировку по должностям.
Далее выделяем кнопку «ОК» в конструкторе и ищем поле в событиях «Нажатие кнопки», выбирая [Процедура обработки событий] переходим в Visual Basic и прописываем следующий сценарий для кнопки, который будет работать по клику:
PS код уже с комментариями относительно его содержания
Собственно как бы все, задумка реализована. Теперь чтобы создать действительно пользовательский интерфейс нужно создать актуальные и необходимые формы для каждой должности и вставить в необходимую часть кода указанного выше.
Не получается. Выдает ошибку, что операция не поддерживается для обьектов этого типа.
Проблемная строка:
.FindFirst («ID=» & Me.cboCurrentEmployee.Value)
Решение найдено!
в 5 строке добавляем dbOpenDynaSet
Private Sub cmdLogin_Click()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset(«Сотрудники», dbOpenDynaSet )
With rst
If IsNull(Me.cboCurrentEmployee.Value) Then
MsgBox «Ошибка входа! Выберите пользователя.»
Exit Sub
О сайте
«Понемногу обо всем и все, о немногом» — именно такой слоган, по-видимому, является наилучшим определением тематики блога. Здесь пишу о том, что для меня интересно или важно, собственно, поэтому разброс тематик очень широк – от размышлений на философские темы и смешных историй, до конкретных инструкций или анализа событий.
Правда, помимо общих тематик, которые есть почти на каждом личном блоге, стоит выделить специализированные рубрики блога, которые будут полезны и интересны вебмастерам, программистам, дизайнерам, офисным работникам и пользователям ПК, желающим повысить свои навыки и уровень знаний. Подробнее о спецрубриках
Записки вебмастера – рубрика, которая призвана собрать коллекцию полезных скриптов и авторских решений, интересных особенностей и стандартов верстки, решение вопросов юзабилити и функционала, полезных ресурсов и программ.
Вопрос дизайна – это актуальные тренды, пошаговые и видео-уроки в фотошопе, необходимые плагины для фоторедакторов, векторные и PSD исходники, PNG иконки и GIF анимации, кириллические шрифты с засечками и без засечек, заливки (паттерны) и градиенты.
Мой ПК – каждая статья в этой рубрике направлена на то, чтобы узнать свой компьютер лучше. Здесь можно будет почитать о системных процессах и редактировании системного реестра, о способах защитить личные данные и компьютер в целом, о настройке локальной сети и подключениях к сети интернет, обзор ряда программ, которые делают работу за компьютером удобнее, быстрее и приятнее.
MS Office и VBA – эта рубрика содержит интересные решения, малоизвестные функции и возможности, надстройки и макросы, в общем, все то, что может сделать вашу работу в пакете программ MS Office (в первую очередь — Excel, Word, Access, PowerPoint) более эффективной.
Прочие офисные программы – рубрика о программах для ведения учета (конфигурации, платформы, внешние отчеты для 1C), сдачи отчетности (MeDoc, БестЗвіт) и статистического анализа данных (SPSS), также здесь можно найти обзоры программного обеспечения для работы с периферийными устройствами. Свернуть
VBA для чайников (90 стр.)
Сами по себе формы и отчеты VBA не способны взаимодействовать с базами данных, но написать код для связывания формы данных вручную не так уже сложно. Кроме а того, вы можете приобрести Office Developer или другие инструментальные средства от сторонних производителей, которые позволят связать формы и элементы управления с данными. Вы можете также переслать результаты своей работы непосредственно в другие VBA-приложения, так как они не зависят от форм Access.
* Visual Basic (не VBA). Visual Basic- это восхитительный инструмент для разработки баз данных. Написанный вами код на Visual Basic может через ADO подключаться к базам данных, как и при использовании VBA, однако формы Visual Basic напрямую поддерживают работу с базами данных, точно так же, как и формы Access. Программа, созданная с помощью Visual Basic, обладает двумя значительными преимуществами перед программой, созданной с помощью VBA-приложения, такого как Word или Excel. Во-первых, она быстрее работает, так как программы, написанные на Visual Basic, компилируются, а не интерпретируются при каждом выполнении, как программы, созданные с помощью VBA. Во-вторых, вы можете свободно распространять программы: конечным пользователям не понадобится базовое VBA-приложение с помощью которого оно было создано.
Программирование баз данных с помощью Access
Прежде чем вы приступите к программированию базы данных в Access, вам следует ознакомиться со всеми отличиями Access от остальных VBA-приложений. Эти различия осложняют перевод программы, созданной с помощью Access, в другое VBA-приложение.
* Формы Access несовместимы со стандартными пользовательскими формами VBA и формами Visual Basic. Если вы решите, что ваша программа будет лучше работать в другом VBA-приложении, вам придется создавать все формы заново.
* Access включает полностью независимую систему программирования баз данных с помощью VBA, которая базируется на использовании объекта DoCmd. Объект DoCmd содержит все команды, доступные в меню Access. Используя этот объект, вы сможете открывать таблицы, выполнять запросы и отчеты, отображать формы, забавляться с пользовательским интерфейсом. другими словами, выполнять все действия, доступные пользователю, сидящему перед компьютером.
Если вы опытный пользователь Access, но не имеете ни малейшего опыта программирования, объект DoCmd позволит вам постепенно перейти к использованию VBA. Однако этим объясняется и определенная проблема: объект DoCmd жестко привязывает вас к Access. Если же вы изучите стандартный VBA, вы сможете очень легко перейти к другим средам разработки Visual Basic.
Даже если вы выберете «чистый» VBA, вы все равно не обойдетесь без объекта DoCmd при создании программ в рамках Access. Возможно, в связи с тем, что формы Access не являются стандартными формами VBA, для отображения формы в VBAпрограмме Access вам придется использовать не стандартный метод Show, а метод OpenForm объекта DoCmd.
Написание кода базы данных с помощью ADO
Хотя проектирование правильных SQL-инструкций может оказаться сложным, написание кода базы данных с помощью ADO оказывается совсем несложной задачей. Вам необходимо освоить работу всего с тремя объектами: Connection, Recordset и Command; их методы и свойства реализованы достаточно логично.
Обработка ошибок
Из-за ограниченного объема главы я не могу подробно остановиться на рассмотрении такого чрезвычайно важного вопроса, как обработка ошибок. Однако очень важно включить код обработки ошибок в каждую процедуру базы данных. Подробные сведения о написании кода обработки ошибок на VBA изложены в главе 9.
Добавление ссылки на ADO
Прежде чем вы сможете использовать ADO и ее объекты в VBA-программе, вы должны сначала добавить в своем проекте ссылку на библиотеку объектов ADO. В окне редактора Visual Basic выберите команду Tools=References, после чего установите флажок напротив Microsoft ActiveX Data Objects 2.x Library (на момент написания книги последней версией была 2.5).
Вашей первоочередной задачей при необходимости доступа к источнику данных (базе данных или другому репозитарию данных) станет установка соединения с ним. Для организации подключения между вашей программой и данными предназначен объект Connection.
Это очень важно! Если вы используете Access для написания ADO-кода для ядра базы данных Jet, вам не нужно создавать объект Connection для работы с базой данных Jet, уже открытой в Access, так как Access автоматически выполняет подобные действия за вас. Для обращения к базе данных используйте свойство Connection объекта Current Project программы Access. Это позволяет сделать, например, приведенный ниже фрагмент кода:
Dim conADOConnection As Connection
Set conADOConnection = Current Project.Connection
Кроме того, вы можете легко установить подключение с базой данных SQL Server в проекте Access, если вы пишете код VBA в этом же проекте. В этом случае вам необходимо использовать свойство BaseConnectionString объекта Current Project, как показано ниже:
Dim conADO Аз New Connection
В других ситуациях вам придется создавать объекты Connection самостоятельно. Для создания объекта Connection просто объявите имя переменной для объекта, после чего откройте подключение. Метод Open получает в качестве аргумента строку подключения, содержащие различные параметры, которые определяют используемое средство доступа OLE DB Provider и источник данных, с которым вы работаете. Либо же, вы можете сначала задать свойства объекта Connection, соответствующего элементам строки подключения, после чего уже использовать метол Open. Изучите приведенные ниже примеры эквивалентных инструкций, которые создают объект Connection для одной базы данных Jet:
Dim. conADOConnection As New Connection, strConnect As String
strConnect = «Provider=Microsoft.Jet.OLEDB.4.0; » _
Dim conADOConnection As New Connection
.Properties(«Data Source») = «=C:DataToys»
Параметры, необходимые методу Open, зависят от используемого вами средства доступа OLE DB Provider; обратитесь к справочной системе, Web-узлу компании Microsoft или документации по Office Developer для получения подробных сведений. Ниже приведен соответствующий пример для SQL Server:
Dim conADOConnection As New Connection
Dim strConnect As String
strConnect = «Provider=SQLOLEDB; Data Source* Hecate;» _
Если вы работаете в Access, ADO нельзя назвать универсальным решением по управлению данными. Проекты Access могут взаимодействовать только с базами данных SQL Server, но ни с какими другими средствами доступа OLE DB Provider. Кроме того, использование Access VBA для создания подключений к базе данных SQL Server требует различных параметров, используемых в других средах разработки. В Access свойству Provider должно быть присвоено значение MSDataShape, а свойству DataProvider следует присвоить значение SQL0LILD3.
ADO позволяет вам работать с объектами баз данных, обходясь без предварительного создания объекта Connection: вы можете связать эти объекты с подключением только тогда, когда придет время заполнить их реальными данными. Либо же вы можете создать подключение неявно в процессе определения объекта Recordset или Command. Однако создание объекта Connection явным образом упрощает ваш код и позволяет связывать одно подключение с несколькими другими объектами.
Работа с объектами Recordset
Давайте поближе познакомимся с объектами Recordset: вы используете при выполнении фундаментальных операций с данными. Объект Recordset — это контейнер, содержащий данные, полученные из источника данных. Как и положено контейнеру, один объект Recordset может содержать различные записи в разное время.
После того как вы объявили переменную для объекта Recordset, вы можете немедленно приступить к работе с его свойствами. Однако, в этот момент он существует только «виртуально». Для заполнения пустого контейнера реальными данными прибегните к одному из следующих приемов:
* собственный метод Open объекта Recordset;
* метод Execute объекта Command;
* метод Execute объекта Connection.
Простейший способ создания объекта Recordset — использование метода Open этого самого объекта. Метод Open хорошо работает в том случае, если вы используете простые инструкции Select для получения необходимых записей. Следующий фрагмент кода демонстрирует настройку объекта Recordset с помощью метола Open:
Dim conman As New Connection
Dim rstMan As Recordset
Dim strSQL As String
. (здесь содержится код, используемый для создания объекта подключения conMan) strSQL = «SELECT * FROM Toys» ‘ выбор всей таблицы Toys
Set rstMan.ActiveConnection = conman
rstMan.Open strSQL,, adOpenForwardOnly, adLockReadOnly, _
Обратите внимание на то, что приведенный выше фрагмент кода связывает подключение с объектом Recordset с помощью свойства ActiveConnection последнего. Кроме того, обратите внимание на то, что параметры, управляющие поведением объекта, указаны в качестве аргументов метода Open.