打开表单时隐藏访问窗口

时间:2016-04-10 09:33:44

标签: vba ms-access access-vba

我的Access数据库有一个autoexec宏,可以打开一个主菜单(Form)。所有必要的功能都是菜单(窗体)控制,我想隐藏访问窗口,以便只显示表单。我被引用http://www.tek-tips.com/faqs.cfm?fid=2562但这不适用于更高版本。是否有适用于Access 2007-2013的片段?

5 个答案:

答案 0 :(得分:4)

这是我在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

答案 1 :(得分:3)

这是我使用到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...

答案 2 :(得分:3)

您的目标似乎是限制数据库用户可以使用的Access UI功能。您希望将它们限制为通过启动表单提供的选项。

在这种情况下,请复制您的ACCDB文件并将其文件扩展名更改为ACCDR。然后,当您从Windows资源管理器中打开ACCDR时,Access将以“运行时模式”打开它。运行时模式会抑制大多数标准UI选项。例如,导航窗格未显示,甚至无法打开。它还为您提供了一个非常小的功能区版本;大多数标准功能区选项都消失了。

运行时模式还有其他后果,您应该调查一下它是否适合您的需求。一个重要的问题是运行时模式将在遇到未处理的错误时退出应用程序。

如果ACCDR /运行时模式适合您的特定情况,则这是一种限制数据库UI功能的廉价方法。但是,请注意,用户可以复制ACCDR并将文件扩展名更改回ACCDB,因此单独使用此方法可能无法满足您的安全要求。

答案 3 :(得分:0)

我正在寻求完成隐藏Access应用程序窗口并使用我可以从Outlook运行的弹出窗体。这就是我在这篇文章中遇到的问题。但我发现在Windows 7 64bit上使用Outlook 2013 64bit甚至不需要SixHatHideWindow功能。在Outlook 2013中使用以下代码完成相同的任务。 (不要忘记在VBA中添加对Access对象库的引用。)此过程从当前活动的Outlook窗口保存标题,启动一个新的隐藏Access实例(应用程序窗口不可见),打开指定的Access数据库,运行指定的表单(如可见),在窗体关闭时退出Access实例,并重新激活原始Outlook活动窗口。我没有在任何其他环境中测试过这个,也没有使用运行时访问。

这种方法的好处在于它不要求在Access数据库中的表单open事件中插入任何特殊代码。所有必需的代码都包含在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

答案 4 :(得分:0)

中查看此解决方案

https://msaccess.erpmakers.com/Articles_MSAccess/0013-how%20to%20hide%20all%20access%20objects%20including%20navigation%20menu%20and%20ribbon%20using%20microsoft%20access%20vba.php

我对 acees 2016 的解决方案进行了一些改动,测试了它的工作

我在模块中插入内容并在手动创建的宏ExcAuto中调用函数<ol id="ol"> <li>foo</li> <li>bar</li> <li>bat</li> <li>baz</li> </ol>

接下来,在vba编辑器中编译所有代码->调试->编译并验证所有代码vba中没有一个空子程序,以避免在acccde中转换acccdb不成功

但是我在第一次打开 accde 文件时遇到问题,它工作正常,但是对于所有下一个打开的文件,出现了主页和文件选项卡

在网上搜索并在本地测试代码并找到此解决方案后

'注释两条指令

IMPORTRANGE

'并用此指令替换

DoCmd.ShowToolbar "Ribbon", acToolbarNo

你可以对两者做同样的事情,就像代码第一方的两条指令一样,条件为真