Light-electric.com

IT Журнал
79 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access закрыть форму

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.

Читать еще:  Visual c access

Форма нам обычно нужна не сама по себе, а как контейнер для расположенных на ней элементов управления. Обычно элементы управления программным способом создавать не требуется — намного проще и удобнее поместить их на форму в режиме конструктора для формы. В наборе элементов управления для формы предусмотрены как знакомые нам элементы управления — текстовые поля, надписи, кнопки, флажки и переключатели, так и новые элементы — свободная и присоединенная рамки объектов, разрывы страниц, подчиненные формы/отчеты и т.п. В верхнем правом углу 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, которая умеет работать с именами элементов управления:

Технические приемы работы с формами

Закрытие формы из другой формы:

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

DoCmd.Close ‘ закрываем форму frmПример

Приходилось встречать такой наворот — и он нормально работает 🙂

закрыть любую открытую форму, на вопрос о возможном сохранении изменений отвечая «да», не перенося на нее фокус ввода —

DoCmd.Close acForm, «frmПример», acSaveYes

вообще-то, правильно было бы сделать вот так:

If IsLoaded(«frmПример») Then DoCmd.Close acForm, «frmПример», acSaveYes

но для этого надо держать в отдельном модуле функцию IsLoaded:

Public Function IsLoaded(strName As String, Optional lngType As Long = acForm) As Boolean
‘ Is the specified form loaded?
IsLoaded = (SysCmd(acSysCmdGetObjectState, lngType, strName) <> 0)
End Function
крайне рекомендую к включению этой функции во все Ваши проекты, кстати, она поставляется с учебной базой Борей (NorthWind ). Еще не раз пригодится. Сравните стандартную и опубликованные мною функции IsLoaded — оказывается, можно даже и здесь оптимизировать ;). Код взят с англоязычного ресурса.

‘ а вот и стандартная майкрософтовская функция

Function IsLoaded(strFormName As String) As Boolean

‘ IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strFrmName) = acObjStateOpen)

‘ Возвращает значения True, если форма открыта в режиме формы или таблицы

Const conObjStateClosed = 0

Const conDesignView = 0

Читать еще:  Routing and remote access настройка

If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then

If Forms(strFormName).CurrentView <> conDesignView Then

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

Тут необходимо сказать пару вступительных слов слов про коллекцию объектов форм Forms. Все открытые формы автоматически добавляются Access’ом в эту коллекцию. Обратите внимание, в этой коллекции присутствуют только открытые на момент выполнения кода формы. Если форма еще не открыта, произойдет ошибка. Поэтому при любых обращениях к формам используйте для проверки функцию IsLoaded ( см.выше ).

Также используйте префикс форм frm. Потом в коде удобно ориентироваться, также в окнах различных построителей видно — где форма (frm), где таблица (tbl), а где запрос (qry). Если форма подчиненная используйте префикс (fsub). Лично у меня во всех примерах так.

Различные варианты обращения к формам:

Forms!frmПример ‘ стандартная форма обращения — наиболее широко распространена

Forms![Форма Заказа] ‘ если есть пробелы в названии формы — необходимо имя брать в кавычки.

Категорически не рекомендую использовать пробелы в именах при именовании любых объектов!

Forms(«frmПример») ‘ можно и так обращаться, это уже кому как нравится

Forms(0) ‘ можно обращаться и по индексу формы (это же все-таки коллекция).

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

Особенно рьяные фанаты программирования 😉 не рекомендуют использовать русские имена объектов, но у меня за несколько лет проблем в Access не было. Я вот использую такие смешанные англо-русские имена.

Например, открыта текущая форма frmSimple и из нее установим фокус ввода на другую форму

но учтите, что если в коде потом идет, например, DoCmd.Close, то закроется именно форма frmПример, так как команды программного кода исполняются уже в ней (где установлен фокус). Внимательно следите за переводом фокуса из формы в форму.

