Объект Форма (Form) (Access)
Объект Форма (Form) ссылается на конкретную форму Microsoft Access.
Примечания
Объект Форма является членом коллекции ** Формы **, которая представляет собой набор всех открытых в настоящее время форм. Внутри коллекции Формы отдельные формы индексируются, начиная с нуля. Вы можете сослаться на отдельный объект Форма в коллекции Формы либо с помощью ссылки на форму по имени, или с помощью ссылки на индекс формы в коллекции.
Если вы хотите сослаться на конкретную форму в коллекции Формы, лучше всего ссылаться на форму по имени, так как индекс формы в коллекции может измениться. Если имя формы содержит пробел, имя нужно заключать в квадратные скобки ([ ]).
Синтаксис | Пример |
---|---|
AllForms!имя_формы | AllForms!OrderForm |
AllForms![ имя_формы] | AllForms![Order Form] |
AllForms(«имя_формы«) | AllForms(«OrderForm») |
AllForms(index) | AllForms(0) |
Каждый объект Форма имеет коллекцию Элементы управления, которая содержит все элементы управления для формы. Вы можете сослаться на элемент управления для формы явно или неявно, используя ссылку на коллекцию Элементы управления. Код будет выполняться быстрее, если вы сошлетесь на коллекцию Элементы управления неявно. В следующих примерах показаны два способа, с помощью которых вы можете сослаться на элемент управления с именем NewData для формы, которая называется OrderForm.
В следующих двух примерах показано, как вы можете сослаться на элемент управления с именем NewData для подчиненной формы ctlSubForm, которая содержится в форме, которая называется OrderForm.
Пример
В приведенном ниже примере показано, как использовать элемент управления TextBox для задания условий отбора даты для запроса.
В приведенном ниже примере показано, как использовать событие BeforeUpdate формы для введения требования, согласно которому значение должно быть указано для одного элемента управления, если другой элемент управления также содержит данные.
В приведенном ниже примере показано, как использовать свойство OpenArgs для предотвращения открытия формы из области навигации.
В следующем примере показано, как использовать аргумент WhereCondition метода OpenForm, чтобы отфильтровать записи, отображаемые в форме при ее открытии.
Мероприятия
Методы
Свойства
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
12.5 Работа с формами Access из VBA (объект Form )
Объект Access.Form, работа с формами Access средствами VBA, открытие формы Access, работа с элементами управления на форме Access
Один из важнейших элементов Access, который широко используется в приложениях — это формы. Формы Access предназначены для того же, для чего и обычные формы VBA — это прежде всего контейнеры для графических элементов управления. Но устройство форм Access, их функциональные возможности, приемы работы с ними и даже наборы элементов управления, которые на них можно размещать, сильно отличаются от привычных нам форм VBA, которые можно использовать в Word и Excel.
Формы Access используются:
Как работать с формами 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 спрятаны от пользователя
Если все-таки нужно открыть форму программным способом (например, из другой формы), то для этой цели можно использовать метод DoCmd.OpenForm(). В самом простом варианте этот метод просто принимает параметр с именем формы:
Если же форма уже открыта, то этот метод, конечно, не открывает форму заново, а просто активизирует ее. Метод DoCmd.OpenForm() принимает также несколько необязательных параметров, при помощи которых вы можете настроить фильтр на отображение записей в форме, режим открытия формы (например, модальность) и т.п. Закрытие формы производится при помощи метода DoCmd.Close(). Если же вам нужно просто спрятать форму, чтобы сохранить введенные на ней пользователем значения и отобразить их при следующем показе, можно просто сделать форму невидимой, назначив ее свойству Visible значение False.
Форма нам обычно нужна не сама по себе, а как контейнер для расположенных на ней элементов управления. Обычно элементы управления программным способом создавать не требуется — намного проще и удобнее поместить их на форму в режиме конструктора для формы. В наборе элементов управления для формы предусмотрены как знакомые нам элементы управления — текстовые поля, надписи, кнопки, флажки и переключатели, так и новые элементы — свободная и присоединенная рамки объектов, разрывы страниц, подчиненные формы/отчеты и т.п. В верхнем правом углу Toolbox в конструкторе формы Microsoft Access находится специальная кнопка Мастера. Если она нажата, то добавление на форму привычных элементов управления (например, кнопки) приведет к появлению окна мастера, который попытается помочь вам автоматически сгенерировать нужный код VBA для этого элемента управления (см. рис. 12.3)
Рис. 12.3 Мастер создания кнопок
Можно использовать генерируемый мастером код как заменитель макрорекордера (которого в Access нет), чтобы понять, как можно выполнить те или иные действия.
Для чего используются нестандартные (по отношению к обычным формам VBA) элементы управления:
Например, предположим, что в нашей базе данных 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, которая умеет работать с именами элементов управления:
Как обратиться к полю формы или подчиненной формы
Q1: Как обратиться к объекту формы?
Q2: Как обратиться к объекту формы, имя которого вычисляется на лету или содержит специальные символы?
Q3: Как обратиться к объекту подчиненной формы?
Q4: Обращение к объекту формы из контекста этой формы.
Чтобы прочитать или изменить содержимое или свойство объекта формы, в первую очередь надо составить выражение, позволяющее однозначно определить ссылку именно на этот объект.
Q1. Обращение к объекту формы
Обратите внимание, что операторы «!» и «.» идут через один. Чередуются имена коллекций и их элементов, причем оператор «!» означает, что справа от него указан элемент коллекции, а оператор «.» служит для обращения к свойству этого элемента (см. пп. 3.5 и 3.6).
Серым цветом здесь и далее выделены коллекции и свойства, используемые Access’ом по умолчанию. Их также можно опускать, если при этом не возникнет двусмысленности. То есть выражение (1) может быть записано по-другому:
Q2. Обращение к объектам, имена которых вычисляются «на лету» или не соответствуют «соглашению об именах»
В выражении (1), разделенные оператором «.», перечисляются связки типа
Любую из этих связок можно переписать в виде
где в качестве аргумента может быть указано любое выражение, возвращающее значение типа String, соответствующее имени существующего элемента коллекции, а также
Q3. Обращение к объекту подчиненной формы
является ссылкой на элемент управления, в котором выводится подчиненная форма. А
является ссылкой на саму подчиненную форму. Указание свойства Form для ссылки на подчиненную форму или на ее свойства является обязательным для MS Access версии 97 и желательным для версий 2000-2003.
Аналогичным образом, с помощью вставки выражений типа
), строятся выражения для подчиненных форм третьего и далее уровней вложености.
Q4. Обращение к объекту формы из контекста этой формы
Для ссылки на текущий экземпляр объекта, в котором в данное время выполняется программа, рекомендуется использовать ключевое слово Me. Все процедуры, связанные с текущим объектом, имеют доступ к объекту, указываемому с помощью слова Me. Пример использования слова Me в модуле формы, содержащей поле Поле1:
1. Построитель выражений некоторых русифицированных версий Microsoft Access автоматически ставит несуществующую инструкцию [Форма] вместо [Form]. Для корректной работы программы следует вручную исправить полученное выражение.
2. Некоторые построители выражений обособляют все названия полей и форм, а также ключевые слова квадратными скобками, например так:
6. Совпадающие наименования полей, переменных, полей данных.
В системе помощи Microsoft Access описаны довольно обширные правила наименования объектов, суть которых сводится к рекомендации давать уникальные имена полям таблиц, самим таблицам, формам, переменным, функциям и пр. Причем имена не должны совпадать с длинным перечнем зарезервированных слов. Эти правила можно нарушить, но тогда вы будете действовать на свой страх и риск.
7. Ускорение работы программ.
Кроме того, если в некотором фрагменте кода встречаются две и более ссылок на некоторый объект, присвойте его объектной переменной или используйте блок With. Каждый раз, когда вы ссылаетесь на объект, Access’у приходится выяснять, к какому объекту относится ссылка, что приводит к выполнению лишней работы. Но если, например, присвоить ссылку на объект переменной, Access ищет объект всего один раз и кэширует ссылку на него в памяти.
Имейте в виду, что в случае с объектной переменной после окончания использования ее следует очистить:
Set objVar = nothing
9. Все вышесказанное в равной мере относится и к отчетам, если заменить все вхождения ключевых слов Form и Forms на Report и Reports.
Допустим, есть форма [Главная], содержащая подчиненную форму [Подчиненная]. Приведу несколько способов обращений к полям и свойствам подчиненной формы.
1. Значение поля [Поле1]
Поле подчиненной формы! Как же к нему обратиться?
Пишет: Объект не поддерживает это свойство или метод! Причем Requery работает само нормально
Пробовал еще вариант:
Forms![Основная].Controls![Графика].SetFocus
Forms![Основная].Controls![Графика]![Поле217].SetFocus
Forms![Основная].Controls![Графика]![Поле217].value=»значение»
Объединение вертикальных полей подчиненной формы в одно поле главной формы
Доброго времени суток уважаемые форумчане! Подскажите пож-та каким образом можно объединить поля.
Поле подчиненной формы
Сделал базу больницы по заданию, и столкнулся с проблемой, нужно чтобы поле из подчиненной формы.
Пишет что поле не найдено
Добавлено через 7 минут
Вы хотите сказать, что при обращении к полю подчиненной формы, которая находится на основной, не нужно указывать подчиненную?
Если опять не так, выкладывайте базу и точно объясняйте куда смотреть и что нажимать
Добавлено через 2 минуты
Вложения
Database11.accdb.zip (19.8 Кб, 13 просмотров) |
Вложения
Database11_v1.zip (20.6 Кб, 27 просмотров) |
Все заработало! Огромное спасибо.
Добавлено через 4 часа 15 минут
А возможно ли обратиться к Поле12 подчиненной формы с запроса напрямую? Сейчас это делаю через передачу значения на основную
Вложения
Database11_v002.zip (24.5 Кб, 17 просмотров) |
Вложения
Database11_v2.zip (23.0 Кб, 7 просмотров) |
А что должно происходить.
Вы пытаетесь закрыть подчинённую форму!
Вычисляемое поле из подчиненной формы
Есть две формы, одна главная, одна подчиненная. На главной форме добавляю поле количество.
Запрос не видит поле подчиненной формы
SELECT Forms. Цена+ Forms. Form.+ Forms. Form.+ Forms. Form. AS Выражение1; Вроде все.
Вставка данных в поле формы из подчиненной
Уважаемые форумчане! Здравствуйте! Подскажите, пожалуйста, как реализовать следующее: после.
Запрет ввода в поле подчиненной формы
Здравствуйте. Делаю в Аксесс форму для ввода данных с подчиненной формой. На главной форме есть.
Свойство SubForm.LinkMasterFields (Доступ)
Вы можете использовать свойство LinkMasterFields (наряду с свойством LinkChildFields), чтобы указать, как microsoft Access связывает записи в форме или отчете с записями в подформе, подзащите или встроенном объекте, например на диаграмме. Если эти свойства установлены, Access автоматически обновляет связанную запись в подформе при изменении новой записи в основной форме. Для чтения и записи, String.
Синтаксис
выражения. LinkMasterFields
выражение Переменная, представляюная объект SubForm.
Заметки
Свойства LinkChildFields и LinkMasterFields можно настроить следующим образом:
Для этих свойств можно использовать ссылку Subform/Subreport Field Linker, выбрав кнопку Сборка справа от поля свойств в листе свойств.
Свойства можно установить только в представлении Design или во время открытого события формы или отчета.
Поля или элементы управления, которые используются для набора этих свойств, не должны иметь одинаковые имена, но они должны содержать такие же данные и иметь одинаковый или совместимый тип данных и размер поля. Например, поле AutoNumber совместимо с полем номеров, если свойство FieldSize для поля Номер установлено для Long Integer.
Для набора свойства LinkMasterFields можно использовать имя управления (включая имя вычисляемого управления), но нельзя использовать имя управления для набора свойства LinkChildFields. Если вы хотите использовать вычисляемую величину в качестве ссылки для подформы, субрепорта или встроенного объекта, определите вычисляемую область в основном запросе объекта ребенка и установите свойство LinkChildFields в поле.
При указании нескольких полей или имени элементов управления для этих параметров свойств необходимо ввести одинаковое количество полей или элементов управления для каждого параметра свойств и отделить имена с ;).
При создании подформы или подрепортации путем перетаскивание формы или отчета из окна базы данных в другую форму или отчет или с помощью мастера форм Access автоматически задает свойства LinkChildFields и LinkMasterFields в следующих условиях:
И основная форма, и отчет, и детский объект основаны на таблицах, и связь между этими таблицами определена с командой Relationships. Access использует поля, которые связывают эти две таблицы в качестве связующих полей.
Основная форма или отчет основаны на таблице с основным ключом, а подформа или подрепортация основана на таблице или запросе, содержаном поле с тем же именем и тем же типом или совместимым типом данных в качестве основного ключа. В качестве ссылок используется основной ключ из основной таблицы основного объекта и одинаково названное поле из основной таблицы или запроса детского объекта.
Поля ссылок не должны быть включены в основной объект или в детский объект. До тех пор, пока они содержатся в таблицах или запросах, можно использовать поля для привязки объектов. При использовании мастера access автоматически включает поля ссылок.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.