web-dev-qa-db-ja.com

フォームを開くときにアクセスウィンドウを非表示にする

My Accessデータベースには、メインメニュー(フォーム)を開くautoexecマクロがあります。必要な機能はすべてメニュー(フォーム)で制御されるため、フォームのみが表示されるようにAccessウィンドウを非表示にしたいと思います。私は http://www.tek-tips.com/faqs.cfm?fid=2562 と呼ばれていましたが、これはそれ以降のバージョンでは機能しません。 Access 2007-2013で機能するスニペットはありますか?

7
Robert Kendall

これは、2010環境で実行しているAcc 2003および2007 Appsで実行するコードです。

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
4
marlan

あなたの目標は、データベースのユーザーが利用できるAccess UI機能を制限することです。スタートアップフォームを介して提供するオプションにそれらを制限したいです。

その場合は、ACCDBファイルのコピーを取り、そのファイル拡張子をACCDRに変更します。次に、WindowsエクスプローラーからACCDRを開くと、Accessは "ランタイムモード"でACCDRを開きます。ランタイムモードでは、ほとんどの標準UIオプションが抑制されます。たとえば、ナビゲーションウィンドウは表示されず、開くこともできません。また、リボンの最小限のバージョンを提供します。標準のリボンオプションの大部分はなくなりました。

ランタイムモードには、ニーズに適しているかどうかを調べるために調査が必要なその他の影響があります。重要な問題の1つは、未処理のエラーが発生したときにランタイムモードがアプリケーションを終了することです。

ACCDR /ランタイムモードが特定の状況に適している場合、データベースのUI機能を制限する安価な方法です。ただし、ユーザーがACCDRのコピーを作成し、ファイル拡張子をACCDBに戻す可能性があるため、このアプローチだけではセキュリティ要件を満たさない可能性があることに注意してください。

3
HansUp

これは私が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..._

3
Anthony Griggs

Accessアプリケーションウィンドウを非表示にし、Outlookから実行できるポップアップフォームを使用することを目指していました。それが私がこの投稿を偶然見つけた方法です。しかし、Windows 7 64ビットのOutlook 2013 64ビットでは、SixHatHideWindow関数も必要ないことがわかりました。 Outlook 2013で次のコードを使用しても同じことを実現できます。 (VBAのAccessオブジェクトライブラリへの参照を追加することを忘れないでください。)この手順では、現在アクティブなOutlookウィンドウからキャプションを保存し、Accessの新しい非表示インスタンス(アプリケーションウィンドウは表示されません)を開始し、指定されたAccessデータベースを開きます。指定されたフォームを(表示されているとおりに)実行し、フォームが閉じられるとAccessインスタンスを終了し、元のOutlookアクティブウィンドウを再びアクティブにします。他の環境でも、ランタイムアクセスでもテストしていません。

このアプローチの優れた点は、Accessデータベースのフォームオープンイベントに特別なコードを挿入する必要がないことです。必要なコードはすべてOutlook VBAに含まれています。また、データベースフォームのポップアップとモーダルプロパティをデータベースで「はい」に設定する必要もありません。

この場合のフォームは、タブコントロールといくつかのサブフォームを持つ複雑なフォームです。フォームがAccess自体から開かれた場合でも、Outlookからの自動化によって開かれた場合でも、すべてが機能しているように見えます。

注:Accessが表示されていなくても、SetWindowPos APIはAccessメインウィンドウの場所とサイズを設定します。 Accessが閉じられると、ユーザーが次回Accessを開いたときに、SetWindowPos APIによって設定されたサイズと位置で再び開かれます。これはユーザーにとって煩わしい場合があるため、SetWindowPos apiはAccessアプリケーションウィンドウをフルスクリーンサイズに設定します。ユーザーが次回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
0
phillfri