Forms!frmПример.Requery ‘ обновим набор данных формы, находясь в форме frmSimple.

Чтобы получить список всех свойств и методов для работы с «удаленными» формами, напишите Me. (с точкой), выберите из выпадающего списка (Me. это обращение формы к самой себе) необходимый метод или свойство и перенесите его в обращение к удаленной форме.

Форму Access 2010 Закрыть button

Мне было интересно, есть ли способ узнать, нажата ли форма windows button. Я знаю о свойстве CloseButton, но, похоже, вы можете только включить или отключить его. У меня есть формы, закрывающиеся, когда пользователь переходит через мое приложение, но хотел бы закрыть базу данных только в том случае, если windows close button нажата. Поэтому мне нужно, чтобы событие close различалось, когда я закрываю его с помощью программирования или пользователь закрывает через windows button. Я мог бы использовать булеву проверку, но мне было интересно, есть ли более элегантный способ.

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

2 Ответа

Вот модуль кода для формы, которая включает в себя команду button с именем cmdClose . Форма не может быть закрыта, кроме как по событию cmdClose click. Даже попытка закрыть сам доступ не позволит закрыть форму. и прервет завершение доступа.

Короче говоря, я не думаю, что это способ, но предоставленный код HansUp-это обходной путь. Я отключаю функцию close button вверху, чтобы обеспечить сохранение данных.

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

Я надеялся сделать простую форму в базе данных MS Access 2010, где пользователь может выбрать тему для использования. Как изменить тему базы данных через vba? Google не очень помог с этим вопросом.

Я пытаюсь конвертировать файл accdb из use in Access 2010 в Access 2007. Я сначала попытался открыть файл с Access 2007 и получил ошибку Unrecognized database format . Я смог открыть свой сервер в.

В Delphi 2010 я создаю форму, а затем создаю TFrame, присваиваю TFrame.Parent форме, а затем показываю форму MODALLY. Работать отлично. Рамка имеет DBNavigator, поле DBFields и т. д. Когда.

У меня есть форма InfoPath 2010, которую я создал для отправки данных в базу данных Access 2010. Одним из конкретных элементов захвата является сотрудник ID. Таким образом, база данных может иметь.

У меня есть простой экран login в C#, где пользователь нажимает Login, и появляется другое окно с надписью welcome и работает, когда я создаю / запускаю Visual Studio. Вот этот код using System;.

У меня есть переднее / заднее приложение в MS Access, и у меня возникли некоторые проблемы с производительностью при закрытии форм. Эти формы всегда сохраняются перед закрытием, потому что в.

Моя команда работала с access 2000, где у нас есть наш проект MDB. Это приложение (ERP) может открыть около 20 форм доступа. После того, как мы решим перенести всю нашу систему в Access 2010 в ее.

Я унаследовал базу данных Access, которая используется для импорта некоторых данных в SQL. MDB открывается с помощью формы, в модальном режиме: ни меню доступа, ни кнопки не видны. Я могу.

В Access 2007 у меня есть кнопка, которая открывает форму в диалоговом режиме (modal и popup установлены в true). Я пытаюсь сохранить данные из этой формы и затем закрыть эту форму вот так: Private.

Читать еще:  Access create table

Макрокоманда «закрытьокно»

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

С помощью макрокоманды закрытьокно можно закрыть вкладку указанного Access документа или вкладку активного документа, если не указан.

Примечание: Начиная с Access 2010 макрокоманда Закрыть переименована закрытьокно.

Примечание: Макрокоманда «ЗакрытьОкно» недоступна в веб-приложениях Access.

Настройка

Макрокоманды закрытьокно аргументы описаны ниже.

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

Примечание: При закрытии модуля в редакторе Visual Basic необходимо использовать элемент Модуль в аргументе Тип объекта.

