web-dev-qa-db-fra.com

Masquer la fenêtre d'accès lors de l'ouverture d'un formulaire

La base de données My Access a une macro autoexec qui ouvre un menu principal (Formulaire). Toutes les fonctions nécessaires sont contrôlées par le menu (formulaire) et je souhaite masquer la fenêtre d'accès afin que seuls les formulaires soient affichés. On m'a référé à http://www.tek-tips.com/faqs.cfm?fid=2562 mais cela ne fonctionne pas avec les versions ultérieures. Existe-t-il un extrait qui fonctionnera pour Access 2007-2013?

5
Robert Kendall

C'est le code que j'exécute dans mes applications Acc 2003 et 2007 fonctionnant dans l'environnement 2010:

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

Pour cacher le ruban en 2007 et plus, utilisez cette ligne que j'ai trouvée ici :

DoCmd.ShowToolbar "Ribbon", acToolbarNo
3
marlan

Il semble que votre objectif est de restreindre les fonctionnalités de l'interface utilisateur d'accès disponibles pour l'utilisateur de votre base de données. Vous voulez les limiter aux options que vous fournissez via votre formulaire de démarrage.

Dans ce cas, prenez une copie de votre fichier ACCDB et remplacez son extension par ACCDR. Ensuite, lorsque vous ouvrez ACCDR à partir de l'Explorateur Windows, Access l'ouvrira en "mode d'exécution". Le mode d'exécution supprime la plupart des options d'interface utilisateur standard. Par exemple, le volet de navigation ne s'affiche pas et ne peut même pas être ouvert. En outre, il vous donne une version très minimale du ruban; la majorité des options de ruban standard ont disparu.

Le mode d'exécution a d'autres conséquences sur lesquelles vous devriez enquêter pour voir s'il correspond bien à vos besoins. Un problème important est que le mode d'exécution quittera l'application lorsqu'une erreur non gérée est rencontrée.

Si le mode ACCDR/runtime convient à votre situation particulière, il s'agit d'un moyen peu coûteux de limiter les fonctionnalités de l'interface utilisateur de la base de données. Attention toutefois, un utilisateur peut créer une copie de ACCDR et redéfinir l'extension de fichier sur ACCDB. Cette approche seule peut ne pas satisfaire à vos exigences de sécurité.

3
HansUp

C'est ce que j'utilise qui fonctionne jusqu'en 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

Pour masquer la fenêtre simplement: Call SixHatHideWindow(SW_SHOWMINIMIZED)

ÉGALEMENT NOTE: En fonction de la version 32 ou 64 bits, vous devrez peut-être ajouter l'attribut PtrSafe. Si vous rencontrez des problèmes avec cela, déclarez la fonction API comme ceci: Private Declare PtrSafe Function apiShowWindow...

3
Anthony Griggs

Je cherchais à masquer la fenêtre de l'application Access et à utiliser des formulaires contextuels que je pouvais exécuter à partir d'Outlook. C'est comme ça que j'ai couru sur ce post. Mais j'ai constaté qu'avec Outlook 2013 64 bits sur Windows 7 64 bits, on n'a même pas besoin de la fonction SixHatHideWindow. L'utilisation du code suivant dans Outlook 2013 accomplit la même chose. (N'oubliez pas d'ajouter une référence à la bibliothèque d'objets Access dans VBA.) Cette procédure enregistre la légende à partir de la fenêtre Outlook actuellement active, démarre une nouvelle instance masquée d'Access (fenêtre d'application non visible), ouvre la base de données Access désignée, exécute le formulaire désigné (visible), ferme l'instance Access lorsque le formulaire est fermé et réactive la fenêtre active Outlook d'origine. Je n'ai pas testé cela dans aucun autre environnement, ni avec Access d'exécution.

L'avantage de cette approche est qu'elle n'exige aucun code spécial inséré dans l'événement open form de la base de données Access. Tout le code nécessaire est contenu dans Outlook VBA. Les propriétés contextuelles et modales du formulaire de base de données ne doivent pas non plus être définies sur "Oui" dans la base de données.

La forme dans ce cas est une forme compliquée avec un contrôle de tabulation et plusieurs sous-formes. Tout semble fonctionner, que le formulaire soit ouvert à partir d'Access lui-même ou via une automatisation à partir d'Outlook.

Remarque: L'API SetWindowPos définit l'emplacement et la taille de la fenêtre principale d'Access même si Access n'est pas visible. Lorsque Access est fermé, la prochaine fois que l'utilisateur ouvrira Access, il rouvrira à la taille et à la position définies par l'api SetWindowPos. Cela pourrait être gênant pour les utilisateurs. L'API SetWindowPos définit la fenêtre de l'application Access en plein écran. La prochaine fois que l'utilisateur ouvrira Access, il sera maximisé sur son écran. Il existe peut-être des moyens plus sophistiqués de gérer cela, mais cette approche est simple et rapide, et la plupart des utilisateurs travaillent avec Access au maximum dans la plupart des cas.

J'espère que cela aide quelqu'un.

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
0
phillfri