Vvmebel.com

Новости с мира ПК
8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Обновить форму access vba

Обновление данных в формах и элементах управления

Последняя группа макрокоманд в рассматриваемой категории связана с обновлением данных в активных формах, таблицах и запросах. Если несколько человек в сети одновременно изменяют данные, то формы и таблицы у конкретного пользователя могут не отражать актуальных данных. Для того чтобы отображаемые данные соответствовали текущему состоянию базы данных, их необходимо обновить с помощью команды Записи, Обновить (Record, Refresh) (см. разд.Работа с записями гл. 2).

Похожая ситуация возникает даже в однопользовательском режиме, если в форме используется поле со списком, источником данных для которого является таблица или запрос. Если в исходную таблицу были добавлены записи, то в поле со списком они автоматически не появятся — нужно повторно выполнить запрос. Кроме полей со списком, к элементам управления, требующим обновления отображаемых данных, относятся также списки и элементы управления подчиненной формы, объекты OLE и вычисляемые элементы управления, содержащие статистические функции по подмножеству записей, такие как DLookUp () или DSum ().

Для того чтобы выполнить обновление записей в формах, таблицах или элементах управления, используются макрокоманды Обновление(Requery), ПоказатьВсеЗаписи(ShowAllRecords) И ОбновитьОбъект(RepaintObject).

Макрокоманда Обновление (Requery) обновляет данные в объекте базы данных путем повторного просмотра источника данных. Макрокоманда имеет один аргумент, содержащий имя объекта, который следует обновить. Если обновляется активный объект, например форма, то поле аргумента следует оставить пустым. При этом макрокоманда будет повторно выполнять запрос, указанный в свойстве Источник данных (RecordSource) этой формы.

Рассмотрим пример использования макроса для обновления данных. В форме «Клиенты» (Customers) есть поле со списком «Страна» (Country). Источником данных для этого поля является запрос, который выбирает значения из поля «Страна» (Country) таблицы «Клиенты» (Customers):

Если при вводе клиента в таблицу добавляется новое название страны, то в списке эта страна не появится, поскольку запрос будет выполнен повторно только при следующем открытии формы. Чтобы провести обновление списка стран раньше, следует назначить событию После обновления (After Update) формы макрос Клиенты.Обновление списка стран, который состоит из одной макрокоманды Обновление (Requery) со значением аргумента «Страна» (Country) (рис. 11.18).

Рис. 11.18. Назначение макроса событию формы После обновления

Замечание

Макрокоманда Обновление (Requery) обновляет только один объект, поэтому если в форме существуют элементы управления, требующие обновления отображаемых данных, и в макросе, назначенном этой форме, используется макрокоманда Обновление (Requery) с пустым значением аргумента, то обновляться будут только записи в форме. Для каждого такого элемента управления нужно использовать отдельную макрокоманду. Если эта макрокоманда в качестве аргумента содержит имя элемента управления, то при ее выполнении обновляется только данный элемент. Записи в самой форме не обновляются.

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

Макрокоманда ПоказатьВсеЗаписи (ShowAllRecords), как уже отмечалось, отменяет действие фильтра и повторно просматривает источник записей. Ее часто используют для обновления данных в подчиненной форме.

Макрокоманда ОбновитьОбъект (RepaintObject) применяется только к объекту базы данных (к таблице, запросу, форме, отчету, странице, макросу и модулю) и не применяется к элементу управления. Она выполняет немедленное обновление указанного открытого объекта (если имя объекта не задано, обновляется активный объект), хотя при этом не производится повторное выполнение запроса к источнику данных. Обновление объекта не влияет на. отображение новых и удаленных записей, как это происходит при выполнении макрокоманды Обновление (Requery). Обычно макрокоманду ОбновитьОбъект (RepaintObject) применяют для отображения результатов изменения данных с помощью макрокоманд ЗадатьЗначение (SetValue), а также для повторного вычисления значений выражений в вычисляемых элементах управления.