Имя объекта, который нужно закрыть. В поле Имя объекта указаны все объекты базы данных, относящиеся к типу, заданному аргументом Тип объекта. Щелкните объект, который нужно закрыть. Если аргумент Тип объекта оставлен пустым, этот аргумент тоже должен быть пустым.

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

Заметки

Макрокоманды закрытьокно работает на всех объектов базы данных, которые пользователь явным образом можно открыть или закрыть. Это действие действует так же, как при выборе объекта и его закрытия, щелкните правой кнопкой мыши вкладку документа объекта и затем нажмите кнопку Закрыть в контекстном меню или щелкните Закрыть кнопка объекта.

Если для аргумента Сохранение задано значение По выбору и объект не был сохранен перед выполнением макрокоманды Закрыть, открывается диалоговое окно, в котором пользователю предлагается сохранить объект перед закрытием. Если в макрокоманде УстановитьСообщения для аргумента Включить сообщения задано значение Нет, диалоговое окно не появляется и объект сохраняется автоматически.

Для запуска макрокоманды закрытьокно в модуле Visual Basic для приложений (VBA), используйте метод Закрыть объекта DoCmd .

Access закрыть форму

193 просмотра

2 ответа

66 Репутация автора

У меня есть основная форма с именем Calling. У него есть кнопка с названием Travel. Эта кнопка Travel делает:

Форма Информация о путешествии работает правильно. Эта форма Путешествия имеет кнопку Закрыть с кодом:

При нажатии код закрытия генерирует «Ошибка во время выполнения« 361 »: невозможно загрузить или выгрузить этот объект.

Ваша помощь очень ценится.

Ответы (2)

2 плюса

1382 Репутация автора

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

Если оставить этот аргумент пустым, форма откроется в режиме данных, установленном разрешениями AllowEdits, AllowDeletions, AllowAdditions и DataEntry (в свойствах формы).

Что касается следующей подпрограммы, я бы использовал docmd.close вместо выгрузки.

me.undo Не является обязательным, если вы не хотите , чтобы сохранить, и если вы хотите сохранить форму изменить acSaveNo к acSaveYes .

Я только что перечитал ваш вопрос и заметил в заголовке, без чего вы хотите docmd .

Я думал об этом, и docmd это стандартный способ закрытия форм в доступе с использованием VBA. Я не уверен, если вы унаследовали unload от использования VB, но я бы придерживался docmd.close при использовании доступа.

Автор: LiamH Размещён: 19.05.2016 02:32

плюса

11 Репутация автора

«Unolad me» просто не работает в объектах формы доступа. Access хочет, чтобы вы использовали DoCmd.Open/DoCmd.Close, но вы умны и можете использовать объект формы доступа в качестве объекта. Имена доступа, которым классы форм ставят префикс имени, которое вы им даете с помощью «Form_». Вы создаете форму с именем «YourForm», Access создает класс «Form_YourForm». Используйте этот класс как реальный объект:

Кроме того, вы можете использовать Form_YourForm непосредственно как переменную объекта, потому что VBA Access просто «неявно» создает этот объект из класса Form_YourForm при первом его использовании или при использовании DoCmd.Open. (Да, это немного сбивает с толку, но Access был создан для пользователей, у которых не обязательно были навыки программиста). Однако вы будете получать разные экземпляры класса Form_YourForm каждый раз, когда будете использовать переменный объект, типизированный как любой из классов форм, существующих в вашем проекте. Это означает, что вы можете открыть столько экземпляров формы, сколько захотите . или пока она умещается в памяти вашего компьютера. Вы не можете сделать это, используя DoCmd.Open.

Основными «недостатками» является то, что вам приходится обрабатывать объект формы из другого модуля. Вы по-прежнему можете использовать коллекцию «Формы», но, поскольку вы не знаете заданный ключ, вы не можете легко получить доступ к экземпляру формы. Кроме того, вы не можете закрыть форму из ее собственного кода, а только располагать типизированную переменную (Set f = nothing).

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector