2016-04-10 3 views
3

В базе данных My Access есть макрос autoexec, который открывает главное меню (Форма). Все необходимые функции - это меню (форма) -контролируемое, и я хочу скрыть окно доступа, чтобы отображались только формы. Я ссылался на http://www.tek-tips.com/faqs.cfm?fid=2562, но это не работает с более поздними версиями. Есть ли фрагмент, который будет работать для Access 2007-2013?Скрыть окно доступа при открытии формы

+0

Я не уверен, что это сделал, но это сработало. спасибо –

ответ

1

Это код, я бегу в моем Acc 2003 и 2007 Apps, работает в 2010 среде:

Private Sub Form_Load() 
    'Hide Data-Base Window: 
    DoCmd.SelectObject acTable, , True 
    DoCmd.RunCommand acCmdWindowHide 
    '...Other Actions... 
end sub 

Для скрытия ленты в 2007 году и выше, использование этой линии я нашел here:

DoCmd.ShowToolbar "Ribbon", acToolbarNo 
+0

Это идеально. Просто простая команда. Я искал другую подобную команду, чтобы скрыть ленту, но ничего не мог найти. Это возможно? –

+1

@Robert Kendall Я добавил строку кода к ответу – marlan

2

Это то, что я использую, который работает до 2016 года:

Option Compare Database 
Option Explicit 

