Excel用户窗体和windows.visible

我需要一些帮助完成这个项目。

我创build了一个用户表单,它充当一个数据input表单,并运行各种报表,工作正常。 用户窗体打开Workbook_Open事件,我需要隐藏工作簿,因为用户有打破它的习惯!

Application.visible = false作品,但是,当用户打开其他工作簿并closures它们,用户窗体的父工作簿也closures或隐藏用户窗体,我不知道如何防止它。

我已经尝试了一些API调用,但是在工作簿closures或隐藏(包含表单)的情况下,我仍然遇到同样的问题。

有没有人设法find正确的API,使用户窗体看起来或作为一个独立的应用程序,例如打开没有工作簿是可见的,允许其他工作簿/程序来到前面,允许用户select父工作簿/用户窗体在任务栏需要时,在上一个工作簿closures时不会隐藏或closures。

如果任何人都可以指向正确的方向或列出API调用,我真的很感激。 我正在使用Excel 2013。

非常感谢

皮特

过去我也有类似的问题,我想我有你想要的答案。

首先,我会做的是创build一个虚拟文件,而不是你想打开的工作簿。 当该工作簿打开时,它应该创build一个新的Excel实例,使其可见并打开您想要的最小化状态的实际工作簿,然后closures本身。 此过程将确保目标工作簿是在应用程序中打开的唯一工作簿。

要防止其他工作簿在同一应用程序中打开,请在VBA中使用一个Class Module。 声明一个应用variablesWithEvents,例如: Public WithEvents thisApp As Application

然后,您可以捕获WorkbookOpen事件(在打开另一个工作簿时触发),并采取适当的措施。 我倾向于这样做,捕捉新打开的工作簿的path,closures它,打开Excel的另一个实例,并在那里打开工作簿。

当你阅读代码时,这应该是有意义的:

 Private Sub thisApp_WorkbookOpen(ByVal Wb As Workbook) Dim xWB As Workbook, xApp As Excel.Application, xPath As String Application.Visible = False xPath = Wb.FullName Wb.Close Set xApp = New Excel.Application xApp.Visible = True xApp.Workbooks.Open xPath xApp.Windows(1).Activate Set xApp = Nothing End Sub 

不同之处在于,您不希望使应用程序不可见,因为这意味着用户无法从任务栏重新激活该应用程序。 我有一个快速的发挥,似乎很棘手的问题是,从任务栏中select工作簿时,要显示窗体并最小化应用程序。 (我认为这是可能的,但这将意味着隐藏表单并再次显示,这可能会与其他代码冲突。)我会build议在工作表中添加一个首页选项卡,并可能使数据选项卡对用户不可见。 这应该足以阻止他们打破它。

感谢您的所有帮助和想法,但我已经解决了一个更简单(尽pipe不是完美)的解决scheme。 我首先尝试使它成为@Sunbuild议的一个addinn,但是这在开启excel的第一个实例时引发了问题。

在ThisWorkbook模块中,我使用Public WithEvents App As Application来创build公共应用程序级别的事件处理程序。

这个想法是简单地保持Excel工作簿在任何时候最小化。

其次是:

  Private Sub App_WorkbookActivate(ByVal Wb As Workbook) 'Check wb is workbook strThisWkBk then make sure window is minimized If Wb.Name = strThisWkBk Then With Wb.Windows.Application .WindowState = xlMinimized End With frmAddVouchersTab.Show vbModeless End If End Sub 

  Private Sub App_WindowResize(ByVal Wb As Workbook, ByVal Wn As 'Check wb is workbook strThisWkBk then make sure window is minimized. _ Using WindowResize to prevent user from trying to maximise If Wb.Name = strThisWkBk Then Application.ScreenUpdating = False 'Speed up execution If Not Wn.WindowState = xlMinimized Then Wn.WindowState = xlMinimized frmAddVouchersTab.Show vbModeless Application.ScreenUpdating = True End If End Sub 

这一切似乎工作,但有一些我很确定我可以弄清楚的小问题。 例如在With块,我试图添加代码的大小和地方最小化的窗口只是作为一个额外的措施,但这是行不通的。