Обновить форму в access, когда форма не открыта с помощью VBA

Я разработал форму в Access, которая позволяет пользователям искать записи, соответствующие их параметрам. Форма содержит около пяти полей со списком, содержащих значения, которые пользователь может искать. Создается запрос, который извлекает значения из полей со списком. Связанная форма «F_FilterResults» выводит результаты запроса в виде таблицы данных, отображающей Результаты поиска. Я создал событие AfterUpdate для каждого поля со списком на «F_FilterResults», чтобы после обновления поля со списком с параметром поиска запрос и форма обновились. Вот пример кода из события AfterUpdate в полях со списком на «F_FilterResults».

Однако это работает только в том случае, если открыта форма «F_FilterResults». Когда он закрыт, я получаю сообщение об ошибке ‘2450’ во время выполнения, которое указывает, что «Microsoft Access не может найти указанную форму» F_Filter.»Как я могу запустить этот код, когда форма «F_Filter» не открыта? Примечание. Я не хочу, чтобы форма открывалась сразу после выбора параметра поиска из поля со списком, так как пользователь может захотеть добавить дополнительные параметры поиска в другие поля со списком. Если я запрограммирую «F_FilterResults», чтобы открыть при загрузке формы поиска пользователь может X из него и не будет знать, что означает сообщение об ошибке.

1 Ответ

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

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

Похожие вопросы:

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

Я пытаюсь открыть форму с помощью кнопки в другой форме. Форма с кнопкой, contracts_all form, имеет поле ID, и я хочу открыть форму, содержащую информацию с этим ID. Эта вторая форма, контракты.

Лучший способ проверить, открыта ли форма доступа и получить значение textbox с помощью Excel VBA. Я имею в виду, есть ли способ проверить, запущено ли приложение MS Access, и если оно затем.

Когда я пытаюсь записать содержимое таблицы из access to excel с помощью кода vba, когда книга уже открыта, я не вижу никаких обновленных данных. Есть ли для этого какая-то причина?

В Access я хотел бы открыть закрытую форму, прежде чем обновлять источник управления textbox в этой форме. У меня есть следующие коды VB. Но он застревает при обновлении controlsource, как только.

Я создаю приложение базы данных с использованием Access 2003, которое будет выполняться как автономное приложение (т. е. с использованием среды выполнения Access). У меня есть основная форма.

В настоящее время я пытаюсь в запросе MS Access (используя инструмент GUI, а не инструмент SQL) проверить, открыта ли конкретная форма или нет, без использования VBA. Используя следующее выражение .

Как обновить список таблиц с помощью vba в Access 2007 . Я делаю таблицу в коде Sql , используя vba : DoCmd.RunSQL SELECT * INTO table2 FROM table1, True RefreshDatabaseWindow DoCmd.TransferDatabase.

У меня есть форма индикатора прогресса. Я использую следующий код, чтобы включить и выключить его. Выключаю его с помощью .visible=false и Set object=ничего не работает, но форма все еще открыта в.

Как обновить подчиненную форму, управляемую отчетом (который управляется запросом), после добавления записей?

Недавно я занял ответственную должность, которая требует от меня отслеживать наши административные действия. Ранее офис отслеживал их в электронной таблице Excel, и исторические данные были повреждены/отсутствуют. Таким образом, я построил базу данных в Access 2010. Я разработал базу данных для отображения основной формы, которая предоставляет обзор каждого действия, но решил потребовать, чтобы большая часть данных добавлялась или обновлялась в конкретных формах ввода данных. Мой вопрос касается двух подформ в главной форме, которые я не могу обновить после ввода данных в таблицы. Вот особенности:

Читать еще:  Access left join

1) основная форма-это форма сведений о деле, и каждое дело имеет уникальный идентификационный номер дела, который связывает большинство форм и таблиц.

2) форма сведений о деле имеет две подформы. Отображаются имена людей, участвующих в деле (это Субформа субъект). В другом поле отображаются записи журнала обращений (это Подформа История обращений).

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

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

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

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