'''HIDE WINDOW MODULE 
'''USE THIS TO ACTIVATE HIDE WINDOW MODULE 
''' SixHatHideWindow(SW_SHOWMINIMIZED) 

Global Const SW_HIDE = 0 
Global Const SW_SHOWNORMAL = 1 
Global Const SW_SHOWMINIMIZED = 2 
Global Const SW_SHOWMAXIMIZED = 3 

Private Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 

Function SixHatHideWindow(nCmdShow As Long) 
    Dim loX As Long 
    Dim loForm As Form 
    On Error Resume Next 
    Set loForm = Screen.ActiveForm 

    If Err <> 0 Then 
     loX = apiShowWindow(hWndAccessApp, nCmdShow) 
     Err.Clear 
    End If 

    If nCmdShow = SW_SHOWMINIMIZED And loForm.Modal = True Then 
     MsgBox "Cannot minimize Access with " _ 
     & (loForm.Caption + " ") _ 
     & "form on screen" 
    ElseIf nCmdShow = SW_HIDE And loForm.PopUp <> True Then 
     MsgBox "Cannot hide Access with " _ 
     & (loForm.Caption + " ") _ 
     & "form on screen" 
    Else 
     loX = apiShowWindow(hWndAccessApp, nCmdShow) 
    End If 
    SixHatHideWindow = (loX <> 0) 
End Function 

Чтобы скрыть окно просто: Call SixHatHideWindow(SW_SHOWMINIMIZED)

ТАКЖЕ ПРИМЕЧАНИЕ: В зависимости от того, какая версия то есть 32 бит или 64 бит может понадобиться добавить атрибут PtrSafe так Если у вас возникли проблемы с этим Объявить функции API, как это: Private Declare PtrSafe Function apiShowWindow...

+0

Я вложил это и добавил кнопку для запуска кода: SixHatHideWindow (SW_SHOWMINIMIZED), но я получаю сообщение об ошибке: «Объект не содержит объект автоматизации« SW_SHOWMINIMIZED »« –

+0

Я получил эту ошибку с этим же модулем раньше. Это всегда происходило из-за ошибок компиляции где-то в другом месте. Сделай это; 1. Прокомментируйте этот модуль, который вы только что добавили ... затем скомпилируйте и исправьте любые ошибки, которые могут появиться еще где. Если вы не найдете дополнительных ошибок, кроме тех, которые затем не комментируют модуль и компактны и восстанавливают базу данных. Это должно с надеждой решить проблему. –

+0

Также обратите внимание, что вы должны вызывать функцию в открытом событии формы, которая запускается до события загрузки –

2

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

В этом случае возьмите копию своего файла ACCDB и измените расширение своего файла на ACCDR. Затем, когда вы открываете ACCDR из проводника Windows, Access откроет его в «режиме исполнения». Режим выполнения отключает большинство стандартных параметров пользовательского интерфейса. Например, панель навигации не отображается и не может быть открыта. Также он дает вам минимальную версию ленты; большинство стандартных вариантов ленты исчезли.

Runtime mode имеет другие последствия, которые вы должны исследовать, чтобы убедиться, что он подходит для ваших нужд. Одной из важных проблем является режим выполнения, который выйдет из приложения, когда будет обнаружена необработанная ошибка.

Если режим ACCDR/runtime подходит для вашей конкретной ситуации, это недорогой способ ограничить возможности пользовательского интерфейса базы данных. Однако будьте осторожны, чтобы пользователь мог сделать копию ACCDR и изменить расширение файла обратно на ACCDB, поэтому этот подход может не соответствовать вашим требованиям безопасности.

0

Я пытался выполнить скрытие окна приложения Access и использовать всплывающие формы, которые я мог бы запустить из Outlook. Вот как я столкнулся с этим сообщением. Но я обнаружил, что с 64-битной версией Outlook 2013 на 64-битной Windows 7 даже не требуется функция SixHatHideWindow. Использование следующего кода в Outlook 2013 выполняет то же самое. (Не забудьте добавить ссылку на библиотеку объектов доступа в VBA.) Эта процедура сохраняет заголовок из текущего активного окна Outlook, запускает новый скрытый экземпляр Access (окно приложения не отображается), открывает назначенную базу данных Access, запускает назначенный вид (как видимый), выходит из экземпляра Access, когда форма закрыта, и повторно активирует исходное активное окно Outlook. Я не тестировал это ни в каких других средах, ни в режиме исполнения.

Главное в этом подходе состоит в том, что не требуется вставлять какой-либо специальный код в открытое событие формы в базе данных Access. Весь необходимый код содержится в Outlook VBA. Также не нужно создавать всплывающие и модальные свойства формы базы данных «Да» в базе данных.

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

Примечание: SetWindowPos api устанавливает местоположение и размер главного окна доступа, даже если доступ не отображается. Когда Access будет закрыт, в следующий раз, когда пользователь откроет Access, он снова откроется до размера и положения, заданного командой SetWindowPos api. Это может раздражать пользователей, поэтому SetWindowPos api устанавливает окно приложения Access в полный размер экрана. В следующий раз, когда пользователь откроет Access, он будет увеличен на экране. Могут быть более сложные способы справиться с этим, но этот подход выполняется быстро и легко, и большинство пользователей в любом случае работают с максимальным доступом в большинстве случаев.

Надеюсь, что это поможет кому-то.

Private Declare PtrSafe Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ 
ByVal X As Long, ByVal Y As Long, ByVal cX As Long, ByVal cY As Long, ByVal wFlags As Long) As Long 
Private Declare PtrSafe Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long 
Private Declare PtrSafe Function GetDesktopWindow Lib "user32"() As Long 
Private Type RECT 
     Left As Long 
     Top As Long 
     Right As Long 
     Bottom As Long 
End Type 

Sub OpenAccessFrmProjDetails() 
     Dim accapp As Access.Application 
     Dim HoldCaption As String 
     Dim ScreenRect As RECT 
     Dim ret As Long 
     Dim width As Variant 
     Dim height As Variant 

     'Get the width and height of the screen in pixels 
10 ret = GetClientRect(CLng(GetDesktopWindow()), ScreenRect) 
20 width = ScreenRect.Right - ScreenRect.Left 
30 height = ScreenRect.Bottom - ScreenRect.Top 

     'Get Outlook activewindow caption 
40 HoldCaption = ActiveWindow.Caption 

     'Display the Access database form 
50 Set accapp = New Access.Application 
60 With accapp 
70  .opencurrentdatabase ("C:\Users\pmf\Documents\Programming Development\Access Visibility Testing\Hidden.accdb") 
80  SetWindowPos .hWndAccessApp, 0, 0, 0, width, height, 0 
90  .DoCmd.OpenForm FormName:="frmProjDetails", WindowMode:=acDialog 
100 End With 

110 Set accapp = Nothing 

     'Reactivate Outlook 
120 AppActivate HoldCaption 

110 End Sub 
Смежные вопросы