Метод Close выполняет действие закрытия в Visual Basic. The Close method carries out the Close action in Visual Basic.
Синтаксис Syntax
выражение.Close (ObjectType, ObjectName, Save) expression.Close (ObjectType, ObjectName, Save)
выражение: переменная, представляющая объект DoCmd. expression A variable that represents a DoCmd object.
Параметры Parameters
Имя Name | Обязательный или необязательный Required/Optional | Тип данных Data type | Описание Description |
---|---|---|---|
ObjectType ObjectType | Необязательный Optional | AcObjectType AcObjectType | Константа AcObjectType, представляющая тип закрываемого объекта. An AcObjectType constant that represents the type of object to close. |
ObjectName ObjectName | Необязательный Optional | Variant Variant | Строковое выражение, которое является допустимым именем объекта типа, выбранного аргументом ObjectType. A string expression that’s the valid name of an object of the type selected by the ObjectType argument. |
Save Save | Необязательный Optional | AcCloseSave AcCloseSave | Константа AcCloseSave, указывающая, нужно ли сохранять изменения в объекте. An AcCloseSave constant that specifies whether to save changes to the object. Значение по умолчанию — acSavePrompt. The default value is acSavePrompt. |
Примечания Remarks
С помощью метода Close можно закрыть указанное окно Microsoft Access или активное окно, если не указано определенное окно. You can use the Close method to close either a specified Microsoft Access window or the active window if none is specified.
Если оставить аргументы ObjectType и ObjectName пустыми (для аргумента ObjectType предполагается константа по умолчанию acDefault), Access закрывает активное окно. If you leave the ObjectType and ObjectName arguments blank (the default constant, acDefault, is assumed for ObjectType), Access closes the active window. Если указать аргумент Save и оставить аргументы_ObjectType_ и ObjectName пустыми, необходимо включить запятые аргументов ObjectType и ObjectName. If you specify the Save argument and leave the ObjectType and ObjectName arguments blank, you must include the ObjectType and ObjectName arguments’ commas.
Если у формы есть элемент управления, привязанный к полю, для свойства Required которого задано значение "Да", а форма закрыта с помощью метода Close без ввода данных для этого поля, сообщение об ошибке не отображается. If a form has a control bound to a field that has its Required property set to Yes, and the form is closed by using the Close method without entering any data for that field, an error message is not displayed. Все изменения, внесенные в запись, будут отменены. Any changes made to the record will be aborted. Когда форма закрывается с помощью пользовательского интерфейса, Access отображает оповещение. When the form is closed by using the user interface, Access displays an alert.
Чтобы отобразить сообщение об ошибке, используйте метод RunCommand для вызова команды acCmdSaveRecord перед вызовом метода Close. To display an error message, use the RunCommand method to invoke the acCmdSaveRecord command before calling the Close method. Это приведет к ошибке во время выполнения, если одно или несколько обязательных полей имеют значение NULL. This will cause a run-time error if one or more required fields are Null. Этот способ показан в следующем примере. This technique is illustrated in the following example.
Пример Example
В следующем примере используется метод Close, чтобы закрыть форму Order Review (Проверка заказа), сохранив все изменения в форме, не выполняя запрос. The following example uses the Close method to close the form Order Review, saving any changes to the form without prompting.
Поддержка и обратная связь Support and feedback
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Excel vba закрыть форму
Автор Manunich задал вопрос в разделе Другие языки и технологии
Какой командой можно закрыть форму в Visual basic. и получил лучший ответ
Ответ от Andre Van Herz[гуру]
команда Unload имя_формы, наример: Unload Form2
Иногда при разработке интерфейсов программы с помощью форм пользователя(UserForm) бывает необходимо запретить закрытие формы крестиком. Причин много: например на форме много элементов выбора и пользователь не должен просто закрывать форму крестиком, не выбрав что-то конкретное. Или может форма должна висеть постоянно на листе до тех пор, пока программа не сделает все необходимые действия и т.д.
Варианта два
Вариант 1
Можно просто запретить закрывать форму. Это значит, что после нажатия на крестик ничего не произойдет. Для этого надо перейти в модуль формы и на событие QueryClose прописать такой код:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then ‘CloseMode = 0 — попытка закрыть форму крестиком Cancel = True ‘даем VBA понять, что надо отменить закрытие формы End If End Sub
данный код не даст закрыть форму нажатием на крестик, но если форма выгружается другими методами(вроде Unload) — форма закроется. За это отвечает параметр CloseMode, который может принимать следующие значения:
- или vbFormControlMenu — попытка закрытия формы пользователем через элемент управления крестик
- 1 или vbFormCode — закрытие формы через выгрузку методом Unload
- 2 или vbAppWindows — завершение сеанса Windows(в кодах VBA практически не используется)
- 3 или vbAppTaskManager — завершение программы через диспетчер задач(в кодах VBA практически не используется)
Можно(скорее даже нужно!) дать понять пользователю, что он должен сделать что-то конкретное для закрытия формы и что крестиком это сделать нельзя, чтобы он не нервничал и не пытался завершить работу Excel через Clt+Alt+Delete;
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then ‘CloseMode = 0 — попытка закрыть форму крестиком MsgBox "Вы должны нажать на кнопку в центре, чтобы закрыть форму", vbInformation, "www.excel-vba.ru" Cancel = True ‘даем VBA понять, что надо отменить закрытие формы End If End Sub
Теперь при попытке закрыть форму крестиком пользователь увидит сообщение с инструкцией.
Вариант 2
Но порой надо не просто запретить закрывать форму — но и для эстетики убрать заголовок с крестиком вообще — чтобы не смущал пользователя. Здесь чуть посложнее — придется применить функции API. Код надо будет помещать уже на инициализацию формы(событие Initialize), а не на закрытие(QueryClose). Следующий код необходимо будет поместить в самое начало модуля той формы, меню которой требуется убрать(первой строкой или сразу после строк деклараций, таких как Option Explicit, Option Base, Option Compare Text):
‘константы для функций API Private Const GWL_STYLE As Long = -16& ‘для установки нового вида окна Private Const GWL_EXSTYLE = -20& ‘для расширенного стиля окна Private Const WS_CAPTION As Long = &HC00000 ‘определяет заголовок Private Const WS_BORDER As Long = &H800000 ‘определяет рамку формы ‘Функции API, применяемые для поиска окна и изменения его стиля #If VBA7 Then Private Declare PtrSafe Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function DrawMenuBar Lib "User32" (ByVal hwnd As LongPtr) As Long #Else Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hwnd As Long) As Long #End If
Это константы и функции API, которые и будут делать основную работу по удалению меню. Теперь останется на событие инициализации формы применить все эти функции:
Private Sub UserForm_Initialize() Dim ihWnd, hStyle ‘ищем окно формы среди всех открытых окон If Val(Application.Version) С легкой руки моего старого друга и модератора нашего форума ЮрияМ дополняю статью еще одним кодом. Если на запуск формы применить такой код:
Private Sub UserForm_Initialize() Dim ihWnd, hStyle ‘ищем окно формы среди всех открытых окон If Val(Application.Version) ВАЖНО: Применяя любой из подходов советую заранее продумать как форма будет вообще закрываться, в том числе в режиме отладки программы. Т.к. если просто вставить этот код, то сами же не сможете закрыть форму — только завершением выполнения кода через Run —Reset.
Во вложении найдете все описанные варианты отображения форм:
Tips_Macro_DontCloseFormOnMenu.xls (77,5 KiB, 1 240 скачиваний)
Статья помогла? Поделись ссылкой с друзьями!