A) форма ввода данных субъекта имеет Me.Инструкция Requery в After Insert Event Procedure

B) форма ввода данных субъекта имеет SaveRecord и команду CloseWindow, которые выполняются при запуске события сохранить запись при нажатии кнопки.

В) Основная форма сведений о деле имеет значение Me.Case_Subjects.Форма.Requery при выполнении процедуры события GotFocus.

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

Обновить форму access vba

INSERT, UPDATE и DELETE — управление данными в таблицах прямым выполнением SQL инструкций.

В дополнение к DAO или ADO, Access предоставляет способ «прямого» управления данными в таблице прямым выполнением команд SQL — добавить данные (INSERT), обновить данные (UPDATE) и удалить данные (DELETE). Можно легко написать приложение, которое не будет использовать ни DAO, ни ADO, следовательно никаких «заморочек» со этими ссылками при распространении приложения на другие компьютеры сети у Вас не будет (конечно, источники записей форм должны быть связаны с таблицами).

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

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

У Access’a имеется метод .Execute, которому и требуется передавать заранее собранную SQL-строку для выполнения.

SQL [es kju:’el], [‘si:kwel] Structured Query Language: язык структурированных запросов, язык SQL. Вот не поленился и даже в транскрипции написал — как хотите, так и говорите. Указал специально, чтобы при чтении статьи у Вас закрепилось внутреннее произношение 😉

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

Сначала возьмем очень простой пример. Допустим, у нас есть справочная таблица tblРайоны, состоящая из всего двух полей:

КодРайона тип Счетчик

Район тип Текстовый

И у нас имеется форма, с текстовым полем txtРайон, значение из которого необходимо добавить (INSERT) в таблицу:

Код очень простой — сначала формируем текстовую строку и передаем ее методу .Execute:

Dim strSQL As String
‘ процедура добавления в таблицу нового района
strSQL = «INSERT INTO tblРайоны([Район]) VALUES » & _
«(‘» & Me.txtРайон.Value & «‘);»
CurrentDb.Execute strSQL

Сразу хочу обратить пристальное внимание на проверку передаваемого значения на NULL, если передать NULL (поле txtРайон не заполнено пользователем), то метод выполнится как ни в чем не бывало, но изменений в таблице tblРайоны не произойдет (не удивляйтесь потом, что ничего не работает ;).

Поэтому сразу будем делать правильно:

Dim strSQL As String
‘ процедура добавления в таблицу нового района
If Not IsNull(Me.txtРайон.Value) Then
strSQL = «INSERT INTO tblРайоны([Район]) VALUES » & _
«(‘» & Me.txtРайон.Value & «‘);»
CurrentDb.Execute strSQL

Else
MsgBox «Вы должны заполнить поле [Район]», vbExclamation, «Не указан район»
End If

Вот теперь и проверяем на NULL, заодно и пользователя целенаправленно предупреждаем.

Как видно из примера, полем типа Счетчик (КодРайона) мы управлять не можем, да и не надо нам это, Access самостоятельно управляет этим полем (автоматом наращивает значение).

Теперь начнем удалять (DELETE) запись из таблицы

Dim strSQL As String
strSQL = «DELETE [Район] from tblРайоны WHERE [Район] = » & Me.txtРайон.Value & «;»
CurrentDb.Execute strSQL

В общем-то код на удаление записи прост, но непроста будет реализация на практике: необходимо требовать от пользователя точного написания названия района (в текстовом поле), и если будет ошибка или опечатка, то инструкция выполнится, но ничего не произойдет (условие не будет соответствовать). Да и зачем пользователя нагружать писаниной, если эти значения уже записаны в таблице ? Логичней будет предложить выбрать из списка удаляемое значение (ну и спросить, конечно, уверен ли?) и, уже абсолютно точно зная искомое значение, удалить нужную запись. Это, конечно, уже из области проектирования интерфейсов, но при реализации данного метода все равно придется делать «правильно».

Лично я вижу удаление так: в форме создаем список из двух столбцов (первый столбец скрываем, зачем код записи пользователю видеть-то?), связанный с таблицей tblРайоны и где-нибудь рядом кнопку [Удалить], на событие [Нажатие кнопки] которой вешаем код

Dim strSQL As String
‘ процедура удаления из таблицы выбранного в списке района
If Not IsNull(Me.lstРайон.Column(0)) Then
strSQL = «DELETE [Район] from tblРайоны WHERE [КодРайона] = » & Me.lstРайон.Column(0) & «;»
CurrentDb.Execute strSQL
‘ обновим список
Me.lstРайон.Requery
Else
MsgBox «Выберите район из списка для удаления», vbExclamation, «Не выбран район»
End If

Мы считываем из первого столбца списка lstРайон.Column(0) (нумерация столбцов в списках всегда начинается с 0) код записи, однозначно определяющий удаляемую запись в таблице и передаем ее инструкции за удаление.
Проверка на NULL заодно позволяет предотвратить ошибку, когда вообще строка в списке районов не выделена. Обратите внимание на обновление списка районов после удаления записи — пользователю приятно видеть, что выбранный район пропал ;).

Читать еще:  Как удалить офис с мака полностью

Обычно я рисую список, текстовое поле (для указания новых или обновляемых значений) прямо над ним и три кнопки рядом со списком [Добавить], [Обновить], [Удалить]. Думаю, с реализацией таких интерфейсов у Вас не должно быть никаких проблем.

Заметьте, что Access автоматически удалит и поле счетчика КодРайона, что логично — сам наращивает, пусть сам и удаляет.

Строку на удаление можно подать и так:

strSQL = «DELETE * from tblРайоны WHERE [КодРайона] = » & Me.lstРайон.Column(0) & «;»

Звездочка (*) означает ВСЁ — всё, что есть в этой записи. Этот способ удаления отлично действует, когда полей в записи много — нет нужды указывать каждое удаляемое поле.

Ну и последний кит — инструкция на обновление (UPDATE)

Dim strSQL As String
‘ процедура обновления соответствующей записи в таблице
If Not IsNull(Me.txtРайон.Value) And Not IsNull(Me.lstРайон.Column(0)) Then
strSQL = «UPDATE tblРайоны SET [Район] = ‘» & Me.txtРайон.Value & «‘ WHERE [КодРайона] = » & Me.lstРайон.Column(0) & «;»
CurrentDb.Execute strSQL
‘ обновим список
Me.lstРайон.Requery
Else
MsgBox «Выделите район из списка, реквизиты которого необходимо изменить», vbExclamation, «Не выбран район для изменения»
End If

Раз у нас инструкция на обновление — необходимо проверять как поле txtРайон, в котором указано новое значение, так и строку в списке lstРайон (выбрана ли?). И, конечно, списочек обновить, чтобы изменения показать.

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

Теперь увеличим размер таблицы tblРайоны:

КодРайона тип Числовой

НаимПодразд тип Текстовый

ИндексПодразд тип Текстовый

ГородПодразд тип Текстовый

УлицаПодразд тип Текстовый

ДомПодразд тип Текстовый

КомПодразд тип Текстовый

ТелефонПодразд тип Текстовый

ПрефиксПротПодразд тип Текстовый

ПрефиксКвитПодразд тип Текстовый

НачальникПодраздЗвание тип Текстовый

НачальникПодраздФИО тип Текстовый

НачальникРУВДРайона тип Текстовый

РайонПоУмолчанию тип Числовой

Внушает ? Будем работать теперь с ней:

В этом примере мы сами управляем полем кода подразделения — с помощью агрегатной функции DMax вычисляем максимальное значение в столбце кодов таблицы tblРайоны и прибавляем единицу. Практически то же самое делает Access (если поле типа Счетчик), но есть большая разница, если мы удалим подразделение, то код удаленного подразделения Access повторно использовать не будет!. Объясню на пальцах: у нас было создано подразделение с автоматическим присвоением (счетчиком) кода с цифрой 3, потом мы его удалили, так вот, логично было бы следующему подразделению присвоить освобожденную цифру 3, нет Access присвоит уже цифру 4. Чтобы не допустить напрасного расходования кодов (и пропусков в списке) я и решил взять автоматическое присвоение кодов на себя.

Обратите внимание мы проигнорировали поле РайонПоУмолчанию. Ну проигнорировали и проигнорировали — значит туда ничего не будет записано.

Рекомендую оформлять такие длинные примеры именно по приведенной мною схеме — легче будет понять пример и выявить ошибку.

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

Dim strSQL As String

‘ процедура удаления из таблицы выбранного в списке подразделения
If Not IsNull(Me.lstПодразд.Column(0)) Then
strSQL = «DELETE * from tblРайоны WHERE [КодРайона] = » & Me.lstПодразд.Column(0) & «;»
CurrentDb.Execute strSQL
‘ обновим список
Me.lstПодразд.Requery
Else
MsgBox «Выберите подразделение из списка для удаления», vbExclamation, «Не выбрано подразделение»
End If

К слову, если подать на выполнение такую строку:

strSQL = «DELETE * from tblРайоны;»

то ВСЕ записи в таблице будут удалены! Мы использовали удаление без всяких условий и получим пустую таблицу. Иногда и это нужно 😉

Вот примерчик на обновление записи:

Опять в коде выше игнорируем поле РайонПоУмолчанию, у нас для него припасена отдельная команда:

CurrentDb.Execute «UPDATE tblРайоны SET [РайонПоУмолчанию] = ‘» & Me.lstПодразд.Column(0) & «‘;»

что произойдет? во ВСЕ записи таблицы в поле РайонПоУмолчанию добавится значение из первого столбца списка lstПодразд. Но это то, мне и нужно было, если Вам необходимо обновить поле только в определенной записи, дополните эту инструкцию SQL условием WHERE.

Т.е. мы запросто можем обновлять и сразу весь столбец таблицы — поле во всех записях таблицы сразу!

Раньше мы заранее формировали инструкцию SQL в переменной strSQL, а в этом примере скармливаем методу .Execute непосредственно. Никаких различий в исполнении не будет, но, уверяю Вас, формирование строки заранее в переменной удобнее — можно посмотреть составленную инструкцию SQL командой MsgBox strSQL (перед передачей ее на выполнение) или распечатать ее для анализа в окне Immediate в режиме пошаговой отладки — ? strSQL. И с точки зрения оформления кода использование переменных более «правильно» ;).

А если нам сначала надо проверить, есть ли такая запись в таблице, и если есть, тогда обновить, а если нет, тогда добавить новую запись? Нет проблем, все решается тривиально:

Сначала мы пытаемся найти с помощью функции DLookup найти запись с искомым значением поля КодНарушения и если получаем NULL (функция DLookup вернула NULL), тогда удовлетворяющего значения поля не найдено — переходим к добавлению новой записи, иначе, если поле с таким значением в таблице где-то есть, переходим к обновлению. От функции DLookup нам требуется лишь подтверждение — найдено или нет искомое значение в указанном поле таблицы (конечно, искать необходимо только по полю с уникальными значениями (КодНарушения), чтобы избежать неоднозначности.

Засим откланиваюсь и надеюсь, что пелену тумана над непонятными инструкциями SQL немного развеял. Если что-нибудь интересное встречу или вспомню, обязательно добавлю. Теперь Ваше время экспериментировать — в инструкциях SQL удивительно сочетаются и мощь и удобство и простота. Не забывайте заглядывать в справочную систему 😉

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 можно так:

Читать еще:  Техподдержка офис 365

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, которая умеет работать с именами элементов управления:

Ссылка на основную публикацию
Adblock